반응형
문제
https://programmers.co.kr/learn/courses/30/lessons/17683
나의풀이
처음에 #을 따로 처리해 주면서 만들었는데, 에러가 나서 구글링 시작했다.
다른이의 풀이 참조해서 작성한 코드
참조 : 블로그
function solution(m, musicinfos) {
var answer = [];
m = m
.replace(/(C#)/g,"c")
.replace(/(D#)/g,"d")
.replace(/(F#)/g,"f")
.replace(/(G#)/g,"g")
.replace(/(A#)/g,"a");
// step1. 시간 계산
for(let i = 0 ; i < musicinfos.length;i++){
musicinfos[i] = musicinfos[i].split(",")
//시간차 구하기
let time1 = musicinfos[i][0].split(":")
let time2 = musicinfos[i][1].split(":")
let difftime = (time2[0] - time1[0]) * 60 + (time2[1] - time1[1])
//#부분을 소문자로 대체
musicinfos[i][3] = musicinfos[i][3].replace(/(C#)/g,"c")
.replace(/(D#)/g,"d")
.replace(/(F#)/g,"f")
.replace(/(G#)/g,"g")
.replace(/(A#)/g,"a");
//시간에 맞추어 추가
if ( musicinfos[i][3].length > difftime){
musicinfos[i][3] = musicinfos[i][3].substring(0,difftime)
} else{
let str = ""
for( let z = 0 ; z <difftime;z++){
str += musicinfos[i][3][z%musicinfos[i][3].length]
}
musicinfos[i][3] = str
}
if (musicinfos[i][3].includes(m)){
answer.push([musicinfos[i][2],difftime])
}
}
// step2. 글자 일치하는 것 확인하기.
answer.sort((a,b)=>b[1]-a[1])
if (answer.length === 0 ) return "(None)"
return answer[0][0];
}
- '#' 을 replace로 변환시켜주고 후작업을 하는게 가장 좋아 보였다. 아니면 길이가 일정하지 않거나, 확인을 2개씩해야 하거나, 예외처리를 해줘야 되는 경우가 발생했다.
- for문 하나에서 시간 계산도 하고, 이를 통해 악보도 재배열하고 마지막으로 includes 함수로 m이 있는지 확인하는 구성이 좋았다.나도 앞으로 최대한 한번에 처리할 수 있도록 고민해보자.
다른이의 풀이
function solution(m, musicinfos) {
const getMinutes = s => s.substr(0, 2) * 60 + +s.substr(3);
m = m.replace(/\w#/g, a => a[0].toLowerCase());
let answer = musicinfos
.map(info => {
info = info.split(',');
let playMinutes = getMinutes(info[1]) - getMinutes(info[0]),
melody = info[3].replace(/\w#/g, a => a[0].toLowerCase());
melody = playMinutes > melody.length
? melody.padEnd(playMinutes, melody)
: melody.substr(0, playMinutes);
return {playMinutes: playMinutes, melody: melody, name: info[2], startTime: getMinutes(info[0])};
})
.filter(info => new RegExp(m).test(info.melody));
if (answer.length) {
if (answer.length > 1) {
answer = answer.filter(v => v.playMinutes >= Math.max(...answer.map(val => val.playMinutes)));
if (answer.length > 1) {
answer = answer.filter(v => v.startTime <= Math.min(...answer.map(val => val.startTime)));
}
}
return answer[0].name;
}
return "(None)";
}
- replace를 조금더 간단히 할 수 있었다.
- 정규식 뒤에 함수를 붙일 수 있다.
참조 :MDN
RegExp.prototype.test() : test는 해당 정규식 표현을 만족히는지 true false 로 반환한다
반응형
'코딩테스트' 카테고리의 다른 글
[프로그래머스] level3. 베스트앨범 (javascript) (0) | 2021.06.23 |
---|---|
[프로그래머스] level1. 약수의 개수와 덧셈(javascript) (0) | 2021.06.23 |
[프로그래머스] level2. 소수 찾기 (javascript) (0) | 2021.06.15 |
[프로그래머스] level3. 네트워크 (javascript) (2) | 2021.06.11 |
[프로그래머스] level2. 124나라의 숫자(javascript) (0) | 2021.06.11 |