Level 2. [3차] 방금그곡
전형적인 파싱 문제였고 저번과 같이 지문 길이에 비해 풀 만한 문제였다.
다만 테스트 케이스가 참 별로인 문제였는데 istringstream을 통해 공백으로 파싱하면, 입력 중에 빈 문자열이 포함되어 있는 경우 정상적으로 파싱되지 않는다.
- 근데 문제는 이런 테스트 케이스가 절반을 차지해서, 로직에 문제가 있는 건지 파싱에 문제가 있는 건지 구분할 수 없다는 것이다.
나도 istringstream 파싱 문제 때문에 오전 시간을 다 날려버렸다가, 질문하기에서 겨우 같은 문제를 겪었던 사람을 찾아 해결할 수 있었다.
// 이 풀이는 오답 처리된다.
#include <iostream>
#include <string>
#include <vector>
#include <regex>
#include <sstream>
#include <map>
#include <algorithm>
#include <cctype>
using namespace std;
struct music_info
{
int time;
string name;
string sheet;
};
int to_seconds(string time)
{
return stoi(time) * 60 + stoi(time.substr(3));
}
string convert_sheet(string sheet)
{
string s;
for (char c : sheet)
if (c == '#')
s.back() = tolower(s.back());
else
s += c;
return s;
}
music_info parse_info(string info)
{
vector<string> v;
istringstream iss(regex_replace(info, regex(","), " "));
while (iss >> info)
v.emplace_back(info);
music_info msc_info;
msc_info.time = to_seconds(v[1]) - to_seconds(v[0]);
msc_info.name = v[2];
msc_info.sheet = convert_sheet(v[3]);
return msc_info;
}
bool is_match(string m, music_info info)
{
string s;
int time = info.time;
int len_sheet = info.sheet.length();
while (0 < time)
{
s += string(info.sheet, 0, min(time, len_sheet));
time -= len_sheet;
}
return s.find(m) != string::npos;
}
string solution(string m, vector<string> musicinfos)
{
map<int, string> mp;
for (string info : musicinfos)
{
music_info msc_info = parse_info(info);
if (is_match(convert_sheet(m), msc_info))
if (mp.find(msc_info.time) == mp.end())
mp[msc_info.time] = msc_info.name;
}
return mp.empty() ? "(None)" : mp.rbegin()->second;
}
istringstream 대신 ',' 문자를 직접 찾아 파싱하면 정답 처리된다.
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <cctype>
using namespace std;
struct music_info
{
int time;
string name;
string sheet;
};
int to_seconds(string time)
{
return stoi(time) * 60 + stoi(time.substr(3));
}
string convert_sheet(string sheet)
{
string s;
for (char c : sheet)
if (c == '#')
s.back() = tolower(s.back());
else
s += c;
return s;
}
music_info parse_info(string info)
{
int p = info.find(',');
music_info msc_info;
msc_info.time = to_seconds(info.substr(6, 5)) - to_seconds(info.substr(0, 5));
msc_info.name = info.substr(12, info.find(',', 12) - 12);
msc_info.sheet = convert_sheet(info.substr(info.find(',', 12) + 1));
return msc_info;
}
bool is_match(string m, music_info info)
{
string s;
int time = info.time;
int len_sheet = info.sheet.length();
while (0 < time)
{
s += string(info.sheet, 0, min(time, len_sheet));
time -= len_sheet;
}
return s.find(m) != string::npos;
}
string solution(string m, vector<string> musicinfos)
{
map<int, string> mp;
for (string info : musicinfos)
{
music_info msc_info = parse_info(info);
if (is_match(convert_sheet(m), msc_info))
if (mp.find(msc_info.time) == mp.end())
mp[msc_info.time] = msc_info.name;
}
return mp.empty() ? "(None)" : mp.rbegin()->second;
}
'자료구조 & 알고리즘 > 프로그래머스' 카테고리의 다른 글
Level 2. 거리두기 확인하기 (0) | 2023.07.11 |
---|---|
Level 0. 원소들의 곱과 합 (0) | 2023.07.10 |
Level 2. 우박수열 정적분 (0) | 2023.07.08 |
Level 2. 괄호 변환 (0) | 2023.07.07 |
Level 0. 배열의 원소 삭제하기 (0) | 2023.07.06 |