일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 클로저
- image component
- 리액트
- iron-session
- @tailwind base
- createbrowserrouter
- revalidatepath
- supabase realtime
- 프로그래머스
- @tailwind
- static pages
- sever components
- unstable_nostore
- RECOIL
- client components
- 3진법 뒤집기
- @tailwind components
- SSR
- interceptor routes
- CSS
- revalidatetag
- commit phase
- server components
- js
- 타입스크립트
- render phase
- 자바스크립트
- sever action
- @tailwind utility
- dynamic pages
- Today
- Total
개발하는 너구리
TIL-23.04.07 본문
프로그래머스 완주하지 못한 선수
문제점
이 문제는 특이하게 정확성테스트 & 효율성테스트 검사를 한다
즉, 작성한 코드가 얼마나 정확하고, 시간이 오래걸리지 않는지를 검사했다. 처음에 내가 작성한 코드는
const solution = (participant, completion) => {
completion.map((a) => {
let index = participant.indexOf(a);
participant.splice(index, 1);
});
return participant.join('');
};
completion 배열에서 map을 돌려 각 요소가 participant 배열 중 위치한 인덱스를 찾아 splice메소드를 사용해 잘라내 버렸다.
splice메소드는 원본 배열을 변형하므로 마지막 반환값으로 완주하지못한 사람의 이름을 반환했다
처음에 작성한 코드는 정확성테스트는 모두 통과하였으나, 효율성테스트를 전부통과하지못했다 (시간초과..)
코드 내에 반복하는 구문이 map() / indexOf() 이 두개가 배열을 반복해대니 시간이 초과된다고 생각했다
시도해본것 & 해결
Map객체를 이용해보자!
배열은 해당 요소를 찾기위해서 인덱스0부터 검색해야하지만, Map객체는 key값만 알고있으면 바로 value를 즉각 뽑아낼수있다는걸 생각해냈다. 그러면 시간이 줄것이라 생각했다
const solution = (participant, completion) => {
const myMap = new Map();
let answer;
participant.map((a) => {
myMap.get(a) ? myMap.set(a, myMap.get(a) + 1) : myMap.set(a, 1);
});
completion.map((a) => {
myMap.get(a) && myMap.set(a, myMap.get(a) - 1);
});
participant.map((a) => {
myMap.get(a) && myMap.get(a) === 1 ? (answer = a) : null;
});
return answer;
};
Map객체를 이용해보자! 생각하고 작성한 코드
먼저 Map객체를 한개를 만들어놓고, participant(참가자)배열의 요소들을 Map객체에 세팅했다
해당 알고리즘 문제 제한사항에 동명이인이 있을수있다는 조건이 있어, 그것또한 체크해야했다
Map객체에 set하기 전 해당 키값으로 value를 조회해본후 있다면 value를 +1씩 해주는걸로 중복을 기록했다
그리고, completion(완주자)배열에 있는 요소의 value는 -1 을 해주며 participant(참가자) 명단에서 빼나갔다
이런식으로 Map.get() / set()을 사용하며 해당 key값으로 처음부터 반복을 돌지않고 즉각적으로 value를 가져올수있으니 시간적으로 덜 걸렸다. 그래서 결과적으로 효율성테스트 마저도 통과해 해당 알고리즘 문제를 해결할수있게되었다
알게된점
for() / forEach() / for..in / for..of / map() / filter() 등등...
일단 한번 반복을 돌려볼까?..라는 생각이 들면 바로 적는 것들이다.. 비록 문제는 해결할순 있겠으나, 프로젝트를 진행할때 이러한 반복 메소드들만 쓰다보면 이게 쌓이고 쌓여 결국은 소중한 프로젝트 결과물을 느리게 만드는게 아닐까? 라는 생각이 들었다
아직은 내가 너무 반복메소드들에만 익숙하고 그것만 사용해왔기에 이 점을 반성해야겠다.
'TIL' 카테고리의 다른 글
TIL-23.04.10 (0) | 2023.04.11 |
---|---|
TIL-23.04.09 (0) | 2023.04.08 |
TIL-23.04.06 (0) | 2023.04.06 |
TIL-23.04.05 (0) | 2023.04.06 |
TIL-23.04.04 (0) | 2023.04.05 |