백준 20364 < 부동산 다툼 > JavaScript

2022. 12. 26.·☕️ 커리어 & 인터뷰 준비/코딩 테스트

📍문제 링크

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

 

20364번: 부동산 다툼

첫 번째 줄에 땅 개수 N과 꽉꽉나라에 사는 오리 수 Q가 공백으로 구분되어 주어진다. (2 ≤ N < 220, 1 ≤ Q ≤ 200,000) 두 번째 줄부터 차례로 Q개의 줄에 걸쳐 i+1번째 줄에는 i번째 오리가 원하

www.acmicpc.net

 

📍알고리즘 분류

- 트리

 

📍문제 풀이

- 왼쪽 자식 노드가 부모 노드 * 2

- 오른쪽 자식 노드가 부모 노드 * 2 + 1

이상의 규칙을 만족하는 트리를 만들고, 노드 번호가 적힌 배열을 순회하며 dfs를 진행하는 방법을 떠올렸지만,

노드의 갯수가 2^20 개가 될 수 있기 때문에 시간초과가 발생할 것이다.

 

따라서 전체 트리 탐색은 1번만 실행해야  한다.

 

대신 노드 번호가 적힌 배열을 순회하며, 해당 노드에서 루트(1번 노드)까지 가는데, 도중에 이미 탐색을 실시한 노드 번호를 마주치는지를 확인하면 된다.

 

📍코드 (JavaScript)

const [in1, ...in2] = require("fs")
  .readFileSync("/dev/stdin")
  .toString()
  .trim()
  .split("\n");

const [vertexNum, duckNum] = in1.split(" ").map(Number);
const targetArr = in2.map(Number);
const answer = Array(duckNum).fill(0);
const isOpen = Array(vertexNum + 1).fill(true);

for (let i = 0; i < duckNum; i++) {
  let current = targetArr[i];

  while (current !== 1) {
    if (!isOpen[current]) {
      answer[i] = current;
    }
    current = Math.floor(current / 2);
  }
  if (answer[i] === 0) isOpen[targetArr[i]] = false;
}

console.log(answer.join("\n"));

 

📍리뷰

- 주의할 점은, 처음, 이미 점유된 노드를 마주쳤을 때, while 문을 break하면 안된다.

원래 문제는 루트 노드에서 시작하여 처음 만난 점유된 노드 번호를 출력하는 것이기 때문에, 밑에서 거슬러 올라올 때는, 루트까지 가면서 마주친 점유된 노드 번호를 업데이트 해줘야 한다.

 

그래야 루트에서 내려가면서 처음 마주친 노드를 기록할 수 있다

'☕️ 커리어 & 인터뷰 준비/코딩 테스트' 카테고리의 다른 글
  • 백준 21921 < 블로그 > JavaScript
  • 백준 22945 < 팀 빌딩 > Python
  • 백준 14627 < 회사 문화 1 > JavaScript
  • 백준 9019 < DSLR > JavaScript
지식물원
지식물원
지식이 자라는 식물원!
  • 지식물원
    지식물원
    지식물원
  • 전체
    오늘
    어제
    • 분류 전체보기 (516) N
      • 🎨 프론트엔드 공부 (253) N
        • JS & TS (92) N
        • 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
지식물원
백준 20364 < 부동산 다툼 > JavaScript
상단으로

티스토리툴바