๋ฌธ์ (์ถ์ฒ: 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 ๊ฐ์ด ์ ์ฅ๋์ด์๊ธฐ ๋๋ฌธ์ด๋ค.
์๊ฐ๐ค
๋ฟ๋ฏํฉ๋๋ค.
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 2636_์น์ฆ (0) | 2022.04.13 |
---|---|
[Baekjoon] 16928_๋ฑ๊ณผ ์ฌ๋ค๋ฆฌ ๊ฒ์ (0) | 2022.04.12 |
[Baekjoon] 11403_๊ฒฝ๋ก ์ฐพ๊ธฐ (0) | 2022.04.07 |
[Baekjoon] 2583_์์ญ ๊ตฌํ๊ธฐ (0) | 2022.04.06 |
[Baekjoon] 1697_์จ๋ฐ๊ผญ์ง (0) | 2022.04.05 |