[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
}

댓글