반응형
문제 출처
https://school.programmers.co.kr/learn/courses/30/lessons/17683
정답 코드
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개이상이면 제일 긴제목
반응형
'알고리즘 문제 풀기' 카테고리의 다른 글
프로그래머스: 행렬 테두리 회전하기- javascript(그래프 회전) (0) | 2024.04.20 |
---|---|
프로그래머스: 수식 최대화 - javascript(정규식, 숫자 계산) (1) | 2024.04.18 |
프로그래머스: 메뉴 리뉴얼- javascript(재귀 이용한 조합, 객체) (0) | 2024.04.14 |
프로그래머스: [1차]프렌즈4블록 - javascript(그래프 이동, concat) (0) | 2024.04.13 |
프로그래머스: [3차]파일명 정렬 - javascript(정규식 끝판왕) (0) | 2024.04.11 |