[백준 알고리즘] 15947번: 아기 석환 뚜루루 뚜루

15947번: 아기 석환 뚜루루 뚜루

문제
석환이는 오늘 낮에 커피를 마셔서 잠에 들지 못하고 있다. 이불 속에서 너무 심심한 나머지 “아기 석환” 노래를 잠에 들 때까지 부르려고 한다. 석환이는 UCPC 2018 출제진 중의 한 명인 석환(seokhwan)이랑은 달리, 자신의 이름을 sukhwan이라고 쓴다. 노래가 끝나면 다시 처음부터 부른다. 아기 석환 노래는 아래와 같다.

baby sukhwan tururu turu
very cute tururu turu
in bed tururu turu
baby sukhwan

하지만 석환이는 계속 노래를 똑같이 부르기는 심심해서, 노래가 한 번 끝날 때마다 “tururu”와 “turu”에 “ru”를 한 번씩 더 추가해서 다음과 같이 부르려고 한다.

baby sukhwan tururu turu
very cute tururu turu
in bed tururu turu
baby sukhwan

baby sukhwan turururu tururu
very cute turururu tururu
in bed turururu tururu
baby sukhwan

baby sukhwan tururururu turururu
very cute tururururu turururu
in bed tururururu turururu
baby sukhwan

…

이 때, 석환이가 부르는 노래의 N번째 단어는 무엇일까?

입력
첫 번째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)이 주어진다.

출력
첫 번째 줄에 석환이가 N번째로 부를 단어를 출력한다. 여기서 단어란 가사 중 공백으로 구분되는 연속된 알파벳 소문자열을 뜻한다. 단, 출력할 단어가 “tururu...ru”일 때, “ru”가 k(k ≥ 5)번 반복되면 “tu+ru*k”와 같이 출력한다.

접근 방법:

어차피 뚜루루 뚜루 부분을 제외한 다른 부분은 그대로 출력하면 되기 때문에 배열에 모든 문자열을 따로따로 맵핑해두고 입력으로 들어오는 N을 전체 문자열 갯수인 14로 나누고 남은 나머지 위치에 있는 문자열을 출력해주면 된다. 이때 출력할 문자열이 tururu 나 turu 면 N을 14로 나눈 몫만큼 반복해서 ru를 붙여준다. ru의 갯수가 5이상이면 출력 형태가 달라지는데 tururu는 배열의 짝수번째에 들어있고, turu는 배열의 홀수번째에 위치해 있기 때문에 홀수, 짝수에 따라 다른 조건을 만들어서 출력해준다.

통과 코드:

#include <string>
#include <iostream>
#include <vector>

using namespace std;

int main (){
    int N;
    vector<string> song{"baby", "sukhwan", "tururu", "turu", "very", "cute", "tururu", "turu", "in", "bed", "tururu", "turu", "baby", "sukhwan"};
    cin >> N;

    int itr = N/14;
    int idx = N%14-1;
    if (idx < 0) idx = 13;


    if (song[idx][0] == 't'){
        if (idx % 2 == 0 && itr >= 3){
            cout << "tu+ru*" << itr+2;
            return 0;
        }
        else if(idx % 2 == 1 && itr >= 4){
            cout << "tu+ru*" << itr+1;
            return 0;
        }
        for (int i = 0 ; i < itr ; i++)
            song[idx] += "ru";
        cout << song[idx];
        return 0;
    }
    cout << song[idx];
    return 0;
}

Written by@전여훈 (Click Me!)
고민이 담긴 코드를 만들자, 고민하기 위해 공부하자.