📌 문제
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
📌 제한사항
- 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
- completion의 길이는 participant의 길이보다 1 작습니다.
- 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
- 참가자 중에는 동명이인이 있을 수 있습니다.
📌 풀이
알아야 하는 것
1. 객체로 먼저 풀어보았다.
1) 빈 객체 obj를 선언했다.
2) 참가자 배열을 순회하면서 obj에 참가자 이름을 키로 할당하고 값을 1을 주었다.
만약 obj에 참가자 이름의 키가 있다면 그 키의 값을 가져와 거기에 1을 또 넣게 하기 위해 || 를 사용했다.
3) 완주자 배열을 순회하면서 obj에 그 이름이 있을 경우 값을 -1 하도록 처리했다.
obj에 참가자로 들어가 있다면 지금 -1을 했을 때 0이 나와야 한다.
4) 객체 obj를 순회하면서 obj에 0보다 큰 값을 가진 키를 찾아낸다.
function solution(participant, completion) {
const obj = {};
for (let name of participant) {
obj[name] = (obj[name] || 0) + 1;
}
for (let name of completion) {
obj[name] -= 1;
}
for (let name in obj) {
if (obj[name] > 0) {
return name;
}
}
}
2. Map으로도 풀어보았다.
1) Map을 생성한다.
2) 참가자 배열을 순회하면서 키, 값 쌍을 map에 삽입한다.
이 때 동명이인이 있을 수 있는 점을 감안해서 map에 이미 등록된 키인지 has 메서드로 확인한다. 그래서 이미 등록된 키라면 그 키의 값에 1을 더해주고, 등록되지 않은 키 (=지금 등록하려는 키)라면 0에서 1을 더해준다.
3) 완주자 배열을 순회하면서 키, 값 쌍을 map에 업데이트 한다.
완주를 했다면 참가자 배열과 완주자 배열 모두에 추가되어 있을 것이다. 그래서 1을 빼주면 정상적으로 완주한 사람은 +1 에서 -1이 되어 0이 될 것이고, 완주하지 못한 사람은 값이 0이 되지 않을 것이다. (양수)
4) let...of 루프로 map을 순회한다.
이 때 위에서 말한 것처럼 값이 0보다 큰 경우는 완주하지 못한 사람일테니, 이 값의 key를 리턴하면 완주하지 못한 사람의 이름을 얻을 수 있다.
function solution(participant, completion) {
const map = new Map();
for (let name of participant) {
map.set(name, (map.has(name) ? map.get(name) : 0) + 1);
}
for (let name of completion) {
map.set(name, map.get(name) - 1);
}
for (let [key, value] of map) {
if (value > 0) {
return key;
}
}
}
이전에 진짜 엉망으로 풀었구나... ^^
has() 메서드 자리에 논리연산자 ||으로 대체하는 게 더 간단해보이긴 한다. 근데 걍 메서드 익숙해지려고 넣었음.
'⚙️ 코딩테스트' 카테고리의 다른 글
[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 폰켓몬 (0) | 2023.06.12 |
---|---|
[JavaScript] 프로그래머스 코딩테스트 레벨 2 : 의상 (0) | 2023.06.11 |
[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 대충 만든 자판 (0) | 2023.06.07 |
[JavaScript] 프로그래머스 코딩테스트 레벨 2 : 기능 개발 (추가) (0) | 2023.06.07 |
[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 둘만의 암호 (0) | 2023.06.07 |