THE DEVLOG

scribbly.

자바스크립트 기본 알고리즘

2023.03.06 16:06:04

해시맵을 이용한 풀이이다.

map객체를 사용하고 싶었으나 ide가 없는 프로그래머스에서는 힘들어서...;
Object를 이용했다.

function solution(participant, completion) {
  var answer = "";
  const map = {};
  completion.forEach((element) => {
    if (map[element]) {
      map[element] = map[element] + 1;
    } else {
      map[element] = 1;
    }
  });
  for (i of participant) {
    if (map[i]) {
      map[i] = map[i] - 1;
    } else {
      answer = i;
      break;
    }
  }
  return answer;
}

completion의 갯수가 participant 갯수보다 항상 1이 작고, 동명 이인이 있을 수 있다.
이 점을 이용해서 completion으로 먼저 해시맵을 만들고,
participant를 순회하면서 하나씩 차감해나간다.

for-in은 배열가능한 객체의 key를 순회하고,
for-of는 배열가능한 객체의 element를 순회한다.
participant라는 배열의 element를 for-of로 순회하며, forEach는 break가 불가능한 반면 for-of는 break가 가능하다는 점에서 유리한 면이 있다.

Map객체를 이용하여 풀이하면 아래와 같다.

function solution(participant, completion) {
  const map = new Map();
  
  completion.forEach(name => {
    map.set(name, map.has(name) ? map.get(name) + 1 : 1);
  });

  for (const name of participant) {
    const count = map.get(name) || 0;
    if (count === 0) {
      return name;
    } else {
      map.set(name, count - 1);
    }
  }

  return null;
}

둘 간의 성능 차이는 map을 이용한 방식이 10~20% 빠르지만 효율성에서는 차이가 없었다. 둘 모두 요소에의 접근에 대해 O(1)의 시간 복잡도를 갖는다.

Object를 이용하는 경우
정확성  테스트
Test 1 〉	통과 (0.09ms, 33.5MB)
Test 2 〉	통과 (0.11ms, 33.4MB)
Test 3 〉	통과 (0.29ms, 33.4MB)
Test 4 〉	통과 (0.47ms, 33.8MB)
Test 5 〉	통과 (0.45ms, 33.7MB)
Test 6 〉	통과 (0.05ms, 33.4MB)
Test 7 〉	통과 (0.08ms, 33.6MB)
효율성  테스트
Test 1 〉	통과 (16.76ms, 53.7MB)
Test 2 〉	통과 (23.84ms, 58.3MB)
Test 3 〉	통과 (24.32ms, 62.2MB)
Test 4 〉	통과 (31.27ms, 68.9MB)
Test 5 〉	통과 (56.97ms, 71.7MB)
Submission result
정확성: 58.3
효율성: 41.7
Total score: 100.0 / 100.0
Map을 이용하는 경우
정확성  테스트
Test 1 〉	통과 (0.07ms, 33.5MB)
Test 2 〉	통과 (0.08ms, 33.4MB)
Test 3 〉	통과 (0.31ms, 33.5MB)
Test 4 〉	통과 (0.39ms, 33.6MB)
Test 5 〉	통과 (0.37ms, 33.7MB)
Test 6 〉	통과 (0.05ms, 33.4MB)
Test 7 〉	통과 (0.07ms, 33.4MB)
효율성  테스트
Test 1 〉	통과 (14.17ms, 52.4MB)
Test 2 〉	통과 (32.21ms, 59.5MB)
Test 3 〉	통과 (25.47ms, 61.8MB)
Test 4 〉	통과 (34.61ms, 64.3MB)
Test 5 〉	통과 (36.39ms, 67.1MB)
Submission result
정확성: 58.3
효율성: 41.7
Total score: 100.0 / 100.0