[백준/BOJ] 2252 줄 세우기 - JAVA

2025. 6. 24. 17:20·알고리즘/문제풀이

[백준/BOJ] 2252 줄 세우기 - JAVA

문제

https://www.acmicpc.net/problem/2252

 

문제 분석

조건

N명의 학생과, 두 학생의 키를 비교한 M개의 정보가 주어진다.

키 비교 정보는 `A B`형태로 주어지며, A학생이 B학생보다 앞에 서야 한다는 순서 관계를 의미한다. 이 순서 관계를 모두 만족하도록 학생들을 전체 줄 세우는 문제이다.

풀이방법

이 문제는 전형적인 위상 정렬 문제이다. A학생이 B학생보다 앞에 선다는 정보를 바탕으로 `A -> B`형태의 간선을 가지는 그래프로 만들어 문제를 해결했다.

문제에서 진입차수로 작성한 inDegree는 앞에 서야 되는 학생들의 수를 의미한다.

코드

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Arrays;public class Main {    public static void main(String[] args) throws IOException {        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        int[] originMap = new int[10];        //0일 경우 << 해도 0이기 때문에 처음 1로 초기화 해줘야함        Arrays.fill(originMap, 1);        for (int r = 0; r < 10; r++) {            String line = br.readLine();            for (int c = 0; c < 10; c++) {                originMap[r] = originMap[r] << 1;                if (line.charAt(c) == 'O') {                    originMap[r] |= 1;                }            }        }        // 1줄 2^10        int T = 1 << 10;        int answer = Integer.MAX_VALUE;        for (int tc = 0; tc < T; tc++) {            int[] copyMap = Arrays.copyOf(originMap, 10);            int count = 0;            for (int c = 0; c < 10; c++) {                if (((1 << c) & tc) != 0) {                    turn(copyMap, 0, c);                    count++;                }            }            //2번째줄부터            for (int r = 1; r < 10; r++) {                for (int c = 0; c < 10; c++) {                    if (copyMap[r - 1] == T) {                        //윗줄이 전부 스위치가 꺼진 상태                        break;                    }                    if ((copyMap[r - 1] & (1 << c)) > 0) {                        turn(copyMap, r, c);                        count++;                    }                }            }            if (copyMap[9] == T) {                answer = Math.min(answer, count);            }        }        if (answer == Integer.MAX_VALUE) {            answer = -1;        }        System.out.println(answer);    }    private static void turn(int[] map, int r, int c) {        int[][] dr = {{0, 0}, {1, 0}, {-1, 0}, {0, 1}, {0, -1}};        for (int[] d : dr) {            int nextR = r + d[0];            int nextC = c + d[1];            if (nextR < 0 || nextR >= 10 || nextC < 0 || nextC >= 10) {                continue;            }            //XOR연산            map[nextR] = map[nextR] ^ (1 << nextC);        }    }}import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();

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

        List<Integer>[] graph = new List[N + 1];
        int[] inDegree = new int[N + 1];    // 진입 차수
        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int front = Integer.parseInt(st.nextToken());
            int back = Integer.parseInt(st.nextToken());
            inDegree[back]++;
            if (graph[front] == null) {
                graph[front] = new ArrayList<>();
            }
            graph[front].add(back);
        }

		// 진입 차수가 0인 노드 큐에 추가
        Queue<Integer> que = new ArrayDeque<>();
        for (int i = 1; i <= N; i++) {
            if (inDegree[i] == 0) {
                que.add(i);
            }
        }

        while (!que.isEmpty()) {
            int now = que.poll();
            sb.append(now).append(" ");

            if (graph[now] == null) {
                continue;
            }
            // 현재 노드와 연결된 노드들의 진입 차수 감소
            for (Integer next : graph[now]) {
                inDegree[next]--;
                if (inDegree[next] == 0) {
                    que.add(next);
                }
            }
        }

        System.out.println(sb.toString());
    }
}

 

728x90
저작자표시 비영리 변경금지 (새창열림)
'알고리즘/문제풀이' 카테고리의 다른 글
  • [백준/BOJ] 20058 마법사 상어와 파이어스톰 - JAVA
  • [프로그래머스] 1843 사칙연산 - JAVA
  • [프로그래머스] 86053 금과 은 운반하기 - JAVA(파라메트릭 서치)
  • [백준/BOJ] 20057 마법사 상어와 토네이도 - JAVA
LIRI
LIRI
  • LIRI
    기록
    LIRI
  • 전체
    오늘
    어제
    • 분류 전체보기 (73)
      • 블로그 꾸미기 (0)
      • Spring (6)
      • React (3)
      • CS (0)
      • 알고리즘 (57)
        • 개념 (2)
        • 문제풀이 (54)
      • Java (1)
      • DB (1)
      • log (4)
        • SSAFY (3)
        • 궁금 (1)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 공지사항

  • 인기 글

  • 태그

    SSAFY
    불 끄기
    Java
    그리디
    springboot
    dfs
    알고리즘
    Springsecurity
    백준
    도대체왜
    비트마스킹
    SSAFY 9기
    lv3
    싸피
    dp
    Security
    골드1
    LV2
    ssafy 합격 후기
    너비우선탐색
    프로그래머스
    JWT
    최장증가부분수열
    Spring
    pccp모의고사
    LIS
    리액트
    알고리즘 문제풀이
    BOJ
    BFS
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
LIRI
[백준/BOJ] 2252 줄 세우기 - JAVA
상단으로

티스토리툴바