Language/C++
[프로그래머스][Level2][C++][String] 2018 KAKAO BLIND RECRUITMENT[3차] - 방금 그곡 - 컴도리돌이
컴도리돌이
2021. 8. 21. 09:00
728x90
- 처음 구현할 때 어렵지 않게 코드를 작성했지만, 생각보다 어렵게 걸렸다.
- #에 대한 처리를 하지 않아서 다른 분의 코드를 참고해서 치환이라는 좋은 아이디어가 있어 #이 붙어진 음표를 소문자로 치환을 했다.
- 치환을 하고 나서 아직도 여러 테스트 케이스에서 오답처리가 되어서 뭐가 문제일까 고민을 하다가,, 음악의 치환 위치를 잘못 선정하여 여러 테스트 케이스에서 오답에 생겼던 거다.
- 하지만 위치 선정을 하고 나서도 15,29,30번에서 테스트 케이스에서 오답이 되어서 매우 어려움을 겪고 있었다.
- 차근차근 문제를 읽어봤다.
- 음악이 없을 때 (None) 처리를 했는가 -> answer = "(None)" (O)
- 기억하는 멜로디와 주어진 음악을 치환을 했는가? -> change(m) , change(melody) (O)
- 주어진 음악보다 시간이 클 때 반복적으로 처리했는가? 또는 시간이 작을 때는 부분적으로 처리했는가? -> while(real.size() <time) real += melody; real = real.substr(0, time); (O)
- 재생 시간이 같을 경우 먼저 입력된 악보를 먼저 선택했는가? -> max < real.size() (O)
- 모든 경우의 수를 체크했지만 모두 다 정확하게 처리했다. 그럼 처음 시간과 음악 제목과 음악을 잘 못 선정했는지? (X)
#include <string>
#include <vector>
#include <cstdlib>
using namespace std;
void change(string& ss)
{
for(int i=0; i<ss.length();)
{
if(ss[i] == '#') ss[i-1] = tolower(ss[i-1]),ss.erase(ss.begin() + i);
else i++;
}
}
string solution(string m, vector<string> musicinfos) {
string answer = "(None)";
int max = 0;
change(m);
for(auto v : musicinfos)
{
int shh = stoi(v.substr(0,2))*60,
smm = stoi(v.substr(3,2)),
ehh = stoi(v.substr(6,2))*60,
emm = stoi(v.substr(9,2)),
time = abs(ehh + emm) - abs(shh + smm);
string info = v.substr(12),
title= info.substr(0,info.find(',')),
melody= info.substr(info.find(',')+1),
real = "";
change(melody);
real = melody;
while(real.size() < time) real += melody;
real = real.substr(0,time);
if(real.find(m) != string :: npos)
if(max < real.size())
max = real.length(), answer = title;
}
return answer;
}
int main(void)
{
cout << solution("ABCDEFG",{"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"}) << endl;
cout << solution("CC#BCC#BCC#BCC#B",{"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"}) << endl;
cout << solution("ABC",{"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"});
cout << solution("ADC",{"11:56,12:43,DD,ADC#AD", "14:32,16:23,ZZ,ADC#ADC#"});
cout << solution("AA",{"11:00,11:34,AA,ABBCCA#A#A#AB#", "11:08,11:13,BB,ABC#D#"});
}