본문 바로가기
Algorithm/프로그래머스

[프로그래머스]2018 KAKAO BLIND RECRUITMENT : 방금그곡 (level 2)(c++)

by HBGB 2020. 5. 26.

https://programmers.co.kr/learn/courses/30/lessons/17683

 

코딩테스트 연습 - [3차] 방금그곡

방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV, ��

programmers.co.kr

 

 

#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() 같이 기초적인 함수 사용해서 계산하는게 훨씬 낫다..

 

 

댓글