[백준] 2644 촌수계산 JavaScript

·2024년 8월 6일

문제

우리 나라는 가족 혹은 친척들 사이의 관계를 촌수라는 단위로 표현하는 독특한 문화를 가지고 있다. 이러한 촌수는 다음과 같은 방식으로 계산된다. 기본적으로 부모와 자식 사이를 1촌으로 정의하고 이로부터 사람들 간의 촌수를 계산한다. 예를 들면 나와 아버지, 아버지와 할아버지는 각각 1촌으로 나와 할아버지는 2촌이 되고, 아버지 형제들과 할아버지는 1촌, 나와 아버지 형제들과는 3촌이 된다.

여러 사람들에 대한 부모 자식들 간의 관계가 주어졌을 때, 주어진 두 사람의 촌수를 계산하는 프로그램을 작성하시오.

입력

사람들은 1, 2, 3, …, n (1 ≤ n ≤ 100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어진다. 그리고 셋째 줄에는 부모 자식들 간의 관계의 개수 m이 주어진다. 넷째 줄부터는 부모 자식간의 관계를 나타내는 두 번호 x,y가 각 줄에 나온다. 이때 앞에 나오는 번호 x는 뒤에 나오는 정수 y의 부모 번호를 나타낸다.

각 사람의 부모는 최대 한 명만 주어진다.

출력

입력에서 요구한 두 사람의 촌수를 나타내는 정수를 출력한다. 어떤 경우에는 두 사람의 친척 관계가 전혀 없어 촌수를 계산할 수 없을 때가 있다. 이때에는 -1을 출력해야 한다.

예제 입력

9
7 3
7
1 2
1 3
2 7
2 8
2 9
4 5
4 6

예제 출력

3

내가 했던 풀이 방법

  1. family 2차원 배열을 0으로 초기화한다.
  2. 입력받은 relation을 이용해 부모/자식 관계인 관계를 1로 저장해준다.
  3. visted 배열을 false로 초기화하고, queue에 [person1, 0]을 저장해준다. 이때 0은 촌수를 저장하기 위함이다.
  4. person1을 방문했다고 표시하고, answer을 -1로 초기화해준다. (answer이 변경되지 않았을 경우, 촌수를 구할 수 없음으로 판단)
  5. queue의 요소가 남아있지 않을 때까지 queue의 앞요소부터 제거한다. 제거한 배열을 current, count에 저장하고, current가 person2일 때 본인과의 촌수가 count이므로, answer를 count로 바꿔주고 반복문을 탈출한다. person2가 아닐 경우, current와 연결된 다른 인물을 queue에 count를 1 증가시킨채로 추가해준다. 이를 계속 반복한다.
  6. answer를 출력한다.

코드

const fs = require('fs');
let [n, num, m, ...relation] = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');

n = Number(n);
let person1 = Number(num.trim().split(' ')[0]);
let person2 = Number(num.trim().split(' ')[1]);
m = Number(m);

let family = Array.from({ length: n + 1 }, () => Array(n + 1).fill(0));

for (let i = 0; i < m; i++) {
  let [parent, child] = relation[i].trim().split(' ').map(Number);
  family[parent][child] = 1;
  family[child][parent] = 1;
}

let visited = Array(n + 1).fill(false);
let queue = [[person1, 0]];
visited[person1] = true;

let answer = -1;
while (queue.length > 0) {
  let [current, count] = queue.shift();

  if (current === person2) {
    answer = count;
    break;
  }

  for (let i = 1; i <= n; i++) {
    if (!visited[i] && family[current][i] === 1) {
      visited[i] = true;
      queue.push([i, count + 1]);
    }
  }
}

console.log(answer);

회고

본인 기준에서 본인이 부모인지 자식인지가 중요하겠지?라고 생각했는데 풀이하다보니 본인이 부모인지 자식인지 관계없이 거리에 따라 촌수가 따져진다는 걸 깨닳았다

profile
Frontend🍓

0개의 댓글