[프로그래머스] 10/02 (1)

2021. 10. 2. 18:30·코딩테스트/프로그래머스[Python]

[방금그곡]-[2018 KAKAO BLIND RECRUITMENT]

My answer

# 총 재생길이를 구해주는 함수
def timecalc(a,b):
    tmp,tmp2=[],[]
    
    tmp=a.split(':')
    tmp2=b.split(':')
    
    tmp=[int(i) for i in tmp]
    tmp2=[int(i) for i in tmp2]

    return (tmp2[0]-tmp[0])*60+tmp2[1]-tmp[1]
'''#을 치환해주는 함수'''
def substitution(a):
    alt={'C#':'H','D#':'I','F#':'J','G#':'K','A#':'L','E#':'M'}
    i=0
    tmp=""
    while('#' in a):
        if(a[i]=='#'):
            tmp=a[i-1]+a[i]
            a=a[:i-1]+alt[tmp]+a[i+1:]
            tmp=""
            i-=1
        i+=1
    return a
    
def solution(m, musicinfos):
    answer = []
    tmp,tmp2="",[]
    
    for i in musicinfos:
        tmp.append(i.split(','))
        
    '''입력멜로디에 있는 '#'치환'''
    m=substitution(m)
    
    for i in tmp:
        # '#'이 있는 악보들을 치환함
        i[0]=timecalc(i[0],i[1])
        i[1]=i[2]
        i[2]=substitution(i[3])
        i[3]=len(i[2])
    '''현재 tmp는 [재생시간,제목,기본멜로디,멜로디길이]'''
    
    for i in range(len(tmp)):
        for j in range(tmp[i][0]):
            tmp2+=tmp[i][2][j%tmp[i][3]]
        tmp[i]=[tmp2,tmp[i][1],tmp[i][0]]
        tmp2=""
    '''현재 tmp는 [제목,반복멜로디,재생시간]''' 
        
    for i in tmp:
        if(m in i[0]):
            answer.append([i[1],i[2]])
    answer.sort(key=lambda x:-x[1])
    if(len(answer)==0):
        return "(None)"
        
    return answer[0][0]

Another answer

def shap_to_lower(s):
    s = s.replace('C#','c').replace('D#','d').replace('F#','f').replace('G#','g').replace('A#','a')
    return s

def solution(m,musicinfos):
    answer=[0,'(None)']   # time_len, title
    m = shap_to_lower(m)
    for info in musicinfos:
        split_info = info.split(',')
        time_length = (int(split_info[1][:2])-int(split_info[0][:2]))*60+int(split_info[1][-2:])-int(split_info[0][-2:])
        title = split_info[2]
        part_notes = shap_to_lower(split_info[-1])
        full_notes = part_notes*(time_length//len(part_notes))+part_notes[:time_length%len(part_notes)]
        if m in full_notes and time_length>answer[0]:
            answer=[time_length,title]
    return answer[-1]
더보기

아래 코드는 나와 처리순서들은 똑같지만 처리방법을 다르게 해줬다. 우선 #을 처리하는 것도 훨씬 간단하게 해줬고, 반복멜로디를 구하는것도 더 쉽게 한 것 같다. replace()는 여러번 쓸 수 있다는 것을 다시 한번 기억하자. 

+ 27번 테스트케이스를 내 코드로 돌리면 계속 런타임이 떴는데, E#처리해주는 코드를 추가하니까 넘어갔다.. 문제에 E#관련 내용이없고 아래코드에서는 E#처리를 안해줬는데 돌아간거보니 음.. 테스트케이스에 문제엔 없는 E#이 들어갔는데, replace를 통해 변경하면 우연히 그냥 코드가 돌아가고 다른 방법으로 #을 처리했을 때는 E#을 추가해줘야 하는 것 같다.

 

728x90

'코딩테스트 > 프로그래머스[Python]' 카테고리의 다른 글

[프로그래머스] 10/04 (5)  (0) 2021.10.04
[프로그래머스] 09/29 (1)  (0) 2021.09.29
[프로그래머스] 09/28 (4)  (0) 2021.09.28
[프로그래머스] 09/27 (6)  (0) 2021.09.27
[프로그래머스] 09/26 (1)  (0) 2021.09.26
'코딩테스트/프로그래머스[Python]' 카테고리의 다른 글
  • [프로그래머스] 10/04 (5)
  • [프로그래머스] 09/29 (1)
  • [프로그래머스] 09/28 (4)
  • [프로그래머스] 09/27 (6)
창빵맨
창빵맨
  • 창빵맨
    Let's be Developers
    창빵맨
    로그인/로그아웃
  • 전체
    오늘
    어제
    • 분류 전체보기 (471)
      • 알쓸신잡 (79)
      • ML & DL (85)
        • Computer v.. (22)
        • NLP (22)
        • 파이썬 머신러닝 완.. (3)
        • 개념정리 (38)
      • 리눅스 (21)
      • 프로젝트 (29)
        • 산불 발생 예측 (6)
        • 음성비서 (12)
        • pdf 병합 프로그.. (0)
        • 수위 예측 (5)
        • 가짜 뉴스 분류 (5)
        • 전력사용량 예측 (1)
      • 코딩테스트 (217)
        • 프로그래머스[Pyt.. (17)
        • 프로그래머스[Fai.. (3)
        • 백준[Python] (160)
        • 이것이취업을위한코딩.. (18)
        • 파이썬 알고리즘 (19)
      • 데이터분석실습 (25)
        • 데이터 과학 기반의.. (18)
        • 헬로 데이터 과학 (7)
      • 메모장 (0)
      • 잡담 (4)
  • Personal

    GITHUB
    Instagram
  • 공지사항

  • 인기 글

  • 태그

    이것이취업을위한코딩테스트다
    이코테
    백준
    이분탐색
    dp
    나동빈
    BFS
    그리디
    파이썬
    DFS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3

HOME

HOME

상단으로

티스토리툴바