굥뷰를 햡시댜
[2018_Blind_Kakao] 방금그곡 본문
https://programmers.co.kr/learn/courses/30/lessons/17683
코딩테스트 연습 - [3차] 방금그곡
방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV,
programmers.co.kr
문자열 처리 문제이다.
#이 붙은 문자를 다른 문자로 치환 후 부분 문자열을 찾아주면 되는 문제이다.
이 문제의 주의할 조건은 2가지이다.
- 조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다.
- 조건이 일치하는 음악이 없을 때에는 “(None)”을 반환한다.
이 2가지 조건에 유의하여 부분 문자열을 찾아주면 된다.
이 문제를 풀 때 처음 정답이 안나와서 결국 질문하기 링크를 봤는데...
누군가 문제는 C, C#, D, D#, E, F, F#, G, G#, A, A#, B 이렇게 나와있는데 E#의 경우가 빠져있다고 한 걸 보고 E#에 대해서도 치환해줬더니 맞았다....
시간을 괜히 많이 낭비한 것 같아서 허무했다 ㅠㅠ
#include <string>
#include <vector>
#include <map>
using namespace std;
// , 기준으로 문자열 파싱하는 함수
vector<string> splitString(string s) {
vector<string> ret;
while (1) {
int n = s.find(",");
if (n == -1) break;
string subStr = s.substr(0, n);
ret.push_back(subStr);
s = s.substr(n + 1);
}
ret.push_back(s);
return ret;
}
// Calculate time
int CalcTime(string t1, string t2) {
int n1 = t1.find(":");
string h1 = t1.substr(0, n1);
string m1 = t1.substr(n1 + 1);
int n2 = t2.find(":");
string h2 = t2.substr(0, n2);
string m2 = t2.substr(n2 + 1);
int hour1, hour2, minute1, minute2;
hour1 = stoi(h1);
hour2 = stoi(h2);
minute1 = stoi(m1);
minute2 = stoi(m2);
int res = 0;
if(hour1 == hour2) {
res = minute2 - minute1;
}
else {
res = ((hour2 * 60) + minute2) - ((hour1 * 60) + minute1);
}
return res;
}
string solution(string m, vector<string> musicinfos) {
string answer = "";
bool find_ans = false;
vector<pair<int, string>> ans_list;
// 일단 받은 악보 정보를 치환하자
// C, C#, D, D#, E, E#, F, F#, G, G#, A, A#, B
// C, H, D, I, E, M, F, J, G, K, A, L, B
string new_m = "";
int n = 0;
while (1) {
n = m.find("#");
if (n == -1 || n == 0) {
break;
}
string subStr = m.substr(0, n - 1);
if (m[n - 1] == 'C') {
subStr += 'H';
}
else if (m[n - 1] == 'D') {
subStr += 'I';
}
else if (m[n - 1] == 'F') {
subStr += 'J';
}
else if (m[n - 1] == 'G') {
subStr += 'K';
}
else if (m[n - 1] == 'A') {
subStr += 'L';
}
else if (m[n - 1] == 'E') {
subStr += 'M';
}
new_m += subStr;
m = m.substr(n + 1);
}
new_m += m;
for (int i = 0; i < musicinfos.size(); i++) {
vector<string> temp = splitString(musicinfos[i]);
// 악보 치환
string newNote = "";
string recvNote = temp[3];
int n = 0;
while (1) {
n = recvNote.find("#");
if (n == -1 || n == 0) {
break;
}
string subStr = recvNote.substr(0, n - 1);
if (recvNote[n - 1] == 'C') {
subStr += 'H';
}
else if (recvNote[n - 1] == 'D') {
subStr += 'I';
}
else if (recvNote[n - 1] == 'F') {
subStr += 'J';
}
else if (recvNote[n - 1] == 'G') {
subStr += 'K';
}
else if (recvNote[n - 1] == 'A') {
subStr += 'L';
}
else if (recvNote[n - 1] == 'E') {
subStr += 'M';
}
newNote += subStr;
recvNote = recvNote.substr(n + 1);
}
newNote += recvNote;
//재생 시간 계산
//temp[0] 시작 시간, temp[1] 끝난 시간
//몇 분 재생되었는지 계산할 것.
int minute = CalcTime(temp[0], temp[1]);
// 재생된 시간 만큼 악보 나열
string cmpNote = "";
for (int j = 0, k = 0; j < minute; j++, k++) {
if (k == newNote.size()) k = 0;
cmpNote += newNote[k];
}
//악보 비교 -> 부분 문자열 찾기
//new_m이 cmpNote속에 있는지 찾으면 됨
int find_index = cmpNote.find(new_m);
if (find_index != -1) {
find_ans = true;
ans_list.push_back({ minute, temp[2] });
}
}
if (find_ans) {
int playTime = 0;
for (int j = 0; j < ans_list.size(); j++) {
if (j == 0) {
playTime = ans_list[j].first;
answer = ans_list[j].second;
}
else {
if (playTime < ans_list[j].first) {
playTime = ans_list[j].first;
answer = ans_list[j].second;
}
}
}
}
else
answer = "(None)";
return answer;
}
'알고리즘 문제 풀이 > 2018 Kakao Blind 문제 풀이' 카테고리의 다른 글
[2018_Blind_Kakao] 압축 (0) | 2021.07.15 |
---|---|
[2017_Blind_Kakao] 프렌즈4블록 (0) | 2019.08.05 |
[2017_Blind_Kakao] 뉴스 클러스터링 (0) | 2019.07.30 |
[2017_Blind_Kakao] 다트 게임 (0) | 2019.07.29 |
[2017_Blind_Kakao] 비밀지도 (0) | 2019.07.29 |
Comments