새소식

Programmers

[Programmers] [3차] 방금그곡 문제 - (javascript)

  • -
728x90
문제 이름 :  [3차] 방금그곡

 

<<< 문제 내용 >>>

 


 

function solution(m, mi) {
    let answer =[];
    
    // 샵들 소문자로 변경해서 1칸만 차지하게끔 변경
    const toReplace = (value) => {
        return value.replace(/C#/g,'c')
            .replace(/D#/g,'d')
            .replace(/F#/g,'f')
            .replace(/G#/g,'g')
            .replace(/A#/g,'a');
    }
    
    // 12:04 같은 것을 분으로 바꾸기
    const timeToSecond = (time) => {
        time = time.split(':').map(Number);
        
        return time[0]*60+time[1];
    }
    
    // 분으로 바꾼 시간 빼서 재생된 시간 구하는 함수
    const divideTime = (time1, time2) => {
        return timeToSecond(time1)-timeToSecond(time2);
    }
    
    // 먼저 m부터 바꿔주고
    m = toReplace(m);
    
    // musicInfo에 [음악제목, 재생시간, 악보정보]를 넣어준다.
    // 이때 악보정보가 재생된 시간보다 짧으면
    // 악보정보를 repeat으로 반복해서 늘려주고
    // slice로 재생된 시간만큼 잘라주었다.
    const musicInfo = [];
    mi.map((el)=> {
        el = el.split(",");
        const time = divideTime(el[1], el[0]);
        el[3] = toReplace(el[3]);
        const musicLen = el[3].length;
        
        if(time>musicLen){
            const temp = Math.floor(time/musicLen)+1;
            el[3] = el[3].repeat(temp);
        }
        el[3] = el[3].slice(0, time);
        musicInfo.push([el[2], time, el[3]]);
    })
    
    // 이 부분부터 하드코딩이 시작되었는데
    // answer에 [음악제목, 재생시간]을 넣어주고
    // max에는 각 재생시간을 다 넣어서 max숫자를 구하기위함이다.
    // 어쨋든, m이 악보에 있는지 확인해서 있다면 넣어준다.
    const max = [];
    musicInfo.map((el)=> {
        if(el[2].includes(m)) {
            answer.push([el[0], el[1]]);
            max.push(el[1]);
        }
    })
    
    // 재생시간이 제일 큰 값을 구해주고,
    // check으로 재생시간이 같은게 있을 때 맨 앞 수만 찾기위해
    // check를 썼다. 근데 아래 answer.map에서 map을 멈출때
    // break, return이 다 안먹히던데 어떻게 해야할지 아직 찾지 못했다.
    const maxNum = Math.max(...max);
    let check = true;
    
    // 0개 1개 2개이상 일 때를 각각 처리했다.
    if(answer.length===0) answer = "(None)";
    else if(answer.length===1) answer = answer[0][0];
    else if(answer.length>=2){
        answer.map((el)=> {
            if(el[1] === maxNum && check) {
                answer = el[0];
                check = false;
            }
        })
    }
    
    return answer;
}

 

 

도움이 되셨다면 공감 부탁드립니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.