본문 바로가기

코딩/알고리즘

백준) 7785 - 회사에 있는 사람 JS

📌 문제 링크

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


📌 문제 탐색하기

  • 회사에 출입 기록이 주어졌을 때, 현재 회사에 남아 있는 사람들을 사전 역순으로 출력해라

시간복잡도

  • O(nlogn)

📌 코드 설계하기

  1. 문제의 입력 문자열을 개행으로 분리하여 첫 요소를 제외한 나머지를 `input`으로 가져온다.
  2. `Map`이나 `Set`을 선언한다.
  3. `input`을 순회한다.
  4. `input` 요소 값을 띄어쓰기로 분리하여 `name`과 `records`로 구조분해할당한다.
  5. `records`가 "enter" 이면
    • `Map`: `name`을 키로 저장하고 값으로 `true`를 저장한다.
    • `Set`: `name`을 저장한다.
  6. "enter"가 아니면("leave"이면) 해당 `name`을 삭제한다.
  7. 정답을 정렬하고 역순으로 변환 후 개행 처리하여 출력한다.

📌 시도 회차 수정 사항 (Optional)

1회차

  • `Map.prototype.keys()`을 사용했기 때문에 Iterator 객체를 반환하므로 배열이 아닌데 `sort()` 메소드를 사용해서 틀렸다.
  • Iterator를 배열로 변환해서 사용해야 한다.
// 방법 1: Array.from() 사용
const array1 = Array.from(iterator);

// 방법 2: 전개 연산자(...) 사용
const array2 = [...iterator];

📌 정답 코드

문제는 출입여부만을 판단하기에 `Map`보단 `Set`으로 푸는 것이 더 간단하고 적합한 것 같다.

  • `Map`: 키-값 쌍을 저장. `set(name, true)`에서 값(true)은 불필요하며 단순히 존재 여부를 나타냄.
  • `Set`: 중복 없는 데이터 저장.

 

`Map`으로 푼 문제

//https://www.acmicpc.net/problem/7785
export {};

const fs = require("fs");
const filePath =
  process.platform === "linux" ? "/dev/stdin" : __dirname + "/input1.txt";
const [_, ...input] = fs.readFileSync(filePath).toString().trim().split("\n");

const map = new Map();
for (const x of input) {
  const [name, records] = x.split(" ");
  if (records === "enter") {
    map.set(name, true);
  } else {
    map.delete(name);
  }
}
console.log([...map.keys()].sort().reverse().join("\n"));

 

`Set`으로 푼 문제

//https://www.acmicpc.net/problem/7785
export {};

const fs = require("fs");
const filePath =
  process.platform === "linux" ? "/dev/stdin" : __dirname + "/input1.txt";
const [_, ...input] = fs.readFileSync(filePath).toString().trim().split("\n");

const set = new Set();
for (const x of input) {
  const [name, records] = x.split(" ");
  if (records === "enter") {
    set.add(name);
  } else {
    set.delete(name);
  }
}
console.log([...set].sort().reverse().join("\n"));

 

'코딩 > 알고리즘' 카테고리의 다른 글

백준) 2747 - 피보나치 수 JS  (0) 2024.11.21
백준) 10815 - 숫자 카드 JS  (0) 2024.11.20
백준) 28279 - 덱 2 JS  (1) 2024.11.18
백준) 18258 - 큐2 JS  (0) 2024.11.17
백준) 10828 - 스택 JS  (0) 2024.11.16