백준 2252 < 줄 세우기 > JavaScript

2023. 4. 6.·☕️ 커리어 & 인터뷰 준비/코딩 테스트
목차
  1. 📍문제 링크
  2. 📍알고리즘 분류
  3. 📍문제 풀이
  4. 📍코드 (JavaScript)

📍문제 링크

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

 

2252번: 줄 세우기

첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의

www.acmicpc.net

 

📍알고리즘 분류

- 그래프 이론

- 위상 정렬

 

📍문제 풀이

N명의 학생을 줄세우려 한다. M개의 선, 후 정보가 주어질 때 모든 학생을 줄세우는 아무 방법을 출력한다

- 답이 여러개일 수 있음

 

1 <= N <= 32,000

1 <= M <= 100,000

 

이므로, naive하게 줄 세우는 방법을 시도하면 O(N * M) 만 해도 엄청난 시간이 걸린다

 

그래프에 기반한 위상 정렬로 문제를 해결할 수 있다

 

1. 먼저, 유향그래프의 인접 리스트를 생성한다

/*
{
간선형태
출발 -> 도착
  1: [],
  2: [],
  3: [],
  ...
  N: []
}
*/

 

2. 정점별 진입 차수 (간선에서 도착지가 되는 횟수) 를 기록하는 배열을 생성한다

- 인덱스를 정점 번호로 하여 횟수를 원소로 담는다

- 원소가 1 이상이라는 것은 위치가 뒤로 간다는 의미이다

- 진입 차수가 0인 정점은 반드시 존재한다 (순서가 맨 앞인 정점은 무조건 진입 차수가 0이므로)

 

3. DFS를 통해 진입 차수가 0인 정점을 순회한다

- 방문하고 나면 해당 정점의 진입 차수를 -1 해준다

- 진입 차수가 0이면 stack에 push한다

 

📍코드 (JavaScript)

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const input = [];

const dfs = (N, Graph, InDegree) => {
  const stack = [];
  const result = [];
  for (let i = 1; i <= N; i++) {
    if (!InDegree[i]) stack.push(i);
  }
  while (stack.length) {
    const currentNode = stack.pop();
    result.push(currentNode);
    Graph[currentNode].forEach((nextNode) => {
      InDegree[nextNode] -= 1;
      if (!InDegree[nextNode]) stack.push(nextNode);
    });
  }
  return result;
};

rl.on("line", (line) => {
  input.push(line.split(" ").map(Number));
}).on("close", () => {
  const [N, M] = input[0];
  const graph = {};
  // 진입 차수(간선에서 도착 횟수)를 기록할 배열
  const inDegree = Array.from({ length: N + 1 }, (_) => 0);
  // 정점 생성
  for (let i = 1; i <= N; i++) {
    graph[i] = [];
  }
  // 간선 생성 및 진입 차수 기록
  for (let i = 1; i <= M; i++) {
    const [prev, next] = input[i];
    graph[prev].push(next);
    inDegree[next] += 1;
  }
  console.log(dfs(N, graph, inDegree).join(" "));
});

 

  1. 📍문제 링크
  2. 📍알고리즘 분류
  3. 📍문제 풀이
  4. 📍코드 (JavaScript)
'☕️ 커리어 & 인터뷰 준비/코딩 테스트' 카테고리의 다른 글
  • 백준 1890 < 점프 > JavaScript
  • 백준 16236 < 아기 상어 > JavaScript
  • 백준 1655 < 가운데를 말해요 > JavaScript
  • 백준 12865 < 평범한 배낭 > JavaScript
지식물원
지식물원
지식이 자라는 식물원!
  • 지식물원
    지식물원
    지식물원
  • 전체
    오늘
    어제
    • 분류 전체보기 (510)
      • 🎨 프론트엔드 공부 (247)
        • JS & TS (86)
        • HTML & CSS (22)
        • React & Next (49)
        • Vue & Nuxt (22)
        • 기타 (68)
      • 🤓 기술 학습 & 공부 기록 (116)
        • Node.js (0)
        • Python (37)
        • 백엔드 (0)
        • 딥러닝 (1)
        • 컴퓨터 일반 (72)
        • 개발 인프라 (6)
      • 👨‍💻 프로젝트 경험 (6)
        • Work (0)
        • Toy (6)
      • ⚙️ 개발 팁 & 노하우 (21)
        • 프론트엔드 (6)
        • 기타 (15)
      • ☕️ 커리어 & 인터뷰 준비 (88)
        • 코딩 테스트 (88)
      • 📰 기술 트렌드 & 생각 정리 (4)
      • 📚 기타 (25)
        • 마케팅 (15)
        • 비개발서적 (10)
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

    • 모바일 접속 시 코드 하이라이팅 깨질 때
  • 인기 글

  • hELLO· Designed By정상우.v4.10.3
지식물원
백준 2252 < 줄 세우기 > JavaScript

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.