어흥

[백준 14676] 영우는 사기꾼? 본문

알고리즘/백준

[백준 14676] 영우는 사기꾼?

라이언납시오 2021. 10. 7. 19:42
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/14676

 

14676번: 영우는 사기꾼?

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

www.acmicpc.net

1. 주의할 점

- 위상정렬에 대해 알고 있어야 한다

- 해당 건물이 여러개 지어질 수도 있다

 

2. 구현

- Li[]를 통해 선행관계를 저장한다

- Building[]을 통해 각 건물이 지어진 수를 저장한다

- Conn[]을 통해 해당 건물을 짓기위해 선행되어야 하는 건물 수를 저장한다

- 각 조건에 따라 치트키 사용여부를 판단한다

import java.util.*;
import java.lang.*;
import java.io.*;

class Main {
    static int node,edge,k;
    static List<Integer> li[];
    static int building[];      //지은 건물의 수
    static int conn[];
    
	public static void main (String[] args) throws java.lang.Exception {
	    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	    StringTokenizer st = new StringTokenizer(br.readLine());
	    node = Integer.parseInt(st.nextToken());
	    edge = Integer.parseInt(st.nextToken());
	    k = Integer.parseInt(st.nextToken());
	    //초기화
	    li = new List[node+1];
	    building = new int[node+1];
	    conn = new int[node+1];
	    for(int i=1;i<=node;i++)
	        li[i] = new ArrayList<>();
	        
	    for(int i=0;i<edge;i++){
	        st = new StringTokenizer(br.readLine());
	        int first = Integer.parseInt(st.nextToken());
	        int sec = Integer.parseInt(st.nextToken());
	        li[first].add(sec);
	        conn[sec]++;
	    }
        String answer = "King-God-Emperor";
        for(int i=0;i<k;i++){
            st = new StringTokenizer(br.readLine());
	        int order = Integer.parseInt(st.nextToken());       //1: 건설, 2:파괴
	        int idx = Integer.parseInt(st.nextToken());
	        if(order==1){
	            if(conn[idx]>0){ //건설 불가능
	                answer = "Lier!";
	                break;
	            }
	            else{
	                building[idx]++;
	                if(building[idx]==1 && li[idx].size()>0){
	                    for(int j=0;j<li[idx].size();j++){
	                        int next = li[idx].get(j);
	                        conn[next]--;
	                    }
	                }
	            }
	        }
	        else{       //파괴
	            if(building[idx]==0) {      //건설한 적 없는 건물
	                answer = "Lier!";
	                break;
	            }
	            else{
	                building[idx]--;
	                if(building[idx]==0 && li[idx].size()>0){
	                    for(int j=0;j<li[idx].size();j++){
	                        int next = li[idx].get(j);
	                        conn[next]++;
	                    }
	                }
	            }
	        }
        }
		System.out.print(answer);
	}
}
728x90
반응형

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

[백준 21608] 상어 초등학교 (C++)  (0) 2021.10.14
[백준 9470] Strahler 순서 (Java)  (0) 2021.10.07
[백준 15900] 나무 탈출 (Java)  (0) 2021.10.07
[백준 22867] 종점 (C++)  (0) 2021.10.02
[백준 17612] 쇼핑몰 (C++)  (0) 2021.10.02
Comments