BAEK_17837_새로운게임2 (미해결)

BAEKJOON

17837. 새로운게임2

이것은 미해결 된 문제입니다.

history

1번의 런타임 에러 (package 실수) 와7번의 오답 기록을 보유했다.
‘못 푼 문제를 왜 올리냐’ 라고 할 수도 있지만 너무 억울하고 도저히 해결방법을 찾을 수 없어서…
그렇다고 내가 열심히 풀어본 내새끼를 버릴 순 없어서
백준에서 안받아주니까 여기서라도 맘껏 제출하려고 올려본다.
누구든지 할 일없고 시간 많으면 이 문제를 해결해주세요.. 제발…

예상컨데 아주 작은 실수일 것 같다.
테스트 케이스는 모두 맞는데 7% 에서 멈추는 것은 내가 모르고 지나친 조건이 있을 것이다.

처음엔 틀린 부분을 찾아서 고쳤다.
if( count < 1000 ) 인데 if( count <= 1000 ) 라고 했던 것을 고쳤고,
` 1 / 2 / 3 ` 에서 2 번 말을 옮길 경우 ` 2 / 3 ` 만 옮기는 것인데 다 옮겼었고,
이 친구들을 고치고 나서 제출했을 때 받았던 틀렸습니다 는 이전보다 더 충격적이었다.

하지만 계속해서 문제를 찾기 위해 노력했다. 위의 실수(실수가 반복되면 실력 ^^) 들을 처음엔 못찾았던 것 처럼,
분명히 작은 실수(나의 실력 ^^) 가 숨어있는데 말이야…

gif
결국 시간을 들여서 직접 해보기까지 했는데 (재밌었다)
디버깅 출력 찍은 것과 일치했으며 난 잠정적 포기를 하기로 했다.
조금 더 머리를 새롭게 세척한 후에 다시 도전해보려고 한다.
이상 나의 기나긴 실패(성공의 어머니) 이야기였다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {
	static final int RIGHT = 1, LEFT = 2, UP = 3, DOWN = 4;
	static final int WHITE = 0, RED = 1, BLUE = 2;

	static int N, K, map[][];
	static int dir[][] = { {}, { 0, 1 }, { 0, -1 }, { -1, 0 }, { 1, 0 } };

	static HashMap<Integer, ArrayList<Integer>> info;
	static List<Integer> subStack;
	static Marker markers[];

	static StringTokenizer st;

	public static void main(String[] args) throws Exception {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		st = new StringTokenizer(in.readLine());

		N = Integer.parseInt(st.nextToken());
		K = Integer.parseInt(st.nextToken());

		map = new int[N + 1][N + 1];

		info = new HashMap<>();
		markers = new Marker[K + 1];

		for (int i = 1; i <= N; i++) {
			st = new StringTokenizer(in.readLine());
			for (int j = 1; j <= N; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
				info.put(i * 100 + j, new ArrayList<Integer>());
			}
		}

		for (int i = 1, r = 0, c = 0, d = 0; i <= K; i++) {
			st = new StringTokenizer(in.readLine());
			r = Integer.parseInt(st.nextToken());
			c = Integer.parseInt(st.nextToken());
			d = Integer.parseInt(st.nextToken());
			markers[i] = new Marker(i, r, c, d);
			info.get(key(r, c)).add(i);
		}

		int count = 0;

		while (count++ < 1000) {
			for (int i = 0; i < args.length; i++) {

			}
			for (Marker m : markers) {
				if (m == null)
					continue;
				if(move(m)) {
					System.out.println(count);
					return;
				}
			}
		}
		System.out.println(-1);

	}

	private static boolean move(Marker m) {

		int dr, dc, dkey;
		dr = m.r + dir[m.d][0];
		dc = m.c + dir[m.d][1];
		dkey = key(dr, dc);

		// blue or out
		if (!check(dr, dc) || map[dr][dc] == BLUE) {
			m.d = change(m.d);
			dr = m.r + dir[m.d][0];
			dc = m.c + dir[m.d][1];
			dkey = key(dr, dc);
		}

		if (!check(dr, dc)) {
			dr = m.r;
			dc = m.c;
			dkey = m.key;
			m.d = change(m.d);
		} else {

			switch (map[dr][dc]) {
			case WHITE:
				subStack = stackSplit(m.key, m.index);
				info.get(dkey).addAll(subStack);
				info.get(m.key).removeAll(subStack);
				break;
			case RED:
				subStack = stackSplit(m.key, m.index);
				for (int i=subStack.size()-1; i>=0; i--) {
					info.get(dkey).add(subStack.get(i));
				}
				info.get(m.key).removeAll(subStack);
				break;
			case BLUE:
				dr = m.r;
				dc = m.c;
				dkey = m.key;
				m.d = change(m.d);
				break;
			}
		}
		
		
		m.r = dr;
		m.c = dc;
		m.key = dkey;
		
		if(4<=info.get(dkey).size()) {
			return true;
		}
		
		for(Integer i: info.get(m.key)) {
			markers[i].r = m.r;
			markers[i].c = m.c;
			markers[i].key = m.key;
		}

		return false;
	}

	private static List<Integer> stackSplit(int key, int index) {
		return info.get(key).subList(info.get(key).indexOf(index), info.get(key).size());
	}

	private static int change(int d) {
		switch (d) {
		case UP:
			return DOWN;
		case DOWN:
			return UP;
		case RIGHT:
			return LEFT;
		case LEFT:
			return RIGHT;
		}
		return 0;
	}

	private static boolean check(int dr, int dc) {
		if (dr == 0 || dc == 0 || dr == N + 1 || dc == N + 1)
			return false;
		return true;
	}

	private static int key(int r, int c) {
		return r * 100 + c;
	}

	static class Marker {
		int index, r, c, d, key;

		public Marker() {
			super();
		}

		public Marker(int index, int r, int c, int d) {
			super();
			this.index = index;
			this.r = r;
			this.c = c;
			this.d = d;
			this.key = key(r, c);
		}
	}
}


© 2019. All rights reserved.

Powered by Hydejack v8.4.0