티스토리 뷰

문제 링크

 

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

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

programmers.co.kr

 

 

풀이

문제를 보고 이건 그냥 열심히 비교해서 풀어야겠다. 라는 생각이 들고 나서 열심히 for문 돌렸다.

 

[요약]

0) 선행처리

m 변수를 선행으로 미리 '#'은 대문자가 아닌 소문자로 치환했다.(*중요*)

ex) C# -> c, D# -> d

- 예전에 치환문제로 간단하게 풀리는거를 조건 따지면서 머리 굴린 적이 있었는데 이번에는 바로 생각났다.

참고로) 여기서는 string의 back() 참조자를 이용하여 아스키 코드 값을 연산했다.

 

1) 재생된 길이 추출

재생된 분(min) = (시작(h) - 종료(h)) * 60 + (시작(m) - 종료(m) 

- stoi(substr()) 이용했다.

- substr 잘못하면 stoi가 처음부터 '0'~'9'가 아닌 다른 문자를 읽으면 exception이 발생한다.

 

2) 제목도 추출

 

3) 악보도 추출

- 악보도 선행 처리와 마찬가지고 '#'은 모두 치환

 

4) 비교

4-1) 악보를 재생된 길이만큼 늘이거나 줄임

4-2) 악보.find(기억)으로 비교(못찾을 경우 string::npos와 같다.)

4-3) 재생된 길이 max 값을 초기화하면서 answer에 대입. 같으면 안된다.(먼저 입력된 것이 반환되야 하므로)

 

아! 한 번에 성공하지 못했는데 그 이유는 조건에 맞지 않으면 `(None)` 을 출력하라길래 했더니 틀렸다..

질문하기 보니까 (None)이래서 했더니 성공이다.

왜 백틱문자( ` )를 넣게 했는지... js 코딩하시느라 템플릿 리터럴 쓰다가 실수하신 듯 하다.

`(None)` -> (None)

 

더보기
#include <string>
#include <vector>
#include <iostream>

using namespace std;
// 재생 시간과 제공된 악보를 직접 보면서 비교
// 1) 음악 제목, 2) 끝난 시각, 3) 악보 를 제공
// 음은 12개
// 음은 1분에 1개 재생
// (음악 길이 < 재생된 시간) OR (음악 길이 > 재생된 시간)
// 조건이 일치하는 음악이 여러 개 일때는 제일 긴 음악 반환
// 재생된 시간도 같을 경우 먼저 입력된 음악 제목 반환
// 일치 X -> "`(None)`"

string solution(string m, vector<string> musicinfos) {
    string answer = "(None)";
    
    // pre-TODO
    string memo;
    for(int i=0; i<m.length(); i++){
        if(m[i] != '#') memo.push_back(m[i]);
        else memo.back() -= ('A' - 'a');
    }
    
    // TODO
    int max = 0;        // 여러 개 구분(재생 시간 max)
    for(string s : musicinfos){
        // 재생된 시간
        int min = (stoi(s.substr(6, 2)) - stoi(s.substr(0, 2))) * 60;
        min += stoi(s.substr(9, 2)) - stoi(s.substr(3, 2));
        
        // 제목
        string title;
        int i=12;           // ',' skip
        while(s[i]!=','){
            title.push_back(s[i]);
            i++;
        }
        i++;        // ',' skip
        
        // 악보
        string sheet;         // 소문자: '#' 들어감 ex) C# = c
        while(i<s.length()){
            if(s[i] != '#') sheet.push_back(s[i]);
            else sheet.back() -= ('A' - 'a');
            i++;
        }
        
        // 비교 - 제목(title), 길이(min), 악보(sheet)
        string cmpString;                // 비교할 멜로디
        for(int a=0; a<min; a++){
            cmpString.push_back(sheet[a % sheet.length()]);
        }
        if(string::npos != cmpString.find(memo)){      // 찾았다.
            if(max < min) {
                max = min;
                answer = title;         // 제일 긴 길이의 먼저 입력된 음악
            }
        }
    }
    return answer;
}
728x90
반응형
댓글
05-07 19:36
링크