[백준] 11811 데스스타 JavaScript

·2024년 4월 13일

문제

젊은 제다이 이반의 임무는 데스스타에 침투하여 파괴하는 일이다. 데스스타를 파괴하기 위해서는 길이 N의 음이 아닌 정수 수열 ai가 필요하다. 그러나 이반은 이 수열을 가지고 있지 않다. 대신 그에게는 오랜 친구 다스 베이더에게 받은 쪽지가 하나 있다. 이 쪽지에는 그 수열이 만족해야 하는 조건이 적혀 있다.

이 쪽지에는 크기 N의 정사각 행렬이 있는데, i번째 행 j번째 열에 적힌 숫자는 ai와 aj에 비트연산 and를 수행한 결과값이다. 하지만 안타깝게도 광선검에 의해 쪽지가 손상되었고 이반은 행렬의 주 대각선에 있는 숫자를 읽을 수 없게 되었다. 원래 배열을 재구성하여 임무를 수행해야 하는 이반을 도와주자.

답은 유일하지 않을 수 있지만, 항상 존재하도록 주어진다.

입력

입력의 첫 번째 줄에는 행렬의 크기 N (1 ≤ N ≤ 1 000)이 주어진다.

다음 N개의 줄에는 행렬의 각 원소인 N개의 숫자 mij (1 ≤ mij ≤ 109)가 주어진다.

출력

정확히 한 줄에 문제의 조건을 만족하는 N개의 음이 아닌 정수를 출력한다. 각 정수는 109보다 같거나 작아야 한다. 답이 여러 개인 경우 아무거나 출력한다.

예제 입력

3
0 1 1
1 0 1
1 1 0

예제 출력

1 1 1

내가 했던 풀이 방법

  1. 행렬을 돌면서 matrix[i][j]의 값을 ai[i]와 ai[j]에 각각 넣어준다. (이때 ai에 들어있는 값이 더 클 경우, 무시한다.) -> 실패 문제에서 요구한 걸 제대로 이해하지 못함.
  2. 행렬을 돌면서 matrix[i][j]를 ai[i]와 OR 연산한 값을 ai[i]보다 클 때 넣어준다. -> 성공 (and 연산에서 특정한 숫자가 나온 건 해당 숫자만큼 1은 켜져있다는 의미이므로, or연산을 통해 최소한 켜져있어야 하는 1을 알 수 있게 된다.)

※ 자바스크립트를 fs로 풀이할 경우 런타임 에러 (eacces)가 발생할 수 있다. (실제로 Node.js로 제출한 사람이 필자 포함 3명인데 전부 해당 에러부터 시작함.)

구글링해서 이유를 확인하고 다음과 같이 경로를 수정해주어서 런타임 에러를 해결했다.

코드

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

N = parseInt(N);
let ai = Array.from({ length: N }, () => 0);
let matrix = Array.from({ length: N }, () => new Array(N).fill(0));
for (let i = 0; i < N; i++) {
  input[i] = input[i].trim().split(' ');
  for (let j = 0; j < N; j++) {
    if (i === j) continue;
    matrix[i][j] = parseInt(input[i][j].trim());
    if (ai[i] < (ai[i] | matrix[i][j])) {
      ai[i] |= matrix[i][j];
    }
  }
}

console.log(ai.toString().replaceAll(',', ' '));

회고

비트 마스킹은 진짜 적응 안 되는 문제 중에 하나인 것 같다. 비트마스킹 문제를 보고 어떻게 접근해야 할지 감을 못 잡는 경우가 많은 것 같다. 비트마스킹 문제를 최대한 많이 북마크 해놓았으니.. 앞으로 많이 풀어서 익숙해지는 수밖에 없겠지..

추가적으로 이번 문제에서 틀렸습니다가 정말 많이 만났다.. 처음 2번의 틀림은 풀이 1번으로 풀었기 때문에 잘못된 풀이였지만, 그 이후부터는 알고리즘은 같은 코드였음에도 틀렸다. 처음에는 Node.js로는 풀 수 없는 문제일까 생각했다. (정답자 중에 Node.js로 풀이한 사람이 1명도 없기에..) 근데 생각해보니 배열을 그대로 출력해주었기에 출력 형식에 맞지 않아서 틀린거였다. 프로그래머스로 풀이하다보니 그냥 배열을 출력하던 습관이 생긴 것 같다. (프로그래머스 짱짱짱..) 이전에도 이런 실수를 범한 적이 있는데 앞으로 백준 풀이할 때 출력 형식에 좀 더 집중해야겠다.

profile
Frontend🍓

0개의 댓글