본문 바로가기

ALGORITHM

백준 2310 어드벤처 게임 (Java)

1. 문제 링크

 

2310번: 어드벤처 게임

입력은 여러 개의 미로로 주어진다. 각 미로의 첫 줄에는 미로의 방 수를 나타내는 정수 n(1 ≤ n ≤ 1000)이 주어진다. 다음 n 줄에는 각 방의 정보가 주어진다. 각 방의 정보는 방의 내용물을 나타

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

  1. Connect로 연결된 방을 이었고, Room으로 각 방의 정보를 표시했다.
  2. 1번방부터 BFS로 n번에 도착하게 했다.

문제의 테케가 꽤나 많이 부족하다.

소지금도 들고 다녀야 되는데 안 들고 다녔는데도 통과했다..왜?

코드는 일단 올리지만, 소지금도 재방문도 전부 고려하지 않았다는 점.. 언제 틀렸다고 바뀔지 모른다는 점...

 

4. 코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.io.IOException;

//30분?
public class Main {
	static class Connect {
		int num;
		Connect link;

		public Connect(int num, Connect link) {
			super();
			this.num = num;
			this.link = link;
		}
	}

	static class Room {
		String content;
		int price;

		public Room(String content, int price) {
			super();
			this.content = content;
			this.price = price;
		}
	}

	static Connect[] rooms;
	static Room[] info;
	static boolean[] visit;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		while (true) {
			int n = Integer.parseInt(br.readLine()); //미로의 방 수
			if (n == 0) {
				break;
			}

			int money = 0;
			rooms = new Connect[n + 1];
			info = new Room[n + 1];
			visit = new boolean[n + 1];

			for (int i = 1; i < n + 1; i++) {
				String[] split = br.readLine().split(" ");
				String con = split[0];
				int price = Integer.parseInt(split[1]);
				info[i] = new Room(con, price);
				for (int j = 2; j < split.length - 1; j++) {
					rooms[i] = new Connect(Integer.parseInt(split[j]), rooms[i]);
				}
			}

			Queue<Integer> queue = new ArrayDeque<Integer>();
			queue.offer(1);
			visit[1] = true;
			boolean flag = false;
			while (!queue.isEmpty()) {
				int now = queue.poll();
				if(now == n) {
					flag = true;
					break;
				}
				for (Connect c = rooms[now]; c != null; c = c.link) {
					int num = c.num;
					if (!visit[num]) { //방문하지 않은 경우
						Room temp = info[num];
						int tPrice = temp.price;
						if (temp.content.equals("L")) {
							if (money < tPrice) {
								money = tPrice;
							}
							queue.offer(num);
							visit[num] = true;
						} else if (temp.content.equals("T")) {
							if (money >= tPrice) {
								money -= tPrice;
								queue.offer(num);
								visit[num] = true;
							}
						}

					}
				}
			}
			if(flag) {
				sb.append("Yes").append("\n");
			}
			else {
				sb.append("No").append("\n");
			}
		}
		System.out.println(sb);
	}
}