[JS][프로그래머스 -LEVEL 2 -방금그곡]

정대만·2023년 7월 18일

코딩테스트

목록 보기
26/51
post-thumbnail

문제 해석

곡은 14분 동안 반복된다고 생각한다. 지금 곡은 7분짜리여서 2번더 돌수 있다.
이 2번 돈 곡중에 m 이 포함되어있나 아닌가를 확인하는 문제이다.

내가 푼

  • #을 어떻게 구분할수 있을끼? 가 메인 인 코딩 문제이다. 이때 나는
    sp;it' 으로 하나씩 자르고 # 이 오는 경우면 그전에 왔던 숫자에다가 > # 을 붙여야된다고 생각을했었다.
  • 따라서 # 이 붙어진 문자열을 통해서 만들어진 .. 노래가 일치하는 부분이 있는지 확인해야된다.

오류가 발생한 구역

  • 시간에 맞혀서 만든 곡과 > m 이 같은가? 이때 오류가 발생하였다. 나는 배열형식으로 만들었기 때문에 포인터를 활용하면서 > 같은 m 이 있는 부분을 잘라야된다고 생각을 했었는데 <- 이 포인터를 같은게 없을 경우 index =0 으로 다시 처음부터 구분해주세요 라고 적었다. 근데 ... 정규식에는 이렇게 괴상한 식을 안쓰고 test 를 이용하면 금방 풀리는것을 발견하였다.. omg.....
  • parseInt 룰 사용해서 문자열을 숫자로 만들어서 계산해야된다.
function solution(m, musicinfos) {
    var answer = '';
    var count_max=0;
    var name_count=''
   const hey_shap= function(go_string){
       var return_Ar=[];
        for(var ig=0; ig<go_string.length; ig++){
            if(go_string[ig]=='#'){
                return_Ar.push(return_Ar.pop()+'#');
            }
            else{
                 return_Ar.push(go_string[ig]);
            }
        }
       return return_Ar;
   }

    m=hey_shap(m);
  
   
    for(var i=0; i<musicinfos.length; i++){
        var [fisrt,end,name,music]=musicinfos[i].split(',');
        var point=0;
        var [first_time,first_second]=fisrt.split(':');
        var [second_time,second_second]=end.split(':');
      
   
        var remain= (
            (parseInt(second_time*60) +parseInt(second_second))-(parseInt(first_time*60) +parseInt(first_second)))
         music=hey_shap(music);
         console.log(remain,'time')
        if(remain/ music.length >=1){
            var origin= music
              while(music.length<remain){
                   music.push(origin[point]);
                   point++;
                   if(point==origin.length){
                       point=0;
                   }
              }
        }
        if(remain-music.length <1){
            music=music.slice(0,remain)
        }

        console.log(music)
        //확인하는거요 
        var pointer=0;
        for(var go_i=0; go_i<music.length; go_i++)
            {
                if(m[0]==music[go_i]){
                     if(m.join('')== music.slice(go_i,go_i+m.length).join('')){
                         if(count_max<music.length){
                             count_max=music.length;
                             name_count=name;
                         }
                     }
                }
              
                
            }
        
        
    }
    if(name_count==''){
        return '(None)'
    }
    return name_count
}


다른 사람

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)";

일치 테스트

정규표현식에는 여러가지 메서드가 존재하는데 이번에는 가장단순한 메서드인 test에 대해서 알아보겠습니다.
이 메서드에 문자열을 전달하면 문자열이 정규 표현식의 패턴과 일치하는지 알려주는지 불리언을 반환하는 메서드입니다.

console.log(/abc/.test("abcde));
// 결과 : true
console.log(/abc/.test("abxde));
// 결과 : false

다른 사람풀이

는 정규식을 이용한 풀이가 많았다. 사실상 내가 푼 코드는 드럽고 잘 알고리즘을 모르는 사람처럼 짠것이였다..^^;; 정규식 을 이용해서 효율적으로 풀어보자...

  • padEnd 함수 사용 == >

  • new RegExp(m).test(info.melody)) 을 이용해서 하던가

    을 이용해서 포함하고 있는지 확인하는 방법도 있다.

profile
안녕하세요

2개의 댓글

comment-user-thumbnail
2023년 7월 18일

좋은 글 감사합니다!

답글 달기
comment-user-thumbnail
2023년 7월 18일

글이 많은 도움이 되었습니다, 감사합니다.

답글 달기