📌 문제 링크
https://www.acmicpc.net/problem/7785
📌 문제 탐색하기
- 회사에 출입 기록이 주어졌을 때, 현재 회사에 남아 있는 사람들을 사전 역순으로 출력해라
시간복잡도
- O(nlogn)
📌 코드 설계하기
- 문제의 입력 문자열을 개행으로 분리하여 첫 요소를 제외한 나머지를 `input`으로 가져온다.
- `Map`이나 `Set`을 선언한다.
- `input`을 순회한다.
- `input` 요소 값을 띄어쓰기로 분리하여 `name`과 `records`로 구조분해할당한다.
- `records`가 "enter" 이면
- `Map`: `name`을 키로 저장하고 값으로 `true`를 저장한다.
- `Set`: `name`을 저장한다.
- "enter"가 아니면("leave"이면) 해당 `name`을 삭제한다.
- 정답을 정렬하고 역순으로 변환 후 개행 처리하여 출력한다.
📌 시도 회차 수정 사항 (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 |