이 글은 인프런 [자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비 ] 강의를 수강하며 작성한 글입니다.
자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비 - 인프런 | 강의
자바(Java)로 코딩테스트를 준비하시는 분을 위한 강좌입니다. 코딩테스트에서 가장 많이 출제되는 Top 10 Topic을 다루고 있습니다. 주제와 연동하여 기초문제부터 중급문제까지 단계적으로 구성
www.inflearn.com
문제 :
현수는 송아지를 잃어버렸다. 다행히 송아지에는 위치추적기가 달려 있다.
현수의 위치와 송아지의 위치가 수직선상의 좌표 점으로 주어지면 현수는 현재 위치에서 송아지의 위치까지 다음과 같은 방법으로 이동한다.
송아지는 움직이지 않고 제자리에 있다.
현수는 스카이 콩콩을 타고 가는데 한 번의 점프로 앞으로 1, 뒤로 1, 앞으로 5를 이동할 수 있다.
최소 몇 번의 점프로 현수가 송아지의 위치까지 갈 수 있는지 구하는 프로그램을 작성하시오.
입력 :
첫 번째 줄에 현수의 위치 S와 송아지의 위치 E가 주어진다. 직선의 좌표 점은 1부터 10,000까지다.
출력:
점프의 최소횟수를 구한다. 답은 1이상이며 반드시 존재한다.
예시 입력 : 5 14
예시출력 : 3
현수의 위치에서 송아지 위치까지 몇 번의 점프만에 갈 수 있는지, 즉 최단거리를 묻는 문제로 BFS 알고리즘을 이용해 구현한다.
예시 입력의 현수의 위치가 5이고 송아지 위치가 14이므로 루트노드는 5이다.
5에서 한 번의 점프로 갈 수 있는 위치 (+1, -1, +5)가 다음 레벨 자식 노드가 된다.
그리고 다시 각각의 노드에서 점프했을 때 갈 수 있는 위치를 구하는데, 이미 나왔던 위치라면(방문했던 노드라면)
쓰지 않는다.
그렇게 찾다 보면 송아지의 위치인 14를 최초로 찾을 수 있고 현수는 세 번의 점프만에 송아지에게 갈 수 있다.
< 송아지 찾기 코드 (BFS) >
public class Main {
public static int BFS(int hs, int s) {
int[] dis = { 1, -1, 5 }; // 한 번의 점프로 갈 수 있는 위치를 구하기 위한 배열
int[] ch = new int[10001]; // 방문 체크배열
Queue<Integer> Q = new LinkedList<>();
ch[s] = 1;
Q.offer(hs);
int L = 0; // 레벨
while (!Q.isEmpty()) {
int len = Q.size();
for (int i = 0; i < len; i++) {
int cur = Q.poll();
for (int j : dis) {
int nx = cur + j;
if (nx == s) // 점프한 위치가 송아지의 위치와 같다면
return L + 1;
if (nx >= 1 && nx <= 10000 && ch[nx] == 0) {
// 점프한 위치가 범위 내에 있는지 & 방문 안 한 위치인지
ch[nx] = 1;
Q.offer(nx);
}
}
}
L++;
}
return 0;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
int hs = scan.nextInt();
int s = scan.nextInt();
System.out.println(BFS(hs, s));
}
}
'알고리즘 > 자바 알고리즘 문제풀이: 코딩테스트 대비' 카테고리의 다른 글
[알고리즘/java] 경로탐색(DFS 인접행렬, 2차원 배열) (0) | 2021.12.21 |
---|---|
[알고리즘/java] 그래프와 인접행렬 (0) | 2021.12.21 |
[알고리즘/java] 이진트리 레벨탐색(BFS) (0) | 2021.12.14 |
[알고리즘/java] 부분집합 구하기(DFS) (0) | 2021.12.11 |
[알고리즘/java] 이진트리순회(DFS) (0) | 2021.12.11 |