Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 2020 카카오 인턴십
- 이분탐색
- 로봇 청소기
- 백트래킹
- 2021 KAKAO BLIND RECRUITMENT
- 파이썬
- 트라이
- BFS
- 조합
- 구현
- Spring
- 우선순위큐
- 최소 신장 트리
- 백준
- 플로이드와샬
- 2019 KAKAO BLIND RECRUITMENT
- 브루트포스
- GIT
- SWEA
- 다익스트라
- 크루스칼
- 비트마스킹
- 2018 KAKAO BLIND RECRUITMENT
- 투 포인터
- 투포인터
- 플로이드 와샬
- 2020 KAKAO BLIND RECRUITMENT
- 프로그래머스
- 스택
- 시뮬레이션
Archives
- Today
- Total
개발조아
[프로그래머스] 방금그곡 파이썬 본문
728x90
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/17683
구현문제이다. 문자열 처리만 잘 해준다면 크게 어렵지 않다.
악보나 기억한 멜로디를 전처리를 해주어야한다.
C,C# 이처럼 #이 붙은 문자열을 처리해줘야한다.
왜냐면 기억한 멜로디가 CC 이고 악보가 CC#이라면 판별하기 까다롭기 때문에 다 다른 문자로 바꿔주자.
나는 그냥 모든 음 다른 문자열로 매칭시켜줬다.
주의할 점은 문제에 사용되는 음에 E#이 빠져있다. 이것을 추가해줘야한다.
이부분을 확인 못해서 테케 27번에서 틀렸는데 질문하기를 보고 알았다.
그리고 시작시간, 끝시간을 가지고 총 재생시간을 구하자.
둘다 분으로 바꿔서 끝시간에서 시작시간을 빼주면 된다.
이제 전체 재생시간 동안의 악보를 구하자.
악보보다 재생시간이 길면 처음부터 다시 반복한다고 했다.
따라서 전체 재생시간을 악보 길이도 나눠주자.
이때 몫 만큼 악보를 반복해주고 나머지 길이 만큼 악보에서 짤라서 이어주자.
이제 전체 재생시간 동안의 악보를 구했다.
이제 기억하고 있는 멜로디가 악보의 포함되어 있는지 검사하자.
파이썬은 그냥 in 을 사용하면 쉽게 할 수 있다.
마지막으로 정답이 여러개인 경우를 확인 해주자. 그래서 나는 answer_total이라는 변수를 사용했다.
해당 시간은 정답을 찾았을 때의 재생시간을 기록한 것이다.
그래서 정답인 경우 해당 시간보다 큰 경우 값을 갱신해줬다.
def solution(m, musicinfos):
answer = ''
answer_total = 0
m = melody_to_string(m)
for info in musicinfos:
start,end,title,board = info.split(',')
total = calc_total_time(start,end)
melody = melody_to_string(board)
a = total//len(melody)
b = total%len(melody)
melody = melody*a+melody[:b]
if m in melody:
if answer_total < total:
answer = title
answer_total = total
return answer if answer else '(None)'
def melody_to_string(board):
converter = {
'C':'a','C#':'b','D':'c','D#':'d','E':'e','F':'f','F#':'g','G':'h','G#':'i','A':'j','A#':'k','B':'l','E#':'m'
}
melody = ''
idx = 0
while idx < len(board):
if idx+1 < len(board) and board[idx+1] == '#':
melody += converter[board[idx]+'#']
idx += 2
else:
melody += converter[board[idx]]
idx += 1
return melody
def calc_total_time(start,end):
sm = 60*int(start[:2])+int(start[3:])
em = 60*int(end[:2])+int(end[3:])
return em-sm
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 아이템 줍기 파이썬 (0) | 2021.10.23 |
---|---|
[프로그래머스] 셔틀버스 파이썬 (0) | 2021.10.06 |
[프로그래머스] 빛의 경로 사이클 파이썬 (0) | 2021.10.01 |
[프로그래머스] 표 편집 파이썬 (0) | 2021.10.01 |
[프로그래머스] 길 찾기 게임 파이썬 (1) | 2021.09.04 |
Comments