아무코딩

[2018 KAKAO BLIND RECRUITMENT 3차] 방금그곡 본문

알고리즘/프로그래머스

[2018 KAKAO BLIND RECRUITMENT 3차] 방금그곡

동 코 2020. 4. 7. 04:40

문제풀이 시간 38분

문제풀이

마치 string처리를 연습하라는 문제 같았다. 

c++에 제공하지않는 replaceAll 기능과 string tokenzie 기능을 구현하였다. 

전에 구현한 string tokenize대신 더 깔끔하다.

 

 

vector<string> string_tokenize(string str, char delimeter) {
	vector<string> result;
	string token;
	stringstream ss(str);

	while (getline(ss, token, delimeter)) {
		result.push_back(token);
	}
	return result;
}

위 함수는 자주쓰는 함수라 따로 정리해둬야겠다.

 

string replaceSharp(string str) {
	size_t pos=0;
	size_t offset=0;

	while ((pos = str.find("#", offset)) != string::npos) {
		pos--;
		char note = str[pos] - ('A'-'a');
		string replace = "";
		replace += note;
		str.replace(pos, 2,replace);
		offset = pos + 1;
	}

	return str;
}

A#, B#같은 올림음을 글자 수 세기 쉽게 바꾸기 위하여 소문자로 바꾸는 코드인데 pos를 잡을 때는 size_t 자료형을 쓰고 위와 같은 방법으로 replaceAll을 한다. replaceAll함수를 쓰기 좋게 만들어놓을 필요가 있는 것 같다.

소스코드

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <string>
#include <vector>
#include <sstream>
#include <iostream>
using namespace std;
 
vector<string> string_tokenize(string str, char delimeter) {
    vector<string> result;
    string token;
    stringstream ss(str);
 
    while (getline(ss, token, delimeter)) {
        result.push_back(token);
    }
    return result;
}
 
 
string replaceSharp(string str) {
    size_t pos=0;
    size_t offset=0;
 
    while ((pos = str.find("#", offset)) != string::npos) {
        pos--;
        char note = str[pos] - ('A'-'a');
        string replace = "";
        replace += note;
        str.replace(pos, 2,replace);
        offset = pos + 1;
    }
 
    return str;
}
 
int timeToSecond(string times) {
    vector<string> time_info = string_tokenize(times, ':');
    return stoi(time_info[0]) * 60 + stoi(time_info[1]);
}
 
 
string solution(string m, vector<string> musicinfos) {
    string answer = "(None)";
    int result_music_runtime = 0;
    string melody = replaceSharp(m); //멜로디
 
    for (int i = 0; i < musicinfos.size(); i++) {
        vector<string> infos = string_tokenize(musicinfos[i],',');
        int start_time = timeToSecond(infos[0]);
        int end_time = timeToSecond(infos[1]);
        int play_time = end_time - start_time;//실행시간
        string music = replaceSharp(infos[3]);
        string music_title = infos[2];
        int music_runtime = music.length();//음악길이
        int n_playmusic = play_time / music_runtime;//음악 완곡횟수
        int add_play_time = play_time % music_runtime;//음악 추가재생된 길이
 
        string played_music = "";
        for (int i = 0; i < n_playmusic; i++)
            played_music += music;
        played_music += music.substr(0, add_play_time);
 
        if (played_music.find(melody) != string::npos) {//찾았을때
            if (result_music_runtime < play_time) {//현재 실행시간이 길때
                answer = music_title;
                result_music_runtime = play_time;
            }
        }
 
 
    }
 
 
 
    return answer;
}
 
int main() {
    string info = "";
    //info = solution("ABCDEFG", { "12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF" });
    info = solution("CC#BCC#BCC#BCC#B", { "03:00,03:30,FOO,CC#B""04:00,04:08,BAR,CC#BCC#BCC#B" });
    //info = solution("ABC", { "12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF" });
 
    cout << info << endl;
}
 

 

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/17683

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

Comments