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
- GROUP BY 절
- 기초100제
- 자바
- SQLD / SQLP
- HAVING 절
- 헤드퍼스트 디자인패턴
- 명품 자바 프로그래밍
- Python 3
- 공공데이터
- Python
- level1
- pypy3
- BOJ
- 단계별로 풀어보기
- java
- baekjoon
- JAVA 11
- 코딩테스트
- programmers
- 개념
- Java11
- 백준
- Codeup
- 파이썬
- SELECT 절
- 응용
- 기본
- 기초
- Codeforces Round #802 (Div. 2)
- 이론
Archives
- Today
- Total
Development Project
[ Baekjoon - 10/06 ] - 2310번: 어드벤처 게임 본문
- 소요 시간 : 40분
- 문제를 읽고 이해하기
- 제한
- 시간 : 1초
- 메모리 : 128MB
- 문제
- 방의 개수 N개(1≤N≤1,000), 방별 비용(0≤N≤500), 방의 유형은 빈방, 레프리콘방, 트롤방임
- 1번방에서 N번방으로 갈 수 있는지 여부를 출력하는 문제이고, 방의 경우에 따라 갈수있는지 불가능한지 정해진다
- 빈방은 변화가 없고, 레프리콘방은 일정금액 이하일경우 돈을 일정금액이 되도록 도와주고, 트롤방은 통행세를 내야한다는 규칙?이 있다.
- 이해
- 첫번째 방이 1번이라는걸 문제에서 직관적으로 주질않아 0번방시작인지 1번방시작인지 찾아본거 말고는, 문제가 단순해서 있는 그대로 이해가 가능했다. 문제에서 직관적으로 1번방에서 시작한다고 줬었으면...ㅠ
- 제한
- 문제를 익숙한 용어로 재정의와 추상화
- 1번방 시작인지 0번방 시작인지를 알기위해 예제를 따라가보았다.
- 쭉 나열하며 가능여부를 따져본 결과 갈수있는곳을 차례차례 방문하며 다녔을때 끝까지 갈 수 있는 경우가 있으면 Yes를 출력하면 될것같았다.
- 문제를 어떻게 해결할 것인가
- 2번에서와 같이 결국 끝까지 가야하므로 DFS든 BFS든 가능하다고 생각했다.
(시간과 N의 범위를 고려해도 가능)
- 2번에서와 같이 결국 끝까지 가야하므로 DFS든 BFS든 가능하다고 생각했다.
- 위 계획을 검증
- 완탐이기 때문에 넘어가겠다.
- 계획 수행 (실제코드 작성)
- Java 11 - 나는 DFS로 풀었다.
-
import java.io.*; import java.util.*; public class Main { static int N; static Room[] rooms; static LinkedList<Integer>[] adjList; static boolean[] vis; static boolean flag; static int money; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while(true) { N = Integer.parseInt(br.readLine()); if(N == 0) { break; } adjList = new LinkedList[N+1]; rooms = new Room[N+1]; vis = new boolean[N+1]; money = 0; flag = false; for(int i=1; i<=N; i++) { adjList[i] = new LinkedList<Integer>(); } for(int n=1;n<=N; n++) { StringTokenizer st = new StringTokenizer(br.readLine()); char npc = st.nextToken().charAt(0); int cost = Integer.parseInt(st.nextToken()); rooms[n] = new Room(npc, cost); while(true) { int num = Integer.parseInt(st.nextToken()); if(num == 0) { break; } if(num == n) { continue; } adjList[n].add(num); } } dfs(1); System.out.println(flag?"Yes":"No"); } } static void dfs(int roomIdx) { if(rooms[roomIdx].npc == 'T') { if(rooms[roomIdx].cost <= money) { money -= rooms[roomIdx].cost; }else { return; } } if(roomIdx == N) { flag = true; return; } if(rooms[roomIdx].npc == 'L') { if(rooms[roomIdx].cost > money) { money = rooms[roomIdx].cost; } } vis[roomIdx] = true; for(int n : adjList[roomIdx]) { if(!vis[n]) { dfs(n); } } vis[roomIdx] = false; } static class Room{ char npc; int cost; public Room(char npc, int cost) { this.npc = npc; this.cost = cost; } } }
-
- Java 11 - 나는 DFS로 풀었다.
- 결과
'CodingTest > Baekjoon' 카테고리의 다른 글
[ Baekjoon - 10/08 ] - 21608번: 상어 초등학교 (1) | 2022.10.08 |
---|---|
[ Baekjoon - 10/07 ] - 1038번: 감소하는 수 (0) | 2022.10.07 |
[ Baekjoon - 10/05 ] - 1967번: 트리의 지름 (1) | 2022.10.05 |
[ Baekjoon - 10/04 ] - 16234번: 인구 이동 (1) | 2022.10.04 |
[ Baekjoon - 10/03 ] - 2304번: 창고 다각형 (1) | 2022.10.03 |
Comments