🌞Algorithm/πŸ”₯programmers

[programmers] [3차] 방금그곑 - 2018 KAKAO BLIND RECRUITMENT

λΏŒμ•Ό._. 2021. 12. 2. 17:47

μ½”λ”© ν…ŒμŠ€νŠΈ μ—°μŠ΅ - 2018 KAKAO BLIND RECRUITMENT

 


<[3차] 방금 그 곑>

문제 μ„€λͺ…

 

λΌλ””μ˜€λ₯Ό 자주 λ“£λŠ” λ„€μ˜€λŠ” λΌλ””μ˜€μ—μ„œ 방금 λ‚˜μ™”λ˜ μŒμ•…μ΄ 무슨 μŒμ•…μΈμ§€ κΆκΈˆν•΄μ§ˆ λ•Œκ°€ λ§Žλ‹€. 그럴 λ•Œ λ„€μ˜€λŠ” λ‹€μŒ ν¬ν„Έμ˜ '방금 κ·Έ 곑' μ„œλΉ„μŠ€λ₯Ό μ΄μš©ν•˜κ³€ ν•œλ‹€. 방금 κ·Έ κ³‘μ—μ„œλŠ” TV, λΌλ””μ˜€ λ“±μ—μ„œ λ‚˜μ˜¨ μŒμ•…μ— κ΄€ν•΄ 제λͺ© λ“±μ˜ 정보λ₯Ό μ œκ³΅ν•˜λŠ” μ„œλΉ„μŠ€μ΄λ‹€.
λ„€μ˜€λŠ” μžμ‹ μ΄ κΈ°μ–΅ν•œ λ©œλ‘œλ””λ₯Ό κ°€μ§€κ³  방금 κ·Έ 곑을 μ΄μš©ν•΄ μŒμ•…μ„ μ°ΎλŠ”λ‹€. 그런데 λΌλ””μ˜€ λ°©μ†‘μ—μ„œλŠ” ν•œ μŒμ•…μ„ λ°˜λ³΅ν•΄μ„œ μž¬μƒν•  λ•Œλ„ μžˆμ–΄μ„œ λ„€μ˜€κ°€ κΈ°μ–΅ν•˜κ³  μžˆλŠ” λ©œλ‘œλ””λŠ” μŒμ•… 끝뢀뢄과 처음 뢀뢄이 μ΄μ–΄μ„œ μž¬μƒλœ λ©œλ‘œλ””μΌ μˆ˜λ„ μžˆλ‹€. λ°˜λŒ€λ‘œ, ν•œ μŒμ•…μ„ 쀑간에 λŠμ„ 경우 원본 μŒμ•…μ—λŠ” λ„€μ˜€κ°€ κΈ°μ–΅ν•œ λ©œλ‘œλ””κ°€ λ“€μ–΄μžˆλ‹€ 해도 κ·Έ 곑이 λ„€μ˜€κ°€ 듀은 곑이 아닐 μˆ˜λ„ μžˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— λ„€μ˜€λŠ” κΈ°μ–΅ν•œ λ©œλ‘œλ””λ₯Ό μž¬μƒ μ‹œκ°„κ³Ό 제곡된 악보λ₯Ό 직접 λ³΄λ©΄μ„œ λΉ„κ΅ν•˜λ €κ³  ν•œλ‹€. λ‹€μŒκ³Ό 같은 가정을 ν•  λ•Œ λ„€μ˜€κ°€ μ°ΎμœΌλ €λŠ” μŒμ•…μ˜ 제λͺ©μ„ κ΅¬ν•˜μ—¬λΌ.

- 방금 κ·Έ 곑 μ„œλΉ„μŠ€μ—μ„œλŠ” μŒμ•… 제λͺ©, μž¬μƒμ΄ μ‹œμž‘λ˜κ³  λλ‚œ μ‹œκ°, 악보λ₯Ό μ œκ³΅ν•œλ‹€.
- λ„€μ˜€κ°€ κΈ°μ–΅ν•œ λ©œλ‘œλ””μ™€ 악보에 μ‚¬μš©λ˜λŠ” μŒμ€ C, C#, D, D#, E, F, F#, G, G#, A, A#, B 12κ°œμ΄λ‹€.
- 각 μŒμ€ 1뢄에 1κ°œμ”© μž¬μƒλœλ‹€. μŒμ•…μ€ λ°˜λ“œμ‹œ μ²˜μŒλΆ€ν„° μž¬μƒλ˜λ©° μŒμ•… 길이보닀 μž¬μƒλœ μ‹œκ°„μ΄ κΈΈ λ•ŒλŠ” μŒμ•…μ΄ λŠκΉ€ 없이 μ²˜μŒλΆ€ν„° λ°˜λ³΅ν•΄μ„œ μž¬μƒλœλ‹€. μŒμ•… 길이보닀 μž¬μƒλœ μ‹œκ°„μ΄ 짧을 λ•ŒλŠ” μ²˜μŒλΆ€ν„° μž¬μƒ μ‹œκ°„λ§ŒνΌλ§Œ μž¬μƒλœλ‹€.
- μŒμ•…μ΄ 00:00을 λ„˜κ²¨μ„œκΉŒμ§€ μž¬μƒλ˜λŠ” 일은 μ—†λ‹€.
- 쑰건이 μΌμΉ˜ν•˜λŠ” μŒμ•…μ΄ μ—¬λŸ¬ 개일 λ•Œμ—λŠ” λΌλ””μ˜€μ—μ„œ μž¬μƒλœ μ‹œκ°„μ΄ 제일 κΈ΄ μŒμ•… 제λͺ©μ„ λ°˜ν™˜ν•œλ‹€. μž¬μƒλœ μ‹œκ°„λ„ 같을 경우 λ¨Όμ € μž…λ ₯된 μŒμ•… 제λͺ©μ„ λ°˜ν™˜ν•œλ‹€.
- 쑰건이 μΌμΉ˜ν•˜λŠ” μŒμ•…μ΄ 없을 λ•Œμ—λŠ” “(None)”을 λ°˜ν™˜ν•œλ‹€.

 

μž…λ ₯ ν˜•μ‹

 

μž…λ ₯으둜 λ„€μ˜€κ°€ κΈ°μ–΅ν•œ λ©œλ‘œλ””λ₯Ό 담은 λ¬Έμžμ—΄ mκ³Ό λ°©μ†‘λœ 곑의 정보λ₯Ό λ‹΄κ³  μžˆλŠ” λ°°μ—΄ musicinfosκ°€ μ£Όμ–΄μ§„λ‹€.
- m은 음 1개 이상 1439개 μ΄ν•˜λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.
- musicinfosλŠ” 100개 μ΄ν•˜μ˜ 곑 정보λ₯Ό λ‹΄κ³  μžˆλŠ” λ°°μ—΄λ‘œ, 각각의 곑 μ •λ³΄λŠ” μŒμ•…μ΄ μ‹œμž‘ν•œ μ‹œκ°, λλ‚œ μ‹œκ°, μŒμ•… 제λͺ©, 악보 정보가 ', '둜 κ΅¬λΆ„λœ λ¬Έμžμ—΄μ΄λ‹€.
  - μŒμ•…μ˜ μ‹œμž‘ μ‹œκ°κ³Ό λλ‚œ μ‹œκ°μ€ 24μ‹œκ°„ HH:MM ν˜•식이닀.
  - μŒμ•… 제λͺ©μ€ ', ' μ΄μ™Έμ˜ 좜λ ₯ κ°€λŠ₯ν•œ 문자둜 ν‘œν˜„λœ 길이 1 μ΄μƒ 64 μ΄ν•˜μ˜ λ¬Έμžμ—΄μ΄λ‹€.
  - 악보 μ •λ³΄λŠ” 음 1개 이상 1439개 μ΄ν•˜λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.

 

좜λ ₯ ν˜•μ‹

 

쑰건과 μΌμΉ˜ν•˜λŠ” μŒμ•… 제λͺ©μ„ 좜λ ₯ν•œλ‹€.

 

 

문제 풀이

   - my solution

def solution(m, musicinfos):
    answer = ''
    
    arr=[]
    for i in musicinfos:
        temp=i.split(',') 
        start=temp[0].split(':') # μŒμ•… μ‹œμž‘ μ‹œκ°„
        end=temp[1].split(':') # μŒμ•… λλ‚œ μ‹œκ°
        min=(int(end[0])-int(start[0]))*60 + int(end[1])-int(start[1]) # μŒμ•… μž¬μƒ μ‹œκ°„
        
        result=''
        for j in range(len(temp[3])): # ,와 곡백으둜 악보 ꡬ뢄
            if j!=len(temp[3])-1 and temp[3][j+1]!='#':
                result+=temp[3][j]+', '
            else:
                if j==len(temp[3])-1:
                    result+=temp[3][j]+','
                else:
                    result+=temp[3][j]
        k=result.split(' ')
        

        music=(min//len(k))*k + k[:(min%len(k))] # μž¬μƒ μ‹œκ°„ 만큼 악보 그리기
        music=' '.join(music)
                
        arr.append([min,temp[2],music]) # list: μž¬μƒ μ‹œκ°„, μŒμ•… 제λͺ©, 악보 

    
    result=''
    for i in range(len(m)): # ,와 곡백으둜 μžμ‹ μ΄ κΈ°μ–΅ν•˜λŠ” λ©œλ‘œλ”” ꡬ뢄
        if i!=len(m)-1 and m[i+1]!='#':
            result+=m[i]+', '
        else:
            result+=m[i]
    result+=','
    
    
    mmax=-1
    for i in arr: # 쑰건과 μΌμΉ˜ν•˜λŠ” μŒμ•… 제λͺ© μ°ΎκΈ°
        if result in i[2]:
            if mmax<i[0]:
                mmax=i[0]
                answer=i[1]
    
    if answer=='': # 쑰건이 μΌμΉ˜ν•˜λŠ” μŒμ•…μ΄ μ—†λŠ” 경우
        answer='(None)'

    return answer

 

 

1) 곑의 정보λ₯Ό λ‹΄κ³  μžˆλŠ” λ°°μ—΄ 탐색 : (μž¬μƒ μ‹œκ°„ = μŒμ•… λλ‚œ μ‹œκ°„ - μŒμ•… μ‹œμž‘ μ‹œκ°„), (μž¬μƒ μ‹œκ°„λ§ŒνΌ 악보 κ΅¬ν•˜κΈ°)

- list에 (μž¬μƒ μ‹œκ°„, μŒμ•… 제λͺ©, μž¬μƒ μ‹œκ°„λ§ŒνΌμ˜ 악보) μΆ”κ°€

2) μžμ‹ μ΄ κΈ°μ–΅ν•˜λŠ” λ©œλ‘œλ”” ', '와 곡백으둜 ꡬ뢀

3) 쑰건과 μΌμΉ˜ν•˜λŠ” μŒμ•… 제λͺ© μ°ΎκΈ° : 쑰건 μΌμΉ˜ν•˜λŠ” 경우 μž¬μƒμ‹œκ°„μ΄ κΈ΄ μŒμ•…, λ¨Όμ € μž…λ ₯된 μŒμ•… 순

4) 쑰건과 μΌμΉ˜ν•˜λŠ” μŒμ•…μ΄ μ—†μœΌλ©΄ '(None)' 좜λ ₯


μƒκ°πŸ€”

 

이 λ¬Έμ œμ—μ„œ 쑰금 생각해야 ν–ˆλ˜ 뢀뢄은 μ•…λ³΄μ—μ„œ #이 뢙은 κ²½μš°μ˜€λ‹€.

μ–΄λ–»κ²Œ μ½”λ“œλ₯Ό 잘 κ΅¬ν˜„ν•  수 μžˆμ„κΉŒ κ³ λ―Όν•˜λ‹€κ°€ 제일 μ‰¬μš΄ 방법인 ', '와 곡백을 μ‚¬μš©ν•΄μ„œ κ΅¬λΆ„ν•˜μžλŠ” 생각이 λ“€μ—ˆλ‹€.

이제 μ™€μ„œ 생각해보면 κ³΅λ°±λ§ŒμœΌλ‘œλ„ ꡬ뢄할 수 μžˆμ—ˆμ„ 텐데, μ™œ ', 'κΉŒμ§€ ν–ˆλŠ”κ°€...

 

문제λ₯Ό ν’€ λ‹Ήμ‹œ ', 'λ₯Ό λ„£κ³  in으둜 쑰건과 μΌμΉ˜ν•˜λŠ”μ§€ κ΅¬λΆ„ν•˜λ‹ˆ λ‹Ήμ—°νžˆ #을 κ΅¬λΆ„ν•˜μ§€ λͺ»ν•΄ μ œλŒ€λ‘œ 된 값이 λ‚˜μ˜€μ§€ μ•Šμ•˜λ‹€.

곡백을 λ„£λŠ”λ‹€λ©΄ 'C '와 'C# '이 λ‹€λ₯΄κ²Œ λ°›μ•„λ“€μ—¬μ§€μ§€ μ•Šκ² λŠ”κ°€ ν•΄μ„œ μ›λž˜ μ½”λ“œμ— 곡백을 μΆ”κ°€λ‘œ λ„£μ–΄μ£Όμ—ˆλ‹€.

 

μ‹œκ°„ μ΄ˆκ³Όκ°€ λ‚˜μ§€ μ•Šμ„κΉŒ 살짝 무섭기도 ν–ˆμ§€λ§Œ λ‹€ν–‰νžˆ 톡과할 수 μžˆμ—ˆλ‹€.


좜처: ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ μ½”λ”© ν…ŒμŠ€νŠΈ μ—°μŠ΅, https://programmers.co.kr/learn/challenges