일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 프로그래머스 자바
- 프로그래머스 java
- 백준 1541
- 최소 힙 1927
- Stack
- HashSet
- 백준 3190번
- 백준 14938번 서강그라운드
- ac 5430번
- mysql hy000 에러
- append
- 백준 2473번 세 용액 - java
- map
- 코틀린기초
- 백준 1197번 최소 스패닝 트리 - java
- dp
- hash
- StringTokenizer
- 프로그래머스
- Java
- 18111번 마인크래프트 - java 구현
- StringBuilder
- toUpperCase
- 백준 1043번 거짓말 - java 분리 집합
- 백준 2467번 용액 자바 - 이분탐색
- kotlin
- 백준 1806번 부분합 java
- 백준 1647번 도시 분할 계획 - java
- HashMap
- replace()
Archives
- Today
- Total
말하는 컴공감자의 텃밭
Swea 4193. 수영대회 결승전 D4 - 그래프, 완전 탐색 본문
728x90
레스고 어푸어푸
싸피 친구가 이거 문제 어떻게 풀지 궁금하대서 두달전에 줬었는데
정신없어서 한달 후에야 해결하고 그걸 또 한달만에 정리한다. 에호 이놈아
특징
1.소용돌이가 등장한다. 🚨
-> 텀은 2초동안 유지되고 생성되고 반복 (0초,1초, 2초에 사라짐. 3,4초에 나왔다가~ 5초에 사라지고)
2. 소용돌이로는 이동할 수 없다.
-> 사라지고 이동~
3. 만약 내 위치에 소용돌이가 생긴다면 그때는 이동 가능하다.
소용돌이는 어떻게 처리? ⚓
-> % 3 == 2로 확인하고 처리해주자
고고
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | import java.io.*; import java.util.*; class Solution { // 4193. 수영대회 결승전 D4 public static int[][] map; public static boolean[][] visit; public static int N, s_r, s_c, e_r, e_c, answer; public static int[] dr = { 1, -1, 0, 0 }; public static int[] dc = { 0, 0, -1, 1 }; static class Swimmer { int r, c, time; public Swimmer(int r, int c, int time) { this.r = r; this.c = c; this.time = time; } } public static void main(String args[]) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); StringTokenizer st; // 테케 int T = Integer.parseInt(br.readLine()); for (int Tc = 1; Tc <= T; Tc++) { // 수영장 범위 N = Integer.parseInt(br.readLine()); map = new int[N][N]; visit = new boolean[N][N]; // input ------------------------------- for (int i = 0; i < N; i++) { st = new StringTokenizer(br.readLine()); for (int j = 0; j < N; j++) { map[i][j] = Integer.parseInt(st.nextToken()); } } st = new StringTokenizer(br.readLine()); s_r = Integer.parseInt(st.nextToken()); s_c = Integer.parseInt(st.nextToken()); st = new StringTokenizer(br.readLine()); e_r = Integer.parseInt(st.nextToken()); e_c = Integer.parseInt(st.nextToken()); // ------------------------------------- if (arrive(s_r,s_c)) { System.out.println("#" + Tc + " " + 0); continue; } bfs(); System.out.println("#" + Tc + " " + answer); } } // 소용돌이는 time % 3 == 2일때 이동 가능, 아니면 제자리 public static void bfs() { Queue<Swimmer> que = new LinkedList<>(); que.add(new Swimmer(s_r, s_c,0)); while(!que.isEmpty()) { Swimmer swimmer = que.poll(); int now_r = swimmer.r; int now_c = swimmer.c; int time = swimmer.time; for(int i = 0; i<4; i++) { int r = now_r + dr[i]; int c = now_c + dc[i]; if(!range(r,c)) continue; if(arrive(r,c)) { answer = time + 1; return; } // 소용돌이 if(map[r][c] == 2) { if(time % 3 == 2) { visit[r][c] = true; que.add(new Swimmer(r,c,time+1)); }else { visit[now_r][now_c] = true; que.add(new Swimmer(now_r,now_c,time+1)); } } // 이동가능할때 if(map[r][c] == 0) { visit[r][c] = true; que.add(new Swimmer(r,c,time+1)); } // 장애물 if(map[r][c] == 1) continue; } } answer = -1; return; } public static boolean range(int r, int c) { return r >= 0 && c >= 0 && r < N && c < N && !visit[r][c]; } public static boolean arrive(int r, int c) { return r == e_r && c == e_c; } } | cs |
그래프 문제는.. 참 재밌따.. 요즘 객체활용도 익숙해져서 좋구..
코드가 길긴하지만..
미리미리 테스트 해가면서 문제점을 짚어줍시다.. 우르르 왁왁 다썼다가 꼬이면 힘들더라구요..
728x90
'알고리즘 > SW expert - Java' 카테고리의 다른 글
Swea 19113. 식료품 가게 D3 - 자바 구현 (0) | 2024.01.01 |
---|---|
Sw expert 11315. 오목 판정 D3 - dfs (0) | 2023.12.10 |
Sw expert 13732. 정사각형 판정 D3 (0) | 2023.12.08 |
Sw expert 4789. 성공적인 공연 기획 D3 - 구현 (1) | 2023.12.06 |
SW expert 1249. [S/W 문제해결 응용] 4일차 - 보급로 D4 - BFS (2) | 2023.12.04 |
Comments