백준 13549번 숨바꼭질3

DongHyun Kim·2022년 7월 20일
0

알고리즘 풀이

목록 보기
1/12
post-thumbnail

숨바꼭질 시리즈로 숨바꼭질1과 차이점은 순간이동(현재 위치에서 2배로 이동)의 경우 0초로 계산한단 점이다.
처음 접근할 때는 들릴 위치를 stack에 저장, visited 배열을 이용해 한 번 들렸던 위치는 다시 들려보지 않도록 경우의 수를 줄이고, 배열을 초과하지 않게 if문으로 제한을 두고 푼 정도였다.
하지만 제출했더니 틀림으로 표시돼서 예외를 생각해봤는데, 만약 1부터 2까지 이동하는 시간을 구할 때 1->2 (+1로 이동) 하고 visited 표시 해준뒤 1->2(순간이동으로 이동)을 stack에 못 넣어서 0초를 출력하지 못하는 오류가 있었다.
문제를 맞추고 다른 사람 풀이를 봤는데 priority queue를 이용해 이동시간이 작은 것 부터 꺼내서 쓰는 방법이 더 좋았을거라 생각한다.

public static void main(String[] args) throws Exception {
		// visited 배열을 2차원 배열로 만들고 1차원에 방문할 index들, 2차원에 방문했을 때 몇 초 인지 저장하기
		int[][] visited = new int[100001][2];
		ArrayList<int[]> stack = new ArrayList<>();
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(bf.readLine());
		int n = Integer.parseInt(st.nextToken());
		int k = Integer.parseInt(st.nextToken());
		int[] top = { n, 0 };
		stack.add(top);
		visited[top[0]][0] = 1;
		visited[top[0]][1] = 0;
		int answer = 100000;
		int flag = 0;
		while (!stack.isEmpty()) {
			top = stack.remove(0);
			visited[top[0]][0] = 1;
			if (top[0] == k) {
				if (top[1] < answer) {
					answer = top[1];
				}
				flag = 1;
			}
			int[] element1 = new int[] { top[0] + 1, top[1] + 1 };
			int[] element2 = new int[] { top[0] - 1, top[1] + 1 };
			int[] element3 = new int[] { top[0] * 2, top[1] };
			if (element1[0] <= 2 * k && element1[0] <= 100000) {
				if (visited[element1[0]][0] != 1 && flag == 0) {
					visited[element1[0]][0] = 1;
					stack.add(element1);
					visited[element1[0]][1] = element1[1];
				} else if (visited[element1[0]][1] > element1[1]) {
					stack.add(element1);
					visited[element1[0]][1] = element1[1];
				}
			}
			if (element2[0] >= 0) {
				if (visited[element2[0]][0] != 1  && flag == 0) {
					visited[element2[0]][0] = 1;
					stack.add(element2);
					visited[element2[0]][1] = element2[1];
				} else if (visited[element2[0]][1] > element2[1]) {
					stack.add(element2);
					visited[element2[0]][1] = element2[1];
				}
			}
			if (element3[0] <= 2 * k && element3[0] <= 100000) {
				if (visited[element3[0]][0] != 1  && flag == 0) {
					visited[element3[0]][0] = 1;
					stack.add(element3);
					visited[element3[0]][1] = element3[1];
				} else if (visited[element3[0]][1] > element3[1]) {
					stack.add(element3);
					visited[element3[0]][1] = element3[1];
				}
			}
		}
		System.out.println(answer);
	}
profile
do programming yourself

0개의 댓글