반응형
https://www.acmicpc.net/problem/2310
2310번 어드벤처 게임
Comment
문제 이해하는데 한참 걸렸던 문제 생각보다 구현은 엄청 어렵지는 않았다.
문제 이해를 돕자면 각 줄이 1, 2, 3, 4번 방으로 쭉 나열되는 것이고, E,L,T의 상태를 가진 방 으로 생각하면 편할 것 같다.
다들 쉽게 이해하겠지만 저는 좀 힘들었습니다..
Hint
- 기본적인 방의 번호와 상태를 담은 mapList
- 방문을 확인할 배열 visited
- n번방에 도달했는지 확인하는 success
Solution
문제 이해하기까지도 오래 걸리고, 아직 문해력이 부족한건지 모호했던 부분이 많았던 문제 그래도 직접 해결해서 뿌듯하다
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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | package Baekjoon.gold; import java.io.*; import java.util.*; /** * 3 * E 0 2 0 * L 10 3 0 * T 15 1 2 0 * * E 빈방, L 레프리콘, T 트롤 * 두번째 0, 10, 15 금액 * 레프리콘은 10원 기준 * 트롤은 15원 기준 * * 1번방 출발 빈방시작 * 이후의 값은 다 다른 방과 이어지는 번호 * * 처음 모험가가 시작하는 방 번호 1 * * 연결리스트로 추가하기 * */ public class p2310 { static ArrayList<Room> mapList; static boolean[] visited; static int n; static StringBuilder sb = new StringBuilder(); static boolean flag; static boolean success; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); n = Integer.parseInt(br.readLine()); while(n > 0){ mapList = new ArrayList<>(); visited = new boolean[n+1]; int myMoney = 0; flag = true; success = false; //0번방의 필요없는 데이터 주입 mapList.add(new Room(-1,"NOTHING",-1)); // for(int roomNumber = 1; roomNumber <= n; roomNumber++) { StringTokenizer st = new StringTokenizer(br.readLine()); Room roomInit = new Room( roomNumber, st.nextToken(), Integer.parseInt(st.nextToken()) ); int inputNum = Integer.parseInt(st.nextToken()); while(inputNum > 0){ roomInit.roomNumberAdd(inputNum); inputNum = Integer.parseInt(st.nextToken()); } mapList.add(roomInit); } dfs(1, myMoney); if(!success){ sb.append("No").append("\n"); }else{ sb.append("Yes").append("\n"); } n = Integer.parseInt(br.readLine()); } System.out.println(sb); } static void dfs(int roomNum, int myMoney){ if(success){ return; } visited[roomNum] = true; Room nowRoom = mapList.get(roomNum); myMoney = nowRoom.visitRoomEvent(myMoney); if(myMoney >= 0){ if(n == roomNum){ success = true; return; } for(int roomNumber : nowRoom.getLinkedRoomList()){ if(!visited[roomNumber]) { dfs(roomNumber, myMoney); } } }else{ visited[roomNum] = false; return; } } private static class Room{ int roomNum; String roomType; int roomMoney; final ArrayList<Integer> roomList; Room(int roomNumber, String type, int money){ this.roomMoney = money; this.roomNum = roomNumber; this.roomList = new ArrayList<>(); this.roomType = type; } void roomNumberAdd(int number){ roomList.add(number); } ArrayList<Integer> getLinkedRoomList(){ return roomList; } int visitRoomEvent(int money){ if(roomType.equals("L")){ if(money < this.roomMoney){ return this.roomMoney; } } if(roomType.equals("T")){ if(money < this.roomMoney){ return -1; } money -= roomMoney; return money; } return money; } } } | cs |
반응형
'공부 > Algorithm' 카테고리의 다른 글
백준 29812번 아니 이게 왜 안돼 자바로 풀어 본 짧은 글 (0) | 2023.12.01 |
---|---|
백준 11559번 Puyo Puyo 자바로 풀어 본 짧은 글 (0) | 2023.11.30 |
백준 12755번 수면 장애 자바로 풀어 본 짧은 글 (0) | 2023.11.21 |
백준 14494번 다이나믹이 뭐예요? 자바로 풀어 본 짧은 글 (0) | 2023.09.15 |
백준 1680번 쓰레기 수거 자바로 풀어 본 짧은 글 (0) | 2023.09.07 |