본문 바로가기
알고리즘/백준

백준 14674. 영우는 사기꾼?

by kastori 2021. 12. 25.
반응형

문제

 

14676번: 영우는 사기꾼?

프로그램의 입력은 표준 입력으로 받는다. 입력의 첫 줄에는 건물 종류의 개수 N, 건물 사이 관계의 개수 M, 영우의 게임 정보의 개수 K가 주어진다.(1 ≤ N, M, K ≤ 100,000) 다음 줄부터 M줄에 걸쳐

www.acmicpc.net

 

문제풀이

  • 건물을 짓는데 순서가 필요하기 때문에 위상정렬을 사용하였습니다. 
  • 명령어가 1일 경우 것물을 짓을 수 있는지 indegree배열을 확인하여 체크 하였습니다.
  • 명령어가 2일 경우 build 배열을 확인하여 0이하면 파괴할 수 없으므로 Lier!출력 아니면 1을 감소 시킵니다.

소스코드(Java)

 

baek/baek14676.java · master · kastori / algo

GitLab.com

gitlab.com

더보기
package baek;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

/**
 * 영우는 사기꾼?
 * https://www.acmicpc.net/problem/14676
 */
public class baek14676 {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		int K = Integer.parseInt(st.nextToken());

		int[] indegree = new int[N + 1];
		int[] build = new int[N + 1];
		List<Integer>[] adj = new ArrayList[N + 1];

		for (int i = 0; i <= N; i++) {
			adj[i] = new ArrayList<>();
		}

		for (int i = 0; i < M; i++) {
			st = new StringTokenizer(br.readLine());
			int x = Integer.parseInt(st.nextToken());
			int y = Integer.parseInt(st.nextToken());

			adj[x].add(y);
			indegree[y]++;
		}
		String answer = "King-God-Emperor";

		for (int i = 0; i < K; i++) {
			st = new StringTokenizer(br.readLine());
			int x = Integer.parseInt(st.nextToken());
			int y = Integer.parseInt(st.nextToken());

			// 건설
			if (x == 1) {
				//건설 불가능
				if (indegree[y] > 0) {
					answer = "Lier!";
					break;
				} else {
					build[y]++;
					if (build[y] == 1 && adj[y].size() > 0) {
						for (Integer next : adj[y]) {
							indegree[next]--;
						}
					}
				}
			}
			// 파괴
			else {
				// 건설한 적이 없는 건물
				if (build[y] == 0) {
					answer = "Lier!";
					break;
				} else {
					build[y]--;
					if (build[y] == 0 && adj[y].size() > 0) {
						for (Integer next : adj[y]) {
							indegree[next]++;
						}
					}
				}
			}
		}
		System.out.println(answer);
	}

}
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[파이썬][백준] 다각형의 면적  (0) 2022.01.25
[파이썬][백준21318] 피아노 체조  (0) 2022.01.13
백준 1863. 스카이라인 쉬운거  (0) 2021.12.24
백준 18116. 로봇 조립  (0) 2021.12.23
백준 1992. 쿼드트리  (0) 2021.12.22

댓글