오늘 푼 문제
3. 보석 쇼핑 / Lv.3 / 시간: 100분(시간초과)
programmers.co.kr/learn/courses/30/lessons/67258
코딩테스트 연습 - 보석 쇼핑
["DIA", "RUBY", "RUBY", "DIA", "DIA", "EMERALD", "SAPPHIRE", "DIA"] [3, 7]
programmers.co.kr
1. 틀린 코드
function solution(gems) {
var answer = [];
let list = [...new Set(gems)];
let hash = gems.reduce((acc,cur)=> {
acc[cur] = {config:1,index:null};
return acc;
} ,{})
// console.log(list,hash);
let len = list.length;
let s = 0;
let pos = 0;
while(len){
let cur = gems[pos];
if(hash[cur].config){
hash[cur].config = 0;
len--;
}else{
if(cur===list[s]){
s++;
}
}
hash[cur].index = pos;
pos++;
}
let min=hash[list[s]].index;
// console.log('min',min,'s',s)
for(let i=0;i<s;i++){
let temp = hash[list[i]].index;
if(min>temp) min = temp;
}
let last = gems[--pos];
answer = [min+1,hash[last].index+1];
return answer;
}
[풀이]
100분이나 걸렸는데 저게 최선이었다. (8.9점임....)
결국 다른 사람의 풀이를 찾아보고 이해함.
출처 : velog.io/@diddnjs02/코딩테스트프로그래머스-보석-쇼핑
[코딩테스트]프로그래머스 - 보석 쇼핑
[본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.] 개발자 출신으로 세계 최고의 갑부가 된 어피치는 스트레스를 받을 때면 이를 풀기 위해 오프라인 매장에 쇼핑을 하러 가곤
velog.io
function solution(gems) {
var answer = [];
let num = [...new Set(gems)].length;
let gemMap = new Map();
let list = [];
gems.forEach((v,i)=>{
if(gemMap.has(v)) gemMap.delete(v);
gemMap.set(v,i);
if(gemMap.size===num) list.push([gemMap.values().next().value,i])
});
list.sort((a,b)=>{
if((a[1]-a[0]) === (b[1]-b[0])) return a[0]-b[0];
else return (a[1]-a[0]) - (b[1]-b[0])
})
answer = [list[0][0]+1,list[0][1]+1];
return answer;
}
이 풀이의 핵심은
1. js 의 Map 자료형 사용.
2. 모든 보석을 포함하는 가능한 모든 구간을 구한 뒤 구간들 중 최소 범위를 가지는 구간을 출력한다.
[Map]
Map 자료형은 순서가 저장되는 버전의 hash와 같다고 보면 된다. 기존의 보석이 재등장 할 경우 순서를 파악하기 위해 일반 객체 자료형과 배열을 같이 사용했는데 그럴 필요가 없다.
자주 쓰지 않아서 생소한 자료형이었는데 알아두면 좋을 듯.
'알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스] 2019카카오 겨울 인턴십 - 크레인 인형뽑기 / 튜플 (0) | 2021.02.04 |
---|---|
[프로그래머스] 2020카카오 인턴십 - 경주로 건설 (0) | 2021.02.03 |
[프로그래머스] 2020카카오 인턴십 - 키패드 누르기/ 수식 최대화 (0) | 2021.02.01 |
[프로그래머스] 2018 카카오 공채 - 파일명 정렬 (0) | 2021.01.28 |
[프로그래머스] 2018 카카오 공채 - n진수 게임 (0) | 2021.01.05 |