Skip to content

Conversation

@Seol-Munhyeok
Copy link
Collaborator

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

๋ฐฉ๊ธˆ๊ทธ๊ณก
https://school.programmers.co.kr/learn/courses/30/lessons/17683

โœ”๏ธ ์†Œ์š”๋œ ์‹œ๊ฐ„

25๋ถ„

โœจ ์ˆ˜๋„ ์ฝ”๋“œ

์ฃผ์˜: ์ด ๋ฌธ์ œ์˜ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค ํ•œ ๊ฐœ๊ฐ€ ์ข€ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.
๋ฌธ์ œ ์กฐ๊ฑด์ด "๋„ค์˜ค๊ฐ€ ๊ธฐ์–ตํ•œ ๋ฉœ๋กœ๋””์™€ ์•…๋ณด์— ์‚ฌ์šฉ๋˜๋Š” ์Œ์€ C, C#, D, D#, E, F, F#, G, G#, A, A#, B 12๊ฐœ์ด๋‹ค." ๊ฐ€ ์•„๋‹ˆ๋ผ,
"๋„ค์˜ค๊ฐ€ ๊ธฐ์–ตํ•œ ๋ฉœ๋กœ๋””์™€ ์•…๋ณด์— ์‚ฌ์šฉ๋˜๋Š” ์Œ์€ C, B#, C#, D, D#, E, E# F, F#, G, G#, A, A#, B 14๊ฐœ์ด๋‹ค."
๋ผ๊ณ  ์ดํ•ดํ•˜๊ณ  ํ’€์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.


๊ฐ„๋‹จํ•œ ๋ฌธ์ž์—ด ๊ตฌํ˜„ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์Œ ์ค‘์—์„œ #์ด ๋ถ™์€ ์Œ์€ ๋‘ ๊ธ€์ž๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ๋„ ํ•˜๊ณ , ๋ฌธ์ž์—ด ํฌํ•จ ์—ฌ๋ถ€๋ฅผ ์กฐ์‚ฌํ•  ๋•Œ, C์ธ์ง€ C#์ธ์ง€ ๊ตฌ๋ถ„์ด ์•ˆ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— #์ด ๋ถ™์€ ์Œ์€ ์ „๋ถ€ ์†Œ๋ฌธ์ž๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

def convert(score):
    lst = [("B#", "b"), ("C#", "c"), ("D#", "d"), ("E#", "e"), ("F#", "f"), ("G#", "g"), ("A#", "a")]
    for a, b in lst:
        score = score.replace(a, b)        
    return score

์ด ์Œ์•…์˜ ์žฌ์ƒ ์‹œ๊ฐ„๋งŒํผ ์Œ์„ ๋ถ™์—ฌ์„œ ์—ฐ์žฅํ•˜๊ฑฐ๋‚˜ ์•„๋‹ˆ๋ฉด ์ค‘๊ฐ„์—์„œ ์ž˜๋ผ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— HH:MM ํ˜•์‹์„ SEC์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

def time_to_sec(time):
    h, m = time.split(":")
    return 60 * int(h) + int(m)

๊ทธ ํ›„, ์Œ์•…์˜ ์žฌ์ƒ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ์Œ์„ ๋ถ™์—ฌ์„œ ์—ฐ์žฅํ•˜๊ฑฐ๋‚˜ ์ค‘๊ฐ„์—์„œ ์ž˜๋ผ์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

def convert_2(score, length):    
    size = len(score)
    if size == length:
        return score
    if size > length:
        return score[:length]
    if size < length:
        return score * (length // size) + score[:length % size]

์˜ˆ๋ฅผ๋“ค์–ด, ์Œ์ด CDEFGAB๋กœ 7๋ถ„์งœ๋ฆฌ์ธ๋ฐ 15๋ถ„ ์žฌ์ƒ๋˜์—ˆ์œผ๋ฉด, 15 // 7 = 2๋ฒˆ ๊ฐ™์€ ๊ฑธ ๋ถ™์ด๊ณ , 15 % 7 = 1๋ฒˆ ์•ž์— ์žˆ๋Š” ์Œ์„ ๋” ๋ถ™์ด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ musicinfos๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ์•…๋ณด์—์„œ ๊ธฐ์–ตํ•œ ๋ฉœ๋กœ๋””๊ฐ€ ํฌํ•จ๋˜์–ด์žˆ๋Š”์ง€๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด์ด ์ผ์น˜ํ•˜๋Š” ์Œ์•…์ด ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๋•Œ์—๋Š” ๋ผ๋””์˜ค์—์„œ ์žฌ์ƒ๋œ ์‹œ๊ฐ„์ด ์ œ์ผ ๊ธด ์Œ์•… ์ œ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์žฌ์ƒ๋œ ์‹œ๊ฐ„๋„ ๊ฐ™์„ ๊ฒฝ์šฐ ๋จผ์ € ์ž…๋ ฅ๋œ ์Œ์•… ์ œ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ผ๋Š” ์กฐ๊ฑด์— ์œ ์˜ํ•ด์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๋ฉด๋ฉ๋‹ˆ๋‹ค.

def solution(m, musicinfos):
    answer = '(None)'
    max_size = -1
    for info in musicinfos:
        start, end, title, score = info.split(",")
        length = time_to_sec(end) - time_to_sec(start)
        m, score = convert(m), convert(score)
        if m in convert_2(score, length) and length > max_size:
            answer = title
            max_size = length
            
    return answer

๐Ÿ“š ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ๋‚ด์šฉ

ํŒŒ์ด์ฌ์˜ ๋ฌธ์ž์—ด ๊ด€๋ จ ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ฆฌ๋งˆ์ธ๋“œ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์™€ ๋ณ„๊ฐœ๋กœ ์Œ์•…์—์„œ C๋Š” B#๊ณผ ๊ฐ™๊ณ , F๋Š” E#๊ณผ ๊ฐ™์€ ์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
๊ทผ๋ฐ ์กฐ๊ฑด์€ "C, C#, D, D#, E, F, F#, G, G#, A, A#, B 12๊ฐœ" ๋ผ๊ณ ๋งŒ ์ ํ˜€์žˆ์–ด์„œ ํ˜ผ๋™์„ ์ฃผ๋Š”๋ฐ C๋Š” B#๊ณผ ๊ฐ™๊ณ , F๋Š” E#์™€ ๊ฐ™๋‹ค๋Š” ๊ฑธ ์ƒ์‹์œผ๋กœ ๋ณด๊ณ  ๋ฌธ์ œ๋ฅผ ๋‚ธ ๊ฑด์ง€... ์•„๋‹ˆ๋ฉด ๋ฌธ์ œ๋ฅผ ์ž˜๋ชป๋‚ธ ๊ฑด์ง€... ์ข€ ์„ธ์„ธํ•œ ๋ถ€๋ถ„์—์„œ ์•ˆ ์ข‹์€ ๋ฌธ์ œ ๊ฐ™๋„ค์š”.

@hyeokbini
Copy link
Collaborator

๋ฌธ์ œ์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ๋‚˜ ๋ณด๋„ค์š”. ์ €๋„ ํ’€๊ณ  ๋‚˜์„œ ์งˆ๋ฌธ๊ฒŒ์‹œํŒ์— ๋“ค์–ด๊ฐ€๋ดค๋”๋‹ˆ ๋ฌธ์ œ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์–˜๊ธฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด์–ด์„œ ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ํ‘ผ ๋ฐฉ์‹์ด ์šด ์ข‹๊ฒŒ ์•ˆ ๊ฑธ๋ฆฌ๊ณ  ๋„˜์–ด๊ฐ€๋Š” ๋ฐฉ์‹์ด์—ˆ์–ด์„œ ํฌ๊ฒŒ ์‹ ๊ฒฝ์„ ์•ˆ ์ผ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ €๋„ ํฌ๊ฒŒ ๋ฌธ์ž์—ด ์ „์ฒ˜๋ฆฌ, ์‹œ๊ฐ„ ๋‹จ์œ„ ์ฒ˜๋ฆฌ, ๊ธธ์ด์— ๋”ฐ๋ฅธ ๋ฌธ์ž์—ด ์ƒ์„ฑ ์ด 3๊ฐœ์— ์ฃผ๋ชฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ‘ผ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ๋‹จ์œ„๋กœ ๋งŒ๋“  ๋‹ค์Œ์— check ํ•จ์ˆ˜์—์„œ ์ „๋ถ€ ๋ชจ์•„์„œ ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’๋“ค๋งŒ ans์— ๋‹ด์€ ๋‹ค์Œ, sortํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ •๋ ฌํ•ด์„œ ๋งจ ์•ž ๊ฐ’์„ returnํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด ์ „์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ, ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์— ๊ธฐ์กด ๋ฌธ์ž์—ด์„ ์ถ”๊ฐ€ํ•˜๋ฉด์„œ #์ด ๋‚˜์˜ค๋ฉด ๋งจ ๋’ท๋ถ€๋ถ„์„ ์†Œ๋ฌธ์ž๋กœ ๋ฐ”๊พธ๋Š” ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ–ˆ๋Š”๋ฐ, ์ด๋ž˜์„œ B#๊ฐ™์€ ์ผ€์ด์Šค๊ฐ€ ๋‚˜์™€๋„ ๊ทธ๋ƒฅ ํ†ต๊ณผ๊ฐ€ ๋๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰ ์ •๋ ฌ ์กฐ๊ฑด์—์„œ

์กฐ๊ฑด์ด ์ผ์น˜ํ•˜๋Š” ์Œ์•…์ด ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๋•Œ์—๋Š” ๋ผ๋””์˜ค์—์„œ ์žฌ์ƒ๋œ ์‹œ๊ฐ„์ด ์ œ์ผ ๊ธด ์Œ์•… ์ œ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์žฌ์ƒ๋œ ์‹œ๊ฐ„๋„ ๊ฐ™์„ ๊ฒฝ์šฐ ๋จผ์ € ์ž…๋ ฅ๋œ ์Œ์•… ์ œ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋ผ๋Š” ๋ง์ด ์žˆ๋Š”๋ฐ, ์ •๋‹ต ๋ฒกํ„ฐ๋ฅผ ๋งŒ๋“ค ๋•Œ ์ผ๋‹จ ์ž…๋ ฅ๋œ ์Œ์•… ์ˆœ์„œ๋กœ ans์— ๋„ฃ์€ ํ›„ ์žฌ์ƒ ์‹œ๊ฐ„์— ๋Œ€ํ•ด์„œ ์ •๋ ฌํ•˜๋Š”๋ฐ ์žฌ์ƒ ์‹œ๊ฐ„์ด ๊ฐ™์€ ๊ฒฝ์šฐ unstable sort๋ผ๋ฉด ์ž…๋ ฅ๋œ ์ˆœ์„œ๊ฐ€ ์†์ƒ๋  ์ˆ˜ ์žˆ๊ฒ ๋‹ค ์‹ถ์–ด์„œ stable_sort๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค...๋งŒ ๊ทธ๋ƒฅ sort๋ฅผ ์จ๋„ ํ†ต๊ณผ๋Š” ๋˜๋„ค์š”. ๐Ÿ˜… ์ง€ํ”ผํ‹ฐ ํ”ผ์…œ๋กœ๋Š” ์„ž์ผ ์ˆ˜๋„ ์žˆ์–ด์„œ stable์„ ์“ฐ๋Š” ๊ฒŒ ์•ˆ์ „ํ•˜๋‹ค๊ณ ๋Š” ํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ๊นŠ๊ฒŒ ์ƒ๊ฐํ•œ ๊ฒƒ ๊ฐ™๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด์€ ํ’€ ๋•Œ๋งˆ๋‹ค ๊ตฌํ˜„ํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ด ๋งŽ์•„์„œ ํ˜ธํก์ด ๊ธธ์–ด์ง€๋Š” ๊ฒƒ ๊ฐ™๋„ค์š”. ์—ฐ์Šต ๋” ๋งŽ์ด ํ•ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์ œ์ถœ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ๊ณ ์ƒํ•˜์…จ์–ด์š”!

๋ฐฉ๊ธˆ๊ทธ๊ณก / c++
#include <bits/stdc++.h>

using namespace std;

vector<pair<int,string>> ans;

bool comp(pair<int,string> a1, pair<int,string> a2)
{
    return a1.first > a2.first;
}

int timetosec(string str)
{
    int time = stoi(str.substr(0,2));
    int sec = stoi(str.substr(3,2));
    return time * 60 + sec;
}

string makemusic(int len, string origin)
{
    int n = origin.length();

    // ์ตœ์†Œ๊ธธ์ด ์ด์ƒ์„ ์œ„ํ•œ ๋ฐ˜๋ณตํšŸ์ˆ˜
    int repeat = (len + n - 1) / n;
    string result = "";

    for (int i = 0; i < repeat; i++)
    {
        result += origin;
    }

    // ๊ธธ์ด๋งŒํผ๋งŒ ์ž˜๋ผ์„œ return
    return result.substr(0, len);
}

string preprocess(string origin)
{
    string newstring = "";
    for(int i = 0; i < origin.length(); i++)
    {
        if(origin[i] == '#')
        {
            newstring.back() = tolower(newstring.back());
        }
        else
        {
            newstring += origin[i];
        }
    }
    return newstring;
}

void check(string minfo, string m)
{
    vector<string> info;
    stringstream ss(minfo);
    string temp;

    while (getline(ss, temp, ','))
    {
        info.push_back(temp);
    }
    int playtime = timetosec(info[1]) - timetosec(info[0]);
    string musname = info[2];
    string makenmusic = makemusic(playtime, preprocess(info[3]));
    if(makenmusic.find(m) != string::npos)
    {
        ans.push_back({playtime,info[2]});
    }
}

string solution(string m, vector<string> musicinfos) {
    string newm = preprocess(m);
    for(auto i : musicinfos)
    {
        check(i,newm);
    }
    if(ans.empty())
    {
        return "(None)";
    }
    stable_sort(ans.begin(),ans.end(),comp);
    return ans[0].second;
}

@Seol-Munhyeok
Copy link
Collaborator Author

@hyeokbini
๊ทธ ๋™์•ˆ sort() ํ•จ์ˆ˜๋ฅผ ์“ธ ๋•Œ, stable์ธ์ง€ ์•„๋‹Œ์ง€๋Š” ํฌ๊ฒŒ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ ์ค‘์š”ํ•œ ์ ์„ ์–˜๊ธฐํ•ด์ฃผ์‹ ๊ฑฐ ๊ฐ™๋„ค์š”...

ํŒŒ์ด์ฌ์€ ๋‚ด๋ถ€์ ์œผ๋กœ Timsort ์•Œ๊ณ ๋ฆฌ์ฆ˜ (๋จธ์ง€ ์ •๋ ฌ + ์‚ฝ์ž… ์ •๋ ฌ์„ ๊ฒฐํ•ฉํ•œ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ)์„ ์‚ฌ์šฉํ•˜๊ณ  ํ•ญ์ƒ ์•ˆ์ • ์ •๋ ฌ์ด ๋ณด์žฅ๋œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ C++์˜ std::sort๋Š” ์•ˆ์ •์ •๋ ฌ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•˜๋„ค์š”. ๊ทธ๋ƒฅ sort๋ฅผ ํ•ด๋„ ํ†ต๊ณผ๊ฐ€ ๋œ ์ด์œ ๋Š” ๊ทธ๋ƒฅ ์šฐ์—ฐํžˆ ์ˆœ์„œ๊ฐ€ ์•ˆ ๋ฐ”๋€Œ์–ด์„œ ์ธ ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์•„์˜ˆ ์ด๋Ÿฐ ๊ฑฐ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ธฐ์œ„ํ•ด์„œ๋Š” ์ œ๊ฐ€ ํ•œ ๋ฐฉ์‹๋Œ€๋กœ ์ž…๋ ฅ ์ˆœ์„œ๋Œ€๋กœ ๋น„๊ตํ•ด๋ณผ ๋•Œ, ์ •๋‹ต ์—ฌ๋ถ€์™€ ๋™์‹œ์— ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ’€๋ฉด ๋  ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค!!

@mj010504
Copy link
Collaborator

mj010504 commented Sep 9, 2025

๊ฐ„๋งŒ์— ๋ฌธ์ž์—ด ๋‹ค๋ฃจ๋Š” ์—ฐ์Šต์„ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค! ์ €๋Š” #๋ถ™์€ ๋ถ€๋ถ„์€ - 'A'๋ฅผ ํ•ด์ค˜์„œ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ˆ˜๊ณ ํ•˜์…จ์Šต๋‹ˆ๋‹ค!

๋ฐฉ๊ธˆ ๊ทธ ๊ณก
#include<bits/stdc++.h>

using namespace std;

vector<string> split(string input) {
    vector<string> answer;
    stringstream ss(input);
    string temp;

    while(getline(ss, temp, ',')) {
        answer.push_back(temp);
    }

    return answer;
}

struct music {
    int time;
    string title, sound;
};

// ์Œํ‘œ ๋ถ„๋ฆฌ
string seperate(string sheet) {
    string answer = "";
    for(int i = 0; i < sheet.size() - 1; i++) {
        if(sheet[i] == '#') continue;

        if(sheet[i + 1] == '#') answer += sheet[i] - 'A';
        else answer += sheet[i];
    }

    if(sheet[sheet.size() - 1] != '#') answer += sheet[sheet.size() - 1];

    return answer;
}

bool compare(music &a, music &b) {
    return a.time > b.time;
}

string solution(string m, vector<string> mv) {
    string res = "(None)";
    vector<music> v;
    for(int i = 0; i < mv.size(); i++) {
        vector<string> music = split(mv[i]);
        string start = music[0]; string end = music[1];
        int startTime = stoi(start.substr(0, 2)) * 60 + stoi(start.substr(3, 5)); 
        int endTime = stoi(end.substr(0, 2)) * 60 + stoi(end.substr(3, 5)); 
        int playTime = endTime - startTime;

        string title = music[2]; string sheet = music[3];
        string note = seperate(sheet);

        int a = playTime / note.size(); int b = playTime % note.size();
        string sound = "";

        for(int i = 0; i < a; i++) {
            sound += note;
        }

        sound += note.substr(0, b);
        v.push_back({playTime, title, sound});
    }

    string target = seperate(m);
    vector<music> tv;
    for(int i = 0; i < v.size(); i++) {
        string sound = v[i].sound;
        size_t pos = sound.find(target);
        if(pos != string::npos) {
            tv.push_back(v[i]);
        }
    }

    if(!tv.empty()) {
        sort(tv.begin(), tv.end(), compare);
        res = tv[0].title;
    }
    
    return res;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants