땅지원
땅지원's Personal blog
땅지원
전체 방문자
오늘
어제
  • 전체 (353)
    • Frontend (2)
      • React (2)
    • Backend (90)
      • Java (16)
      • Python (19)
      • Spring (23)
      • Database (21)
      • Troubleshooting (8)
    • DevOps (27)
      • ELK (13)
    • CS (40)
    • OS (2)
      • Linux (2)
    • Algorithm (95)
      • concept (18)
      • Algorithm Problem (77)
    • 인공지능 (25)
      • 인공지능 (12)
      • 연구노트 (13)
    • 수업정리 (35)
      • 임베디드 시스템 (10)
      • 데이터통신 (17)
      • Linux (8)
    • 한국정보통신학회 (5)
      • 학술대회 (4)
      • 논문지 (1)
    • 수상기록 (8)
      • 수상기록 (6)
      • 특허 (2)
    • 삼성 청년 SW 아카데미 (6)
    • 42seoul (12)
    • Toy project (3)
    • 땅's 낙서장 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 20.11.6 BB21플러스 온라인 학술대회
  • 20.10.30 한국정보통신학회 온라인 학술대회

인기 글

태그

  • I
  • E
  • ㅗ
  • 이것이 리눅스다 with Rocky Linux9
  • D

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
땅지원

땅지원's Personal blog

Algorithm/Algorithm Problem

백준 2623 음악프로그램(위상정렬, DFS, BFS)

2022. 9. 16. 16:38
 

2623번: 음악프로그램

첫째 줄에는 가수의 수 N과 보조 PD의 수 M이 주어진다. 가수는 번호 1, 2,…,N 으로 표시한다. 둘째 줄부터 각 보조 PD가 정한 순서들이 한 줄에 하나씩 나온다. 각 줄의 맨 앞에는 보조 PD가 담당한

www.acmicpc.net

재미있는 문제였다. 각 PD들이 가수들의 무대순서를 정하고 각각 PD에 요청에 모두 부합하는 완벽한 순서를 만들어내는 것이 문제다.

 

먼저 문제를 읽고 생각을 해봤을 때 순서라는 점이 가장 Key-Point라는 생각이 들었다.

따라서 순서라는 점을 계속 기억하고 인지하기 위해 Queue, Stack이라는 자료구조를 통해서 기억했으면 좋겠다라는 생각을 했고 더 나아가서 이 자료구조를 통해서 Next step까지 생각하는거니까 DFS, BFS문제구나! 라고 최종적으로 생각했고 찾아보니까 내가 한 생각이 위상정렬이라는 알고리즘과 동일하다

 

위상정렬이라는 알고리즘을 자세하게 알진 못했지만 내가 한 생각이 그대로 이 문제의 실마리가 되었다는게 뿌듯한 문제였다.

 

BFS(Queue)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
	static int n,m;
	static List<Integer>[] board;
	static List<Integer> res;
	static int[] data;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
	
		board = new ArrayList[n+1];
		for (int i = 1; i <n+1; i++) {
			board[i] = new ArrayList<>();
		}
		
		data = new int[n+1];
		res = new ArrayList<>();
		for (int i = 0; i < m; i++) {
			String[] input = br.readLine().split(" ");
			
			for (int j = 1; j < Integer.parseInt(input[0]); j++) {
				int from = Integer.parseInt(input[j]);
				int to = Integer.parseInt(input[j+1]);
				board[from].add(to);
				data[to]++;
				}
		}

		bfs();
		
		if(res.size() == n) {
			for(Integer num:res)
				System.out.println(num);
		}
		else
			System.out.println(0);
	}
	
	
	public static void bfs() {
		Queue<Integer> queue = new ArrayDeque<>();
		for (int i = 1; i < n+1; i++) {
			if(data[i]==0)
				queue.add(i);
		}
		
		
		while(!queue.isEmpty()) {
			int v = queue.poll();
			res.add(v);
			
			for(Integer num:board[v]) {
				data[num]--;
				
				if(data[num]==0)
					queue.add(num);
			}
		}
		return;
		
		
	}

}

 

DFS(Stack) - 틀린 코드인데 왜 틀렸는지 모르겠음 ㅠ

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

public class Main{
	static int n,m;
	static List<Integer>[] board;
	static Stack<Integer> stack;
	static boolean[] visited;
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
	
		board = new ArrayList[n+1];
		for (int i = 1; i <n+1; i++) {
			board[i] = new ArrayList<>();
		}
		
		visited = new boolean[n+1];
		stack = new Stack<>();
		for (int i = 0; i < m; i++) {
			String[] input = br.readLine().split(" ");
			
			for (int j = 1; j < Integer.parseInt(input[0]); j++) {
				int from = Integer.parseInt(input[j]);
				int to = Integer.parseInt(input[j+1]);
				board[from].add(to);
				}
		}

		topologySort(0);
		
		if(stack.size() == n) {
			for (int i = 0; i < n; i++) {
				System.out.println(stack.pop());
			}
		}
		else
			System.out.println(0);
	}
	
	public static void topologySort(int depth) {
        for(int i = 1; i < n+1; i++) {
            if(!visited[i]){
                dfs(i);
            }
        }
	}
	
	
	

	public static void dfs(int depth) {
        visited[depth] = true;

        for(int v : board[depth]){
            if(!visited[v]){
                dfs(v);
            }
        }
        stack.add(depth);
    }

}

 

 

'Algorithm > Algorithm Problem' 카테고리의 다른 글

SWEA 1952 수영장(DFS, DP)  (0) 2022.09.28
백준 19238 스타트 택시(BFS, 구현)  (0) 2022.09.20
백준 3967 매직 스타(DFS)  (0) 2022.09.16
백준 20055 컨베이어 벨트 위의 로봇(구현)  (0) 2022.09.03
백준 1956 운동(Floyd-Warshall)  (0) 2022.08.28
    'Algorithm/Algorithm Problem' 카테고리의 다른 글
    • SWEA 1952 수영장(DFS, DP)
    • 백준 19238 스타트 택시(BFS, 구현)
    • 백준 3967 매직 스타(DFS)
    • 백준 20055 컨베이어 벨트 위의 로봇(구현)
    땅지원
    땅지원
    신입 개발자의 우당탕탕 기술 블로그

    티스토리툴바