1 분 소요

문제 바로가기 : https://programmers.co.kr/learn/courses/30/lessons/17683
문제 설명은 위 링크에서 확인해주시길 바랍니다.

solution


review

구현이 정말 빡세다. 아이디어랄건 없고 주어진 조건을 따라가면 된다.
getTime()은 시작 시간, 끝나는 시간을 인자로 가져와서 총 시간을 계산하는 함수다.
서로 시간이 같을 때는 0이 리턴돼야 하고, 이외에 끝나는 시간이 00:00이면 24:00인걸 체크해야 한다.
chk()는 멜로디가 일치하는지 체크하는 함수다.

solution()에서 일단 딱 봤을때 굉장히 더러워 보이는데 천천히 설명하면 다음과 같다.
주어진 문자열 중 멜로디는 #이 붙을 수 있고 #이 붙은 음(A#, C#..)은 통째로 1개로 친다.
따라서 이를 묶어서 관리해야 하는데 귀찮아서 string으로 퉁쳐서 담아버렸다.
그렇게 mkey에, musicinfos[i]의 멜로디는 tmp에 담았다.

for (int i = 0; i < m.size(); i++) {
    if (i < m.size() - 1 && ('A' <= m[i] && m[i] <= 'Z') && m[i + 1] == '#') {
        string s = ""; s += m[i]; s += m[i + 1];
        key.push_back(s);
        i++;
    }
    else {
        string s = ""; s += m[i];
        key.push_back(s);
    }
}

...
for (int i = 0; i < musicinfos.size(); i++) {
  ...
  vector<string> tmp;
  for (int t = melodyStart + 1; t < musicinfos[i].size(); t++) {
      if (i < musicinfos[i].size() - 1 && ('A' <= musicinfos[i][t] && musicinfos[i][t] <= 'Z') && musicinfos[i][t + 1] == '#') {
          string s = ""; s += musicinfos[i][t]; s += musicinfos[i][t + 1];
          tmp.push_back(s);
          t++;
      }
      else {
          string s = ""; s += musicinfos[i][t];
          tmp.push_back(s);
      }
  }
  ...
}

총 시간을 time으로 받고, 방금 얻은 tmp는 최종적으로 길이가 time만큼 길어져야 한다.
따라서 다음과 같이 original에 다시 집어 넣는다.

vector<string> original;
int len = tmp.size();
for (int j = 0; j < time / len; j++)
    for (int k = 0; k < len; k++)
        original.push_back(tmp[k]);
for (int j = 0; j < time % len; j++)
    original.push_back(tmp[j]);

그리고 멜로디가 일치하면 제목과 멜로디 시간을 info에 push해주자.
단, 문제 조건에 맞게 멜로디 시간이 이미 들어있는 것 보다 길다면 info를 비워버리고 새로 push한다.
같다면 그냥 push한다.

if (chk(original, key)) {
    if (info.size() == 0)
        info.push_back({ title, original.size() });
    else if (info[0].second < original.size()) {
        info.clear();
        info.push_back({ title, original.size() });
    }
    else if (info[0].second == original.size())
        info.push_back({ title, original.size() });
}

최종적으로 info에 값이 없다면 조건에 맞는 멜로디가 없단 뜻이므로 (None)을 리턴하고
값이 있다면 맨 앞이 우선순위이므로 0번째에 들은 제목을 리턴한다.

if (info.size() == 0) return "(None)";
else return info[0].first;

카테고리:

업데이트:

댓글남기기