Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 프로그래머스 java
- 코딩테스트
- 자바 5464
- 리트코드 1557
- 그래프 자바
- Java
- 코테
- 분할정복
- 백준 18222
- 구현
- leetcode 1721
- daily challenge
- java leetcode
- 파이썬
- 프로그래머스
- 인텔리제이 에러
- BFS
- 리트코드
- 백준 16935
- 리트코드 자바
- DP
- leetcode
- 카카오
- 백준
- 스택
- java 프로그래머스
- 스프링 에러
- 자바 리트코드
- 자바
- dfs
Archives
- Today
- Total
레벨업 일지
[Java] leetcode 909. Snakes and Ladders 본문
문제
https://leetcode.com/problems/snakes-and-ladders/description/
알아야 할 개념
- BFS
풀이
BFS 구현 문제이다. 풀이는 다음과 같다.
- 주어진 번호를 좌표로 변환하는 메소드를 만든다.
- 주어진 좌표를 번호로 변환하는 메소드를 만든다.
- 주어진 조건에 따라 BFS 탐색을 구현한다.
- next 번호가 n x n 이상이면 탐색을 종료한다.
BFS 로 지도 끝까지 탐색하면 탐색 횟수를 리턴하고 그렇지 않으면 -1 을 리턴. 중간에 사다리나 뱀을 만나면 이동해준다.
내가 푼 로직 1번, 2번을 구현하는데 시간을 소비했다.
코드의 핵심은 좌표를 번호로, 번호를 좌표로 구현한 것이다.
/*좌표를 번호로 리턴*/
public int converToInt(int[]p){
int r = p[0];
int c = p[1];
if(r % 2== 0)return (n-1-r)*n + c + 1;
else return (n-1-r)*n + (n-1-c) + 1;
}
/*번호를 좌표로 리턴*/
public int[] converToPos(int p){
p-=1;
int r = p/n;
int c = p % n;
if(r % 2 == 0)return new int[]{n-r-1, c};
else return new int[]{n-r-1, n-c-1};
}
코드
자바
class Solution {
int n;
public int snakesAndLadders(int[][] b) {
n = b.length;
if(n < 3)return 1;
boolean v[] = new boolean[n*n+1];
Queue<Integer> Q =new LinkedList<>();
Q.offer(1);
v[1] = true;
int level = 1;
while(!Q.isEmpty()){
int size = Q.size();
for(int i = 0 ;i < size; i++){
int c = Q.poll();
System.out.println(c + "lev:"+level+" ");
for(int k = 1; k < 7; k++){
int nextN = c + k;
//System.out.println(nextN);
if(nextN >= n*n)return level;
int nt[] = converToPos(nextN);
int ntN = b[nt[0]][nt[1]];
if(ntN != -1 ){
if(ntN >= n*n)return level;
if(!v[ntN]){
Q.offer(ntN);
v[ntN] = true;
}
}else{
if(!v[nextN]){
v[nextN] = true;
Q.offer(nextN);
}
}
}
}
level++;
}
return -1;
}
public int converToInt(int[]p){
int r = p[0];
int c = p[1];
if(r % 2== 0)return (n-1-r)*n + c + 1;
else return (n-1-r)*n + (n-1-c) + 1;
}
public int[] converToPos(int p){
p-=1;
int r = p/n;
int c = p % n;
if(r % 2 == 0)return new int[]{n-r-1, c};
else return new int[]{n-r-1, n-c-1};
}
}
'알고리즘 > leetcode' 카테고리의 다른 글
[Java] leetcode 352. Data Stream as Disjoint Intervals (0) | 2023.01.28 |
---|---|
[Java] leetcode 787. Cheapest Flights Within K Stops (0) | 2023.01.27 |
[Java] leetcode 815. Bus Routes (2) | 2023.01.23 |
[Java] leetcode 200. Number of Islands (0) | 2023.01.22 |
[Java/Python ] leetcode 136. Single Number (0) | 2023.01.21 |
Comments