https://programmers.co.kr/learn/courses/30/lessons/17683
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
using namespace std;
// 차이시간 구하기
int difftime(string start, string end)
{
int hour_dif = stoi(end.substr(0, 2)) - stoi(start.substr(0, 2));
int min_dif = stoi(end.substr(3, 2)) - stoi(start.substr(3, 2));
return 60 * hour_dif + min_dif;
}
// 샾노트 -> 소문자로 변경
void transform_sharp(string &sheet)
{
int idx = 0, sheet_len = sheet.size();
string n_sheet;
while (idx < sheet_len)
{
if (sheet[idx + 1] == '#')
{
n_sheet += sheet[idx] + ('a' - 'A');
idx += 2;
}
else
{
n_sheet += sheet[idx];
idx += 1;
}
}
sheet = n_sheet;
}
string solution(string m, vector<string> musicinfos) {
// 들은노래 : 샾노트 -> 소문자로 변경
transform_sharp(m);
int max_time = 0;
string music_name = "(None)";
for (string line : musicinfos)
{
// 시작시각, 종료시각, 노래제목, 악보 파싱
stringstream ss(line);
string start, end, name, sheet;
getline(ss, start, ',');
getline(ss, end, ',');
getline(ss, name, ',');
getline(ss, sheet, ' ');
// 악보 : 샾노트 -> 소문자로 변경
transform_sharp(sheet);
// 재생된 시간 구하기
int time = difftime(start, end);
int sheet_len = sheet.size();
int full = time / sheet_len;
int part = time % sheet_len;
// 재생된 시간만큼 재생된 노래 문자열 만들기
string new_sheet = "";
for (int i = 0; i < full; ++i)
{
new_sheet += sheet;
}
new_sheet += sheet.substr(0, part);
// 재생된 노래가 들은 노래 m을 포함하고, 재생시간이 max_time보다 클때 노래제목 저장
if (new_sheet.find(m) != string::npos && max_time < time)
{
max_time = time;
music_name = name;
}
}
return music_name;
}
아...진짜 오래 걸려서 풀었다ㅋㅋ
이 문제의 관건은 문자열 처리를 어떻게 하냐- 인것 같다.
TIP
#노트를 먼저 처리해야 한다.
A#은 2글자지만 한 묶음이다.
HELLO 안에 있는 ABC#은 기억한 멜로디인 ABC와 일치하지 않고, WORLD 안에 있는 ABC가 기억한 멜로디와 일치한다.
문자가 총 12개이기 때문에, 벡터에 담아서 인덱스 숫자로 치환하기엔 좀 번거롭다.
따라서 #노트는 소문자로 처리해주는게 편리하다.
TIP2
괜히 시간 차이 계산해야 한다고 함수 뭐 있나 뒤적뒤적 거릴 시간에
그냥 빨리 substr() stoi() 같이 기초적인 함수 사용해서 계산하는게 훨씬 낫다..
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스]2018 KAKAO BLIND RECRUITMENT : 파일명 정렬 (level 2)(c++) (0) | 2020.05.26 |
---|---|
[프로그래머스]2018 KAKAO BLIND RECRUITMENT : 압축 (level 2)(c++) (0) | 2020.05.26 |
[프로그래머스]2019 KAKAO BLIND RECRUITMENT : 후보키 (level 2)(c++) (0) | 2020.05.25 |
[프로그래머스]2019 KAKAO BLIND RECRUITMENT : 오픈채팅방 (level 2)(c++) (0) | 2020.05.25 |
[프로그래머스]2018 KAKAO BLIND RECRUITMENT : 캐시 (level 2)(c++) (0) | 2020.05.25 |
댓글