Make Unreal REAL.
article thumbnail
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;
}
profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그