2022. 11. 27. 16:26ㆍ백준 & 프로그래머스
문제 보기
https://school.programmers.co.kr/learn/courses/30/lessons/17683
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이 & 코드
확실히 카카오 문제가 함정이 좀 많다. 다르게 말하면 문제가 더럽다. 다른 문제들은 A 할 수 있어? 느낌이면 카카오 문제들은 A'"1234 이런 느낌이다... 이것저것 덧칠해서 꼼꼼히 살피고 풀지 않으면 100점 맞기 어렵다. 그래도 이 문제는 비교적 깔끔한 문제이다.
풀이의 전체적인 흐름은 네오가 기억한 부분(m)이 특정 노래의 총 재생부분(full)안에 있는 지 확인하는 구조로 작성하였다. 필자가 생각하기에 해당 문제에서 주의할 점은 총 3개이다.
먼저는 시간을 어떻게 계산할 것인가 이다. 시간 모듈을 가지고 와서 풀려다가 다행히 00:00을 넘지 않는다고 해 int() 함수를 사용해 시간 차를 분으로 바꾸어 주었다. start와 end 파라미터는 "HH:MM" 형태의 string이다.
def cal_minutes(start, end):
hour = int(end[:2]) - int(start[:2])
minute = int(end[3:]) - int(start[3:])
return hour * 60 + minute
둘째는 '#' 처리이다. 처음엔 '#'을 처리하지 않고 코드를 작성했고 원하는 값이 나오지 않았다. 디버깅을 해보니 노래에 '#'이 있다면 노래의 길이가 길어진다. 다시말해 "C#D" 노래의 길이는 2인데 '#'을 처리 하지 않는다면 노래 길이를 3이라고 생각하게 된다. 그렇다고 그냥 '#'을 제거하면 노래가 바뀌게 된다. 그래서 '#'이 붙은 것은 음을 소문자로 바꾸어 구분해 주었다. "C#D" 노래는 "cD"로 바꾸어 주었다.
def changeSharp(str):
while '#' in str:
loc = str.find('#')
str = str[:loc-1] + str[loc-1].lower() + str[loc+1:]
return str
마지막은 문제 조건을 만족하는 노래가 여러 개일 경우이다.
- 조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다.
해당 문제에는 다음과 같이 적혀있다. 따라서 필자는 조건을 만족하는 노래들을 노래 길이와 함께 list로 저장해주었고 solution함수 마지막에 term을 기준으로 내림차순으로 정렬시켜주었다. 참고로 2차원 배열해서는 key와 lambda를 이용해 몇번째 요소를 기준으로 정렬할 지 선정할 수 있다. 또한 -를 붙이면 내림차순, 붙이지 않으면 오름차순이다.
answer.sort(key = lambda x: -x[0])
전체 코드
def cal_minutes(start, end):
hour = int(end[0:2]) - int(start[0:2])
minute = int(end[3:]) - int(start[3:])
return hour * 60 + minute
def changeSharp(str):
while '#' in str:
loc = str.find('#')
str = str[:loc-1] + str[loc-1].lower() + str[loc+1:]
return str
def solution(m, musicinfos):
m = changeSharp(m)
answer = []
for i in range(len(musicinfos)):
lst = list(musicinfos[i].split(','))
term = cal_minutes(lst[0], lst[1])
name = lst[2]
song = changeSharp(lst[3])
n = len(song)
full = song * (term // n) + song[:term % n]
if m in full:
answer.append([term, name])
answer.sort(key = lambda x: -x[0])
return answer[0][1] if len(answer) > 0 else "(None)"
'백준 & 프로그래머스' 카테고리의 다른 글
[프로그래머스] 여행경로 - PYTHON (0) | 2022.11.29 |
---|---|
[프로그래머스] 자물쇠와 열쇠 - PYTHON (0) | 2022.11.27 |
[프로그래머스] 기지국 설치 - PYTHON (0) | 2022.11.27 |
[프로그래머스] 후보키 - PYTHON (0) | 2022.11.22 |
[프로그래머스] 가장 긴 팰린드롬 - PYTHON (0) | 2022.11.21 |