본문 바로가기

코딩테스트

[프로그래머스] level2. [3차] 방금 그곡 (javascript)

반응형

문제

https://programmers.co.kr/learn/courses/30/lessons/17683

나의풀이

처음에 #을 따로 처리해 주면서 만들었는데, 에러가 나서 구글링 시작했다.

다른이의 풀이 참조해서 작성한 코드

참조 : 블로그

 

프로그래머스 - 방금그곡 (javascript) [2018 카카오공채]

 

velog.io

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];
}

 

  1. '#' 을 replace로 변환시켜주고 후작업을 하는게 가장 좋아 보였다. 아니면 길이가 일정하지 않거나, 확인을 2개씩해야 하거나, 예외처리를 해줘야 되는 경우가 발생했다.
  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)";
}

 

  1. replace를 조금더 간단히 할 수 있었다.
  2. 정규식 뒤에 함수를 붙일 수 있다.

참조 :MDN

RegExp.prototype.test() : test는 해당 정규식 표현을 만족히는지 true false 로 반환한다

반응형