[백준/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
  • 전체
    오늘
    어제
    • 분류 전체보기 (74)
      • 블로그 꾸미기 (0)
      • Spring (6)
      • 바이브코딩 (1)
      • React (3)
      • CS (0)
      • 알고리즘 (57)
        • 개념 (2)
        • 문제풀이 (54)
      • Java (1)
      • DB (1)
      • log (4)
        • SSAFY (3)
        • 궁금 (1)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 공지사항

  • 인기 글

  • 태그

    dp
    바이브코딩
    리액트
    최장증가부분수열
    알고리즘 문제풀이
    pccp모의고사
    dfs
    ssafy 합격 후기
    느좋코딩
    커서ai
    lv3
    SSAFY 9기
    Springsecurity
    싸피
    알고리즘
    너비우선탐색
    BOJ
    springboot
    그리디
    SSAFY
    프로그래머스
    BFS
    LIS
    LV2
    Security
    Java
    Spring
    비트마스킹
    백준
    JWT
  • 최근 댓글

  • 최근 글

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

티스토리툴바