๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 12852_1๋กœ ๋งŒ๋“ค๊ธฐ 2

๋ฟŒ์•ผ._. 2023. 7. 25. 21:21

Silver I

๋ฌธ์ œ(์ถœ์ฒ˜: https://www.acmicpc.net/problem/12852)

< 1๋กœ ๋งŒ๋“ค๊ธฐ 2 >

 

๋ฌธ์ œ ํ’€์ด 

 

์ž…๋ ฅ ๋ฒ”์œ„์ธ 1000000๋งŒํผ์˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด N์„ 1๋กœ ๋งŒ๋“œ๋Š” ๊ฒฝ๋กœ๋ฅผ ์ €์žฅํ•œ๋‹ค. 

๋งŒ์•ฝ 5์—์„œ 1์„ ๋นผ๋Š” ์—ฐ์‚ฐ์„ ํ•œ๋‹ค๋ฉด 4์ด๋ฏ€๋กœ arr [4] = 5์™€ ๊ฐ™์ด ์ „์— ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

 

 

 my solution (Java)

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

public class _12852_ { // 1๋กœ ๋งŒ๋“ค๊ธฐ 2

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		int n = Integer.parseInt(bf.readLine());
		int arr[] = new int[1000001];

		Queue<int[]> queue = new LinkedList<>();

		if (n != 1) {
			queue.add(new int[] { n, 0 });
		}

		while (!queue.isEmpty()) {
			int num[] = queue.poll();

			if (num[0] % 3 == 0 && arr[num[0] / 3] == 0) {
				queue.add(new int[] { num[0] / 3, num[1] + 1 });
				arr[num[0] / 3] = num[0];
				if (num[0] / 3 == 1) {
					bw.write((num[1] + 1) + "\n");
					break;
				}
			}
			if (num[0] % 2 == 0 && arr[num[0] / 2] == 0) {
				queue.add(new int[] { num[0] / 2, num[1] + 1 });
				arr[num[0] / 2] = num[0];
				if (num[0] / 2 == 1) {
					bw.write((num[1] + 1) + "\n");
					break;
				}
			}
			if (arr[num[0] - 1] == 0) {
				queue.add(new int[] { num[0] - 1, num[1] + 1 });
				arr[num[0] - 1] = num[0];
				if (num[0] - 1 == 1) {
					bw.write((num[1] + 1) + "\n");
					break;
				}
			}
		}

		if (n == 1)
			bw.write("0\n");

		ArrayList<Integer> result = new ArrayList<>();
		int idx = 1;
		while (true) {
			result.add(idx);
			if (idx == n) {
				break;
			}
			idx = arr[idx];
		}

		for (int i = result.size() - 1; i >= 0; i--) {
			bw.write(result.get(i) + " ");
		}
		bw.flush();
	}
}

 

Main

๋ณ€์ˆ˜)
n : ์ž…๋ ฅ ๊ฐ’ ์ •์ˆ˜
arr : ์—ฐ์‚ฐ ๊ฒฝ๋กœ ์ €์žฅ
queue : [์—ฐ์‚ฐ ๊ฐ’, ์—ฐ์‚ฐ ํšŸ์ˆ˜]
num : queue์—์„œ ๋ฝ‘์•„๋‚ธ ๊ฐ’
result : ๋‹ต ์ €์žฅํ•˜๋Š” ๋ฆฌ์ŠคํŠธ

 

- ์ž…๋ ฅ ๊ฐ’ ์ •์ˆ˜(n) ์ž…๋ ฅ

- queue์— ์‹œ์ž‘ ๊ฐ’์ธ n๊ณผ ์—ฐ์‚ฐ ํšŸ์ˆ˜ ์ €์žฅ

- queue๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต 

1) 3์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฉฐ 3์œผ๋กœ ๋‚˜๋ˆˆ ๊ฐ’์— ์•„์ง ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†์œผ๋ฉด

: queue์— ์ €์žฅ

: arr [์ •์ˆ˜/3] = ์ •์ˆ˜ 

2) 2๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฉฐ 2๋กœ ๋‚˜๋ˆˆ ๊ฐ’์— ์•„์ง ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†์œผ๋ฉด

: queue์— ์ €์žฅ

: arr [์ •์ˆ˜/2] = ์ •์ˆ˜

3) 1๋กœ ๋บ€ ๊ฐ’์— ์•„์ง ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†์œผ๋ฉด

: queue์— ์ €์žฅ

: arr [์ •์ˆ˜-1] = ์ •์ˆ˜

๊ฐ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ ํ›„ ๊ฐ’์ด 1์ด๋ฉด ์—ฐ์‚ฐ ํšŸ์ˆ˜ ์ถœ๋ ฅ ํ›„ ๋ฐ”๋กœ ์ข…๋ฃŒ

- ์ž…๋ ฅ ๊ฐ’์ด 1์ด๋ผ๋ฉด ์œ„์˜ ๊ณผ์ •์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์—ฐ์‚ฐ ํšŸ์ˆ˜ 0 ์ถœ๋ ฅ

- n์„ 1๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ๋จผ์ € ์—ญ์ˆœ์œผ๋กœ ArrayList์— ์ €์žฅ

ex) 2 -> 1์ด๋ผ๋ฉด ArrayList์—๋Š” 1 -> 2๋กœ ์ €์žฅ๋จ

- ๋‹ต์„ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ArrayList๋ฅผ ๊ฑฐ๊พธ๋กœ ์ถœ๋ ฅ