๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[Algorithm/Java][๋ฐฑ์ค€] 14226๋ฒˆ ์ด๋ชจํ‹ฐ์ฝ˜

๋ฐ˜์‘ํ˜•

[BOJ] 14226๋ฒˆ ์ด๋ชจํ‹ฐ์ฝ˜

https://www.acmicpc.net/problem/14226

๋ฌธ์ œ ์ ‘๊ทผ

ํ™”๋ฉด์— ์žˆ๋Š” ์ด๋ชจํ‹ฐ์ฝ˜์„ S๊ฐœ ๋งŒ๋“œ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
ํ™”๋ฉด์— ์žˆ๋Š” ์ด๋ชจํ‹ฐ์ฝ˜ ๊ฐœ์ˆ˜์™€ ํด๋ฆฝ๋ณด๋“œ์— ์žˆ๋Š” ์ด๋ชจํ‹ฐ์ฝ˜ ๊ฐœ์ˆ˜ ๊ทธ๋ฆฌ๊ณ  ์‹œ๊ฐ„ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” Emoticon ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  isVisited ๋ฐฐ์—ด์„ ํ™”๋ฉด์— ์žˆ๋Š” ์ด๋ชจํ‹ฐ์ฝ˜ ์ˆ˜์™€ ํด๋ฆฝ๋ณด๋“œ์— ์žˆ๋Š” ์ด๋ชจํ‹ฐ์ฝ˜ ์ˆ˜๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋„๋ก 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  BFS๋ฅผ ์ด์šฉํ•ด์„œ ํ™”๋ฉด์— ์žˆ๋Š” ์ด๋ชจํ‹ฐ์ฝ˜์„ ํด๋ฆฝ๋ณด๋“œ์— ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ, ํ™”๋ฉด์— ์žˆ๋Š” ์ด๋ชจํ‹ฐ์ฝ˜ ํ•œ๊ฐœ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒฝ์šฐ, ํด๋ฆฝ๋ณด๋“œ์— ์žˆ๋Š” ์ด๋ชจํ‹ฐ์ฝ˜์„ ๋ถ™์—ฌ๋„ฃ๋Š” ๊ฒฝ์šฐ ์„ธ๊ฐ€์ง€๋ฅผ ๊ณ ๋ คํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ์ด์ฐจ์› ๋ฐฐ์—ด๋กœ ํ•ด๊ฒฐํ•  ์ƒ๊ฐ์„ ํ•˜์ง€ ๋ชปํ•ด์„œ ํ‘ธ๋Š”๋ฐ ๊ฝค๋‚˜ ์˜ค๋ž˜๊ฑธ๋ ธ๋‹ค...๊ทผ๋ฐ ์ด์ฐจ์› ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋‹ˆ๊นŒ ๋‹ค๋ฅธ ๋ฌธ์ œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ต‰์žฅํžˆ ์‰ฝ๊ฒŒ ํ’€๋ ธ๋‹ค!
ํด๋ฆฐ ์ฝ”๋“œ๋ผ๋Š” ์ฑ…์„ ์ฝ๊ณ  ์žˆ๋Š”๋ฐ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์ง€์„ ๋•Œ๋Š” ์ด๋ฆ„์„ ๋ณด๊ณ  ์ด ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ค ์ผ์„ ํ•˜๋Š”์ง€ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์ง“๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ํ•ด์„œ ์ตœ๋Œ€ํ•œ ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ๋‹ค!

Code

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class BOJ14226 {
    static int target;
    static boolean[][] isVisited = new boolean[5000][5000]; // [ํ™”๋ฉด์— ์žˆ๋Š” ์ด๋ชจํ‹ฐ์ฝ˜ ์ˆ˜][ํด๋ฆฝ๋ณด๋“œ์— ์žˆ๋Š” ์ด๋ชจํ‹ฐ์ฝ˜ ์ˆ˜]
    static class Emoticon {
        int countOnScreen; // ํ™”๋ฉด์— ์žˆ๋Š” ์ด๋ชจํ‹ฐ์ฝ˜ ๊ฐœ์ˆ˜
        int countOnClipboard; // ํด๋ฆฝ๋ณด๋“œ์— ์žˆ๋Š” ์ด๋ชจํ‹ฐ์ฝ˜ ๊ฐœ์ˆ˜
        int time; // ์‹œ๊ฐ„

        public Emoticon(int countOnScreen, int countOnClipboard, int time) {
            this.countOnScreen = countOnScreen;
            this.countOnClipboard = countOnClipboard;
            this.time = time;
        }
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        target = sc.nextInt();
        System.out.println(bfs());
    }

    public static int bfs() {
        Queue<Emoticon> q = new LinkedList<>();
        q.add(new Emoticon(1, 0, 0));
        isVisited[1][0] = true;
        while (!q.isEmpty()) {
            Emoticon cur = q.poll();
            int countOnScreen = cur.countOnScreen;
            int countOnClipboard = cur.countOnClipboard;
            int time = cur.time;
            if(countOnScreen == target){
                return time;
            }
            if(countOnScreen > 0 && countOnScreen < 1001){
                // ํ™”๋ฉด์— ์žˆ๋Š” ์ด๋ชจํ‹ฐ์ฝ˜ ํด๋ฆฝ๋ณด๋“œ์— ์ €์žฅ
                if(!isVisited[countOnScreen][countOnScreen]){
                    q.add(new Emoticon(countOnScreen, countOnScreen, time + 1));
                    isVisited[countOnScreen][countOnScreen] = true;
                }
                // ํ™”๋ฉด์— ์žˆ๋Š” ์ด๋ชจํ‹ฐ์ฝ˜ ํ•œ๊ฐœ ์‚ญ์ œ
                if(!isVisited[countOnScreen-1][countOnClipboard]){
                    q.add(new Emoticon(countOnScreen - 1, countOnClipboard, time + 1));
                    isVisited[countOnScreen - 1][countOnClipboard] = true;
                }
            }
            if(countOnClipboard != 0){
                //ํด๋ฆฝ๋ณด๋“œ์— ์žˆ๋Š” ๋ชจ๋“  ์ด๋ชจํ‹ฐ์ฝ˜ ๋ถ™์—ฌ๋„ฃ๊ธฐ
                if(!isVisited[countOnScreen+countOnClipboard][countOnClipboard]){
                    q.add(new Emoticon(countOnScreen + countOnClipboard, countOnClipboard, time + 1));
                    isVisited[countOnScreen + countOnClipboard][countOnClipboard] = true;
                }
            }
        }
        return -1;
    }
}
๋ฐ˜์‘ํ˜•