일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- ESP-01
- 백준풀이
- peap
- 백준자바
- 포인터
- scroll-snap
- 아두이노 우노
- 백준15988풀이
- 백준 #백준2661 #좋은수열 #Java #코딩
- 프로젝트초기설정
- @supports
- Flexible box
- ESP-01WiFi
- reactNative
- CSS
- ESP8266WiFi
- 2193
- 백준java
- 백준
- 이친수문제
- 백준문제풀이 #백준 #백준문제 #스타트택시
- 노마드코더
- aspect-ratio
- dp문제
- CSS Flex
- ESP8266
- 리액트네이티브
- scss
- C
- 연결리스트
- Today
- Total
코딩 농장
[백준 16928번/JAVA] 뱀과 사다리 게임 (문제 풀이, 코드) 본문
문제이름
[문제]
뱀과 사다리 게임을 즐겨 하는 큐브러버는 어느 날 궁금한 점이 생겼다.
주사위를 조작해 내가 원하는 수가 나오게 만들 수 있다면, 최소 몇 번만에 도착점에 도착할 수 있을까?
게임은 정육면체 주사위를 사용하며, 주사위의 각 면에는 1부터 6까지 수가 하나씩 적혀있다. 게임은 크기가 10×10이고, 총 100개의 칸으로 나누어져 있는 보드판에서 진행된다. 보드판에는 1부터 100까지 수가 하나씩 순서대로 적혀져 있다.
플레이어는 주사위를 굴려 나온 수만큼 이동해야 한다. 예를 들어, 플레이어가 i번 칸에 있고, 주사위를 굴려 나온 수가 4라면, i+4번 칸으로 이동해야 한다. 만약 주사위를 굴린 결과가 100번 칸을 넘어간다면 이동할 수 없다. 도착한 칸이 사다리면, 사다리를 타고 위로 올라간다. 뱀이 있는 칸에 도착하면, 뱀을 따라서 내려가게 된다. 즉, 사다리를 이용해 이동한 칸의 번호는 원래 있던 칸의 번호보다 크고, 뱀을 이용해 이동한 칸의 번호는 원래 있던 칸의 번호보다 작아진다.
게임의 목표는 1번 칸에서 시작해서 100번 칸에 도착하는 것이다.
게임판의 상태가 주어졌을 때, 100번 칸에 도착하기 위해 주사위를 굴려야 하는 횟수의 최솟값을 구해보자.
[풀이]
이제는 좀 익숙하다 싶은 패턴.
너비 우선 탐색인 BFS를 사용해야한다.
주사위를 굴러서 +1~6까지 갈 수 있고, 어떤 위치까지의 최솟값을 구하는 거니깐!
[내 코드 알고리즘]
먼저 나는 map을 만들어줬다. 그리고 방문 상태를 저장하는 visited를 만들어줬다.
map을 만들때 1~100까지 그냥 숫자만 넣어두고, 사다리나 뱀의 경우는 1->3이면 map[1]=3 이런식으로 저장해둔다.
그리고 큐에다가 1번자리를 넣어두고 반복문 시작.
반복문에서 그냥 bfs랑 조금 다르게 구현한 점은 사다리!
사다리랑 뱀을 계속 탈 수 있으니까 또 반복문을 만들어서 해결했다.ex 현재 위치가 1이면 map[1]=3이니까 진짜 위치는 3. 근데 map[3]=3이 아니라 6일수도 있으니까 index와 value가 같아질때까지 반복!
[코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
class loc {
int pos;
int cnt;
loc(int p, int c){
this.pos = p;
this.cnt = c;
}
}
public class Main {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int map[] = new int[101];
boolean visited[] = new boolean[101];
/* Setting map */
for(int i=1; i<=100; i++)
map[i] = i;
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken()); int M = Integer.parseInt(st.nextToken());
for(int i=0; i<N+M; i++) {
st = new StringTokenizer(br.readLine(), " ");
int from = Integer.parseInt(st.nextToken());
int to = Integer.parseInt(st.nextToken());
map[from] = to;
}
/* bfs */
int ans=0;
Queue<loc> q = new LinkedList<>();
q.add(new loc(1, 0));
while(!q.isEmpty()) {
boolean visitToggle = false;
loc pos = q.poll();
int prepos = pos.pos;
visited[prepos] = true;
int realPos = map[pos.pos];
while(prepos != realPos) {
if(visited[realPos]) {
visitToggle = true;
break;
}
visited[realPos] = true;
prepos = realPos;
realPos = map[prepos];
}
if(visitToggle) continue;
if (realPos == 100) {
ans = pos.cnt;
break;
}
for(int i=1; i<=6; i++) {
if(realPos+i <=100 && !visited[realPos+i])
q.add(new loc(realPos+i, pos.cnt+1));
}
}
System.out.println(ans);
}
}
GitHub에 티스토리에 올리지 않은 코드들도 업로드 되어 있습니다.
https://github.com/MOBUMIN/BJalgorithm/blob/master/16000-16999/snakeGame_16928.java
MOBUMIN/BJalgorithm
백준 알고리즘 푼 것. Contribute to MOBUMIN/BJalgorithm development by creating an account on GitHub.
github.com
'백준' 카테고리의 다른 글
[백준 9019번/JAVA] DSLR (문제 풀이, 코드) (0) | 2021.07.16 |
---|---|
[백준 11403번/JAVA] 경로 찾기 (문제 풀이, 코드) (0) | 2021.07.16 |
[백준 6588번/JAVA] 골드바흐의 추측 (문제 풀이, 코드) (0) | 2021.07.11 |
[백준 7562번/JAVA] 나이트의 이동 (문제 풀이, 코드) (0) | 2021.07.09 |
[백준 1012번/JAVA] 유기농배추 (문제 풀이, 코드) (0) | 2021.07.05 |