[JS ] 3차 방금그곡

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

     

    프로그래머스

    코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

    programmers.co.kr

    문제 접근

    • 문제의 핵심은 '#'을 어떻게 처리할 지가 관건이었습니다. 성공한 풀이는 정규표현식으로 문자열 뒤에 오는 '#'을 검색하고 해당 문자열과 '#'을 함께 소문자로 바꾸고 문제를 풀었습니다. 네오가 기억한 멜로디를 재생 시간 동안 반복된 멜로디에 split하여 나뉘면 해당되고 나뉘지 않다면 해당 곡이 아니라 판단하였습니다.
    function solution(m, musicinfos) {
      const result = {};
      const newM = m.replace(/(C|D|F|G|A)#/g, (_, p1) => p1.toLowerCase());
      for (let unit of musicinfos) {
        let [startTime, endTime, title, musicCode] = unit.split(',');
        let [startHour, startMin] = startTime
          .split(':')
          .map((v) => parseInt(v, 10));
        let [endHour, endMin] = endTime.split(':').map((v) => parseInt(v, 10));
        // 노래 재생 시간
        const playingTime = (endHour - startHour) * 60 + (endMin - startMin);
        const newMusicCode = musicCode.replace(/(C|D|F|G|A)#/g, (_, p1) =>
          p1.toLowerCase()
        );
        const musicTime = newMusicCode.length;
        const repeatNum = Math.ceil(playingTime / musicTime);
        const playingCode = newMusicCode.repeat(repeatNum).slice(0, playingTime);
    
        const playingCodeArr = playingCode.split(newM);
        if (playingCodeArr.length !== 1) {
          result[title] = playingTime;
        }
      }
    
      const resultArr = Object.entries(result);
      if (resultArr.length > 0) {
        // 재생시간 긴 순서로 정렬
        answer = resultArr.sort((a, b) => b[1] - a[1])[0][0];
      } else {
        answer = '(None)';
      }
    
      console.log(answer);
      return answer;
    }

    삽질

    실패 2 - 문자열로 처리하면 '#'의 대한 처리를 계속 해줘야 함. 엣지 케이스를 다 통과했지만 문자열로 문제를 풀면 60점 이상을 맞지 못했다...
    function solution(m, musicinfos) {
      const result = {};
      let answer = '';
      for (let unit of musicinfos) {
        let [startTime, endTime, title, musicCode] = unit.split(',');
        let [startHour, startMin] = startTime
          .split(':')
          .map((v) => parseInt(v, 10));
        let [endHour, endMin] = endTime.split(':').map((v) => parseInt(v, 10));
        let playingTime = (endHour - startHour) * 60 + (endMin - startMin);
        let musicTime = musicCode.length;
        let sharpCount = musicCode.split('#').length - 1;
        let totalCodeCount = playingTime + sharpCount;
        let repeatNum = Math.ceil(totalCodeCount / musicTime);
    
        let playingCode = musicCode.repeat(repeatNum).slice(0, totalCodeCount + 1);
        if (playingCode.slice(-1) !== '#' && playingCode.length !== 1) {
          playingCode = playingCode.slice(0, -1);
        }
        const playingCodeArr = playingCode.split(m); // ABC ABC#DF '' #DF
        if (playingCodeArr.length !== 1) {
          if (playingCode[1] && playingCode[1].slice(0) !== '#') {
            result[title] = playingTime;
          }
          if(playingCodeArr.every((el) => !el)){
            result[title] = playingTime;
          }
        }
      }
    
      const resultArr = Object.entries(result)
      if (resultArr.length > 0) {
        answer = resultArr.sort((a,b) => {
          if(a[1] > b[1]) return -1
          if(a[1] < b[1]) return 1
        })[0][0]
      } else {
        answer ='(None)';
      }
    
      console.log(answer)
      return answer
    }

    댓글