728x90
반응형
🚨문제
https://programmers.co.kr/learn/courses/30/lessons/42576#
🔅예제 이해
출발한 사람 배열과 도착한 사람 배열을 비교하여 결승전에 도착하지 못한 한명이 누구인지 찾아내자
☺️나의 코드
map()
, Object.values()
, Object.keys()
function solution(participant, completion) {
//1,2
const ob = {}
participant.map((a) => ob[a] ? ob[a]++ : ob[a] = 1);
//3
completion.map((a) => ob[a]--);
//4
const yetIndex = Object.values(ob).indexOf(1);
//5
const answer = Object.keys(ob)[yetIndex];
return answer;
}
❗️ 풀이 순서
- 출발한 사람의 이름을
key
값으로 객체로 만든다.value
값은 해당 이름을 가진 사람 숫자로 할것이기에 1로 해준다. - 만약 해당이름을 가진사람이 두명이면 {이름 : 2}이 될 것이다.
- 도착한 사람들의 이름을
key
값으로 찾아서 출발한 사람value
값을 감소시킨다. - 이때 도착하지 못한 사람의 이름을 가진
key
값은 1의value
를 가진다. 해당 키값의index
를indexOf
로 가져온다. keys
를 이용해key
로 배열을 만들고 4에서 가져온index
로 출발한 사람 배열에서 해당index
번째 값을 가져온다
👍우수 코드
프로그래머스에서 제공하는 다른 사람들의 코드 중 좋아요가 가장 높은 코드
// 우수코드 1번
function solution(participant, completion) {
const map = new Map();
for(let i = 0; i < participant.length; i++) {
let a = participant[i],
b = completion[i];
map.set(a, (map.get(a) || 0) + 1);
map.set(b, (map.get(b) || 0) - 1);
}
for(let [k, v] of map) {
if(v > 0) return k;
}
return 'nothing';
}
//우수코드 1번보고 내 코드 map방식 변경, map두번 안돌리고 한번만 돌림
function solution(participant, completion) {
const map = new Map();
participant.map((a, i) => {
const b = completion[i];
map.set(a, (map.get(a) || 0) + 1) ;
if(b !== undefined) map.set(b, (map.get(b) || 0) - 1) ;
});
for(let [k, v] of map) {
if(v > 0) return k;
}
}
확실히 내가 작성한 코드는 map을 두번 돌려서 그런지 속도가 100ms초과한다.
우수코드 1번과 우수코드를 반영한 내코드는 비슷한 속도를 내는 것 같다.
개인적으로 map
을 사용하는게 더 코드도 짧고, 우수코드 처럼 undefined
가 결과에 나오지 않는거 같아서, 나는 내 코드가 마음에 든다,,
❤️배운 점
object보다 map을 자주 사용해야겠다. 속도 면에서 좋은 거 같다.
https://shanepark.tistory.com/220
728x90
반응형