알고리즘 스터디
[프로그래머스] 방금그곡 (C++)
coding_
2022. 2. 12. 19:12
728x90
반응형
프로그래머스 방금 그 곡
1. 문제
2. 접근법
[ 문제 풀이 ]
위 문제는 2018 카카오 코딩 테스트에 출제된 문제이다.
1. #이 붙은 음을 한자리 문자의 다른 음으로 치환해준다.
2. musicinfos에 담긴 곡 정보를 stoi함수를 이용하여 분해하여 재생시간과 sTime(이전 곡이 재생된 시간)을 구해준다.
3. title과 tmp를 하나 선언하여 현재 음악의 제목과 멜로디를 저장한다.
4. musicinfos의 12번째부터 제목이 시작되므로 substr을 사용하여 제목과 멜로디를 각각 담아준다.
5. tmp에 담긴 멜로디의 #이 붙은 음을 change함수를 이용하여 한 자릿수 음으로 치환한다.
6. 음악의 크기를 time과 비교하여 time 보다 작은 경우 멜로디를 이어준다.
7. find함수를 사용하여 일치하는 제목을 찾는다. 이때 조건이 일치하는 음악이 여러 개인 경우 재생시간이 제일 긴 음악 제목을 반환한다.(sTime 사용)
3. 코드
#include <string>
#include <vector>
#include <sstream>
#include <map>
#include <iostream>
using namespace std;
vector<string> vec;
string change(string &in, map<string, char>& sc)
{
string out = "";
for (int i = 0; i < in.size(); ++i)
{
if (in[i + 1] == '#')
{
out += sc[in.substr(i, 2)];
i++;
}
else
out += in[i];
}
return out;
}
string solution(string m, vector<string> musicinfos) {
string answer = "(None)";
int sHour = 0, eHour = 0, sMin = 0, eMin = 0, sTime = 0, time=0;
string melody = "", title = "";
map<string, char> sc;
//두자리 음->한자리로 변환
sc["C#"] = 'H';
sc["D#"] = 'I';
sc["F#"] = 'J';
sc["G#"] = 'K';
sc["A#"] = 'L';
melody = change(m, sc);
for (int i = 0; i < musicinfos.size(); i++)
{
string tmp = "", mus = "";
sHour = stoi(musicinfos[i].substr(0, 2)) * 60;
sMin = stoi(musicinfos[i].substr(3, 2));
eHour = stoi(musicinfos[i].substr(6, 2)) * 60;
eMin = stoi(musicinfos[i].substr(9, 2));
//재생시간 구하기
time = (eHour + eMin) - (sHour + sMin);
//title과 음 나누기
for (int j = 12; j < musicinfos[i].size(); ++j)
{
if (musicinfos[i][j] == ',')
{
title = musicinfos[i].substr(12, j - 12);
tmp = musicinfos[i].substr(j + 1);
break;
}
}
//두자리음->한자리로 변환
mus = change(tmp, sc);
//재생시간만큼 음이어 붙임
if (mus.size() < time)
{
tmp = mus;
for (int j = 1; j < time / tmp.size(); ++j)
mus += tmp;
for (int j = 0; j < time % tmp.size(); ++j)
mus += tmp[j];
}
else
mus = mus.substr(0, time);
//mus에 해당 멜로디가 존재한다면
if (mus.find(melody) != string::npos)
{
//음악이 여러개인 경우, 재생시간이 제일 긴 음악제목 반환
if (sTime < time)
{
answer = title;
sTime = time;
}
}
}
return answer;
}
4. 결과
728x90
반응형