๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 5014_์Šคํƒ€ํŠธ๋งํฌ

๋ฟŒ์•ผ._. 2022. 4. 8. 12:19

Gold V

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

<์Šคํƒ€ํŠธ๋งํฌ>

๋ฌธ์ œ 

 

๊ฐ•ํ˜ธ๋Š” ์ฝ”๋”ฉ ๊ต์œก์„ ํ•˜๋Š” ์Šคํƒ€ํŠธ์—… ์Šคํƒ€ํŠธ๋งํฌ์— ์ง€์›ํ–ˆ๋‹ค. ์˜ค๋Š˜์€ ๊ฐ•ํ˜ธ์˜ ๋ฉด์ ‘๋‚ ์ด๋‹ค. ํ•˜์ง€๋งŒ, ๋Šฆ์ž ์„ ์ž” ๊ฐ•ํ˜ธ๋Š” ์Šคํƒ€ํŠธ๋งํฌ๊ฐ€ ์žˆ๋Š” ๊ฑด๋ฌผ์— ๋Šฆ๊ฒŒ ๋„์ฐฉํ•˜๊ณ  ๋ง์•˜๋‹ค.

์Šคํƒ€ํŠธ๋งํฌ๋Š” ์ด F์ธต์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ณ ์ธต ๊ฑด๋ฌผ์— ์‚ฌ๋ฌด์‹ค์ด ์žˆ๊ณ , ์Šคํƒ€ํŠธ๋งํฌ๊ฐ€ ์žˆ๋Š” ๊ณณ์˜ ์œ„์น˜๋Š” G์ธต์ด๋‹ค. ๊ฐ•ํ˜ธ๊ฐ€ ์ง€๊ธˆ ์žˆ๋Š” ๊ณณ์€ S์ธต์ด๊ณ , ์ด์ œ ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ๋ฅผ ํƒ€๊ณ  G์ธต์œผ๋กœ ์ด๋™ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

๋ณดํ†ต ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ์—๋Š” ์–ด๋–ค ์ธต์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„ํŠผ์ด ์žˆ์ง€๋งŒ, ๊ฐ•ํ˜ธ๊ฐ€ ํƒ„ ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ๋Š” ๋ฒ„ํŠผ์ด 2๊ฐœ๋ฐ–์— ์—†๋‹ค. U๋ฒ„ํŠผ์€ ์œ„๋กœ U์ธต์„ ๊ฐ€๋Š” ๋ฒ„ํŠผ, D ๋ฒ„ํŠผ์€ ์•„๋ž˜๋กœ D์ธต์„ ๊ฐ€๋Š” ๋ฒ„ํŠผ์ด๋‹ค. (๋งŒ์•ฝ, U์ธต ์œ„, ๋˜๋Š” D์ธต ์•„๋ž˜์— ํ•ด๋‹นํ•˜๋Š” ์ธต์ด ์—†์„ ๋•Œ๋Š”, ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ๋Š” ์›€์ง์ด์ง€ ์•Š๋Š”๋‹ค)

๊ฐ•ํ˜ธ๊ฐ€ G์ธต์— ๋„์ฐฉํ•˜๋ ค๋ฉด, ๋ฒ„ํŠผ์„ ์ ์–ด๋„ ๋ช‡ ๋ฒˆ ๋ˆŒ๋Ÿฌ์•ผ ํ•˜๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋งŒ์•ฝ, ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ G์ธต์— ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋ฉด, "use the stairs"๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

์ž…๋ ฅ

 

์ฒซ์งธ ์ค„์— F, S, G, U, D๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ S, G ≤ F ≤ 1000000, 0 ≤ U, D ≤ 1000000) ๊ฑด๋ฌผ์€ 1์ธต๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ณ , ๊ฐ€์žฅ ๋†’์€ ์ธต์€ F์ธต์ด๋‹ค.

 

์ถœ๋ ฅ 

 

์ฒซ์งธ ์ค„์— ๊ฐ•ํ˜ธ๊ฐ€ S์ธต์—์„œ G์ธต์œผ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•ด ๋ˆŒ๋Ÿฌ์•ผ ํ•˜๋Š” ๋ฒ„ํŠผ์˜ ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ, ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†์„ ๋•Œ๋Š” "use the stairs"๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

๋ฌธ์ œ ํ’€์ด

 

 - my solution (Python)

import sys
from collections import deque

if __name__=='__main__':
    f,s,g,u,d=map(int ,sys.stdin.readline().split()) # ๊ฐ€์žฅ ๋†’์€ ์ธต, ํ˜„์žฌ ์žˆ๋Š” ์ธต, ์ด๋™ํ•˜๋ ค๋Š” ์ธต, ์œ„, ์•„๋ž˜

    visited=[0]*(f+1) # ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
    depth=[0]*(f+1) # ๋ˆŒ๋Ÿฌ์•ผ ํ•˜๋Š” ๋ฒ„ํŠผ์˜ ์ˆ˜

    queue=deque([s])

    dx=[u,-d] # ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ธต ์ˆ˜
    visited[s]=1
    flag=0

    while queue:
        temp=queue.popleft()
        for i in dx:
            x=temp+i
            if x<=f and x>0: # ๊ฑด๋ฌผ ๋ฒ”์œ„ ์•ˆ
                if visited[x]==0: # ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธต
                    visited[x]=1 # ๋ฐฉ๋ฌธ
                    depth[x]=depth[temp]+1
                    queue.append(x)
                if x==g: # ๋„์ฐฉ
                    flag=1
                    break
        if flag==1: # ๋„์ฐฉ
            break
    if s!=g and depth[g]==0: # ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋ฉด
        print("use the stairs")
    else: # ๋ˆŒ๋Ÿฌ์•ผ ํ•˜๋Š” ๋ฒ„ํŠผ์˜ ์ˆ˜
        print(depth[g])

 

- my solution (JAVA)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;

public class _5014_์Šคํƒ€ํŠธ๋งํฌ {

	public static void main(String[] args) throws IOException{
		BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
		
		String s=bf.readLine();
		int F = Integer.parseInt(s.split(" ")[0]); // ๊ฐ€์žฅ ๋†’์€ ์ธต
		int S = Integer.parseInt(s.split(" ")[1]); // ํ˜„์žฌ ์žˆ๋Š” ์ธต
		int G = Integer.parseInt(s.split(" ")[2]); // ์ด๋™ํ•˜๋ ค๋Š” ์ธต
		int U = Integer.parseInt(s.split(" ")[3]); // ์œ„
		int D = Integer.parseInt(s.split(" ")[4]); // ์•„๋ž˜
		
		int visited[]=new int[F+1]; // ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
		int depth[]=new int[F+1]; // ๋ˆŒ๋Ÿฌ์•ผ ํ•˜๋Š” ๋ฒ„ํŠผ์˜ ์ˆ˜
		
		Queue<Integer>queue=new LinkedList<>();
		queue.add(S);
		
		int dx[]= {U, -D}; // ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ธต ์ˆ˜
		visited[S]=1;
		int flag=0;
		
		while(queue.size()!=0) {
			int temp=queue.poll();
			for(int i=0; i<2; i++) {
				int x=temp+dx[i];
				if (x<=F && x>0) { // ๊ฑด๋ฌผ ๋ฒ”์œ„ ์•ˆ
					if(visited[x]==0) { // ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธต
						visited[x]=1; // ๋ฐฉ๋ฌธ
						depth[x]=depth[temp]+1;
						queue.add(x);
					}
				}
				if (x==G) { // ๋„์ฐฉ
					flag=1;
					break;
				}
			}
			if(flag==1) { // ๋„์ฐฉ
				break;
			}
		}
		if (S!=G && depth[G]==0) { // ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋ฉด
			System.out.println("use the stairs");
		}else {
			System.out.println(depth[G]);
		}
	}
}

 

  • ๊ฐ€์žฅ ๋†’์€ ์ธต F, ํ˜„์žฌ ์œ„์น˜ S, ๋„์ฐฉํ•ด์•ผ ํ•˜๋Š” ์ธต G, ์œ„ U, ์•„๋ž˜ D ์ž…๋ ฅ
  • visited = ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
  • depth = ๋ˆŒ๋Ÿฌ์•ผ ํ•˜๋Š” ๋ฒ„ํŠผ์˜ ์ˆ˜ ์ €์žฅ
  • dx = ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ธต ( U, D )
  • queue๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต -> ์ œ์ผ ์ฒ˜์Œ ๊ฐ’์„ pop -> U, D ์ด๋™ํ•˜์—ฌ ๊ฑด๋ฌผ ๋ฒ”์œ„ ์•ˆ์ด๋ฉฐ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธต์ด๋ฉด ๋ฐฉ๋ฌธ ๋ฐ depth ์ €์žฅ, queue์— ์ €์žฅ/ ์ด๋™ํ•˜๋ ค๋Š” ์œ„์น˜์™€ ๋„์ฐฉํ•ด์•ผ ํ•˜๋Š” ์ธต์ด ๊ฐ™์œผ๋ฉด break
  • ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐˆ ์ˆ˜ ์—†์œผ๋ฉด "use the stairs" ์ถœ๋ ฅ, ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฉด depth [G] ์ถœ๋ ฅ

 

โ“ ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ณณ์„ ์–ด๋–ป๊ฒŒ ํŒ๋ณ„ํ•˜๋Š”๊ฐ€?

์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ์‚ด์ง ๊ณ ๋ฏผํ–ˆ์—ˆ๋‹ค. ํ˜„์žฌ ์œ„์น˜์™€ ๋„์ฐฉํ•ด์•ผ ํ•˜๋Š” ์ธต์ด ๊ฐ™์€ ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ํ˜„์žฌ ์œ„์น˜์™€ ๋„์ฐฉํ•ด์•ผ ํ•˜๋Š” ์ธต์ด ๊ฐ™์ง€ ์•Š์œผ๋ฉฐ depth [G]์— ์ €์žฅํ•œ ๊ฐ’์ด 0์ด๋ผ๋ฉด ๊ฐˆ ์ˆ˜ ์—†๋‹ค๊ณ  ํŒ๋‹จํ•˜์˜€๋‹ค. ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋ฉด depth์—๋Š” 0 ๊ฐ’์ด ์ €์žฅ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 


์ƒ๊ฐ๐Ÿค”

 

๋ฟŒ๋“ฏํ•ฉ๋‹ˆ๋‹ค.