[파이썬, 자바] 백준 14867 : 물통 (골드2)
풀이
방향성 생각
- 입력이 조금 크고 물통 A,B의 순서가 중요해서 시간이 조금 빡빡하다.
- 두 물통의 상태 변화를 파이썬에선 V에 tuple로 넣고,
파이썬
from collections import deque
def bfs(X,Y,ex,ey):
Q = deque([(0,0,0)])
V = set([(0,0)])
while Q:
cx,cy,t = Q.popleft()
if (cx,cy) == (ex,ey):
return t
for nx,ny in [(X,cy),(cx,Y),(0,cy),(cx,0),
(min(cx+cy,X), max(0,cx+cy-X)),
(max(0,cx+cy-Y), min(cx+cy,Y))]:
if (nx,ny) not in V:
V.add((nx,ny))
Q.append((nx,ny,t+1))
return -1
X,Y,ex,ey = map(int,input().split())
result = bfs(X,Y,ex,ey)
print(result)
자바
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int X = Integer.parseInt(st.nextToken());
int Y = Integer.parseInt(st.nextToken());
int ex = Integer.parseInt(st.nextToken());
int ey = Integer.parseInt(st.nextToken());
System.out.println(bfs(X,Y,ex,ey));
}
public static int bfs(int X, int Y, int ex, int ey) {
ArrayDeque<int[]> Q = new ArrayDeque<>();
Q.offer(new int[] {0,0,0});
Set<String> V = new HashSet<>();
V.add("0,0");
while (!Q.isEmpty()) {
int[] cinfo = Q.poll();
int cx = cinfo[0], cy = cinfo[1], t = cinfo[2];
if (cx==ex && cy== ey) {
return t;
}
int[][] nextStates = {
{X,cy}, {cx,Y}, {0,cy}, {cx,0},
{Math.min(cx+cy,X), Math.max(0,cx+cy-X)},
{Math.max(0,cx+cy-Y), Math.min(cx+cy,Y)}
};
for (int[] ninfo : nextStates) {
int nx = ninfo[0], ny = ninfo[1];
String ninfoString = nx + "," + ny;
if (!V.contains(ninfoString)) {
V.add(ninfoString);
Q.offer(new int[] {nx, ny, t+1});
}
}
}
return -1;
}
}
- 자바에서는 튜플을 따로 정의하거나, 문자열로 바꿔서 방문체크한다.
코멘트
- 골4에 같은 문제가 있었던 거로 기억...
- 변수명 최적화가 좀 필요하다.
- 시작은 start -> sx,sy
- 끝은 end -> ex,ey
- 현재노드는 cur -> cx,cy
- 이전 노드는 prev -> px,py
- 다음 노드는 nxt -> nx,ny
- 테스트 케이스는 TC -> tc
- 등등 최대한 x,y,i,j랑 안겹치게 하고, p,q,t,d 등 자주 쓰는 변수들도 안겹치게하기.
'Algorithm > Graph' 카테고리의 다른 글
[파이썬, 자바] 백준 4485 : 녹색 옷 입은 애가 젤다지? (골드4) (0) | 2025.02.17 |
---|---|
[파이썬, 자바] 백준 20158 : 사장님 달려가고 있습니다 (플레5) (0) | 2025.02.13 |
[파이썬, 자바] 백준 1800 : 인터넷 설치 (골드1) (0) | 2025.02.10 |
[파이썬, 자바] 백준 24463 : 미로 (골드4) (0) | 2025.02.04 |
[파이썬, 자바] 백준 16681 : 등산 (골드2) (0) | 2025.02.03 |
[파이썬, 자바] 백준 9370 : 미확인도착지 (골드2) (0) | 2025.02.02 |
[파이썬, 자바] 백준 5972 : 택배 배송 (골드5) (0) | 2025.02.01 |
댓글