알고리즘 문제 풀기

프로그래머스: [3차]방금그곡 - javascript(빡구현)

Fo_rdang 2024. 4. 16. 12:05
반응형

문제 출처 

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

 

프로그래머스

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

programmers.co.kr

 

정답 코드 

test case 하나 틀림.. 찾을 수가 없음..

function solution(m, musicinfos) {
    let answer = []; 
    m = transMelody(m)
    
    musicinfos.forEach((music) => {
       let [start, end, title, melody] = music.split(',')
       melody = transMelody(melody)
       let time = calTime(start, end)
       let new_melody = ''
       if(melody.length > time) new_melody = melody.slice(0, time)
       else if(melody.length === time)  new_melody = melody
       else{
           let num = Math.ceil(time/melody.length)
            new_melody = melody.repeat(num).slice(0, time)
       }

        if(new_melody.includes(m)) answer.push([title, time])
 
    })
    
    //내림차순 정렬 
    answer.sort((a,b) =>  {
        if(a[1] < b[1]) return 1 
        else if(a[1] > b[1]) return -1 
        else return 0 
    })
    
    return answer.length === 0 ? "(None)": answer[0][0] 
    
    function calTime(str1, str2){
        let [h, m] = str1.split(':')
        let [hh, mm] = str2.split(':')
        let amount = (hh*60 + mm*1) - (h*60 + m*1) 
        return amount
    }
    function transMelody(str){
      return str.replace(/C#/g,'c')
                 .replace(/D#/g,'d')
                 .replace(/F#/g,'f')
                 .replace(/G#/g,'g')
                 .replace(/A#/g,'a')
        
    }
}
//m과 musicinfos의 악보를 소문자로 바꾸는 함수 
//musicinfos의 노래를 곡 길이 만큼 수정한다. 
//해당하는 m이 있는지 확인한다. 
//let answer에 넣고, 길이 긴 순서로 내림차순, 맨 앞에꺼 출력

 

알고가는 ppoint

01. 정규식 test 

let m = 'abc'

let str = 'sadfsfsdfsabc'

let reg = new RegExp(m)

if(reg.test(m)){

 console.log('존재합니다. ')

}

 

 

02. sort 정렬 (사전순 정렬 빠른 순) 

function compareFunction(a, b) {
    if (a < b) {
        return -1; // a가 b보다 앞에 위치하도록 함
    } else if (a > b) {
        return 1; // a가 b보다 뒤에 위치하도록 함
    } else {
        return 0; // a와 b가 같은 값임을 나타냄
    }
}

 

근데, 문자 사전순 정렬은 그냥 sort() 하면됨 

let numbers = [5, 3, 8, 1, 2];

numbers.sort(function(a, b) {
    if (a > b) {
        return -1; // a를 b보다 앞에 위치시킴
    } else if (a < b) {
        return 1; // a를 b보다 뒤에 위치시킴
    } else {
        return 0; // a와 b가 같은 값임을 나타냄
    }
});

console.log(numbers); // [8, 5, 3, 2, 1]

 

02-1. sort 정렬 (숫자 오름차순 정렬)

let numbers = [5, 3, 8, 1, 2];

numbers.sort(function(a, b) {
    if (a > b) {
        return 1; // a를 b보다 뒤에 위치시킴
    } else if (a < b) {
        return -1; // a를 b보다 앞에 위치시킴
    } else {
        return 0; // a와 b가 같은 값임을 나타냄
    }
});

console.log(numbers); // [1, 2, 3, 5, 8]

 

02-2 sort 정렬 (숫자 내림차순 정렬) 

let numbers = [5, 3, 8, 1, 2];

numbers.sort(function(a, b) {
    if (a > b) {
        return -1; // a를 b보다 앞에 위치시킴
    } else if (a < b) {
        return 1; // a를 b보다 뒤에 위치시킴
    } else {
        return 0; // a와 b가 같은 값임을 나타냄
    }
});

console.log(numbers); // [8, 5, 3, 2, 1]

 

나의 틀린 풀이 코드 (3개는 맞고, 전체에서 틀림;)

function solution(m, musicinfos) {
    let result = []; 
    
    for(let info of musicinfos){
      let [start, end, music, song] = info.split(',')
      let [sm, ss] = start.split(":"); 
      let [em, es] = end.split(":");
      let time = (em*60+es) - (sm*60+ss) 
      let cnt = 0;
           song = song
                    .replace(/(C#)/g,'c')
                    .replace(/(D#)/g,'d')
                    .replace(/(F#)/g,'f')
                    .replace(/(G#)/g,'g')
                    .replace(/(A#)/g,'a')
        console.log(song, 'song')
        let temp = ''; 
        if(time > song.length){
          let plus = time - song.length //음 몇개를 붙여야 하는지 
          let minus = Math.ceil(plus/song.length)+1 //음 몇번을 붙여야 하는지
             temp = song.repeat(minus).slice(0,time)
         }else if(time < song.length){
             temp = song.slice(0, time)
         }else{
             temp = song.slice()   
             console.log(temp, "3")
         }
        
        m = m
            .replace(/(C#)/g,'c')
            .replace(/(D#)/g,'d')
            .replace(/(F#)/g,'f')
            .replace(/(G#)/g,'g')
            .replace(/(A#)/g,'a')
        
        let regex = new RegExp(m); 
        if(regex.test(temp)){
            result.push(music); 
        }
    }
    if(result.length === 0) return "None"
        else if(result.length === 1) return result.shift(); 
        else{
          let answer = result.sort((a,b) => {
                a.length - b.length
            })
          return answer.pop()
        }
}
//음악 제목 정보 제공 
//멜로디로 음악 찾기 
//한음악 반복 재생할 때도 있음 => 음악 끝부분과 처음부분이 이어서 재생된 멜로디일 수 있음 
//한음악 중간에 끊을 때도 있음 => 그 멜로디가 그 곡이 아닐 수 있음 
//기억한 멜로디 와 재생 시간과 제공된 악보로 비교해야함 !!!! 

//각음은 1분에 1개씩 
//음악은 재생된 시간이 더 길 때는 음악은 다시 처음부터 반복 재생 
//?음악이 00:00를 넘기지 않음 
//조건 일치하는 음악 여러개일땐, 재생된 시간이 제일 긴 음악 제목 반환 
//조건 일치하는 음악 없을 땐 "(None)" 반환 
//?음악이 00:00를 넘겨서까지 재생되는 일은 없다.

//m은 음 
//곡의 정보 musicinfos (음악시작, 음악끝, 음악제목,악보정보)

//musicinfos 각 배열을 돌려서 판단한다. 
//시간이 더 길 때 =>  해당 음을 그 시간 길이 만큼 이어 붙이기 
//음악 음이 더 길 때 => 음을 그 시간만큼 slice 자르기 
// 여기서 구한 음에서 m이 있는지 정규식을 통해 찾아보자. 
//만약 있다면 result 빈 배열에 해당 음악 제목을push 
// return result가 빈 배열이면, "None" , 1개면 그거 하나, 2개이상이면 제일 긴제목

 

반응형