코딩테스트 연습 - [3차] 방금그곡
방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV,
programmers.co.kr
해결 과정
첫 날 문제를 풀었을 때는 C#과 같은 문자열을 그대로 사용하느라 코드도 길어지고, 테스트케이스 몇 개에서 틀리는데 어디서 틀리는지 몰라서 놔뒀다. IDEA를 살펴보니, 이런 방법 말고도 문자열을 치환해서 사용할 수 있다고. 오늘 다시 이 방법으로 풀어보니 바로 풀렸다. 이 문제는 이런 IDEA를 생각하고 해결에 녹아내는 것이 Point였다.
나의 풀이
from datetime import datetime
import re
def solution(m, musicinfos):
answer = ''
noteDict = {'C#': '1', 'D#': '2', 'F#': '3', 'G#': '4', 'A#': '5'}
candidates = []
for idx, value in noteDict.items():
m = re.sub(idx, value, m)
for index, musicinfo in enumerate(musicinfos):
arr = musicinfo.split(",")
delta = datetime.strptime(arr[1], "%H:%M") - datetime.strptime(arr[0], "%H:%M")
diff = int(delta.total_seconds() // 60)
song = arr[3]
for idx, value in noteDict.items():
song = re.sub(idx, value, song)
finalSong = song * (diff // len(song)) + song[:diff % len(song)]
if m in finalSong:
candidates.append((diff, index, arr[2]))
answerArr = sorted(candidates, key=lambda x: (-x[0], x[1]))
return answerArr[0][2] if answerArr else '(None)'
다른 풀이
IDEA
- 문자열로 된 시간 차이 계산해서 int값으로 얻기
from datetime import datetime
delta = datetime.strptime(시간1, "%H:%M") - datetime.strptime(시간2, "%H:%M")
diff = int(delta.total_seconds() // 60) # 분
- 여러 기준으로 정렬할 때(오름차순, 내림차순 섞여 있을 때)
key=lambda x: (-x[0], x[1]) 이런 아이디어. 음수 활용
- 문자열 내 특정 문자 모두 치환
import re
re.sub(바꿀문자, 치환문자, 대상)
그냥 replace로도 가능함
print("C#asdkjC#asdklC#".replace("C#", "바뀜"))
# 바뀜asdkj바뀜asdkl바뀜
'Coding Test > 문제 풀이' 카테고리의 다른 글
[문제 풀이] 행렬 테두리 회전하기 (0) | 2022.06.09 |
---|---|
[문제 풀이] 짝지어 제거하기 (0) | 2022.06.08 |
[문제 풀이] 백준 18870 (0) | 2022.04.08 |
[문제 풀이] 백준 1167 (0) | 2022.04.08 |
[문제 풀이] 백준 1043 (0) | 2022.04.08 |
코딩테스트 연습 - [3차] 방금그곡
방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV,
programmers.co.kr
해결 과정
첫 날 문제를 풀었을 때는 C#과 같은 문자열을 그대로 사용하느라 코드도 길어지고, 테스트케이스 몇 개에서 틀리는데 어디서 틀리는지 몰라서 놔뒀다. IDEA를 살펴보니, 이런 방법 말고도 문자열을 치환해서 사용할 수 있다고. 오늘 다시 이 방법으로 풀어보니 바로 풀렸다. 이 문제는 이런 IDEA를 생각하고 해결에 녹아내는 것이 Point였다.
나의 풀이
from datetime import datetime
import re
def solution(m, musicinfos):
answer = ''
noteDict = {'C#': '1', 'D#': '2', 'F#': '3', 'G#': '4', 'A#': '5'}
candidates = []
for idx, value in noteDict.items():
m = re.sub(idx, value, m)
for index, musicinfo in enumerate(musicinfos):
arr = musicinfo.split(",")
delta = datetime.strptime(arr[1], "%H:%M") - datetime.strptime(arr[0], "%H:%M")
diff = int(delta.total_seconds() // 60)
song = arr[3]
for idx, value in noteDict.items():
song = re.sub(idx, value, song)
finalSong = song * (diff // len(song)) + song[:diff % len(song)]
if m in finalSong:
candidates.append((diff, index, arr[2]))
answerArr = sorted(candidates, key=lambda x: (-x[0], x[1]))
return answerArr[0][2] if answerArr else '(None)'
다른 풀이
IDEA
- 문자열로 된 시간 차이 계산해서 int값으로 얻기
from datetime import datetime
delta = datetime.strptime(시간1, "%H:%M") - datetime.strptime(시간2, "%H:%M")
diff = int(delta.total_seconds() // 60) # 분
- 여러 기준으로 정렬할 때(오름차순, 내림차순 섞여 있을 때)
key=lambda x: (-x[0], x[1]) 이런 아이디어. 음수 활용
- 문자열 내 특정 문자 모두 치환
import re
re.sub(바꿀문자, 치환문자, 대상)
그냥 replace로도 가능함
print("C#asdkjC#asdklC#".replace("C#", "바뀜"))
# 바뀜asdkj바뀜asdkl바뀜