굥뷰를 햡시댜

[2018_Blind_Kakao] 방금그곡 본문

알고리즘 문제 풀이/2018 Kakao Blind 문제 풀이

[2018_Blind_Kakao] 방금그곡

GodZ 2021. 7. 15. 01:01

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

 

 

 

Comments