728x90
반응형
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 문제 설명
2. 풀이과정
해당 문제는 각 음악의 정보를 가지고 재생된 시간을 확인하고 재생된 내용을 구한다.
이후 재생된 내용에 기억한 멜로디가 있는지 확인한다.
여기서 각 음악의 정보에는 # 문자가 포함되어 있기에 하나의 문자열로 된 악보 정보과 기억한 멜로디의 각 음을 분리할 때 문자열을 각 문자로 분리하고 # 문자를 고려해줘야 한다.
- 가능한 모든 결과를 저장할 리스트를 생성한다. result = list()
- 방송된 곡의 정보를 하나씩 불러오며 for i in musicinfos
- 불러온 곡의 정보를 , (콤마) 기준으로 분리하여 리스트로 저장한다. info = i.split(',')
- 재생된 전체 시를 구한다. hour = int(info[1].split(':')[0]) - int(info[0].split(':')[0])
- 재생된 전체 분을 구한다. minute = int(info[1].split(':')[1]) - int(info[0].split(':')[1])
- 시와 분을 가지고 재생된 총시간을 분으로 구한다. time = hour * 60 + minute
- 한 문자열로 구성된 악보 정보를 각 문자로 분리하여 리스트로 저장한다. music = list(info[-1])
- # 문자를 붙여줘야 하는데 인덱스를 나타낼 변수를 생성한다. i = 1
- 인덱스가 악보 정보의 길이를 넘어가거나 # 문자가 없을 때까지 반복한다. while (i < len(music)) and ('#' in music)
- 만약 해당 인덱스의 문자가 #이면 if (music[i] == '#')
- # 문자를 이전 문자와 결합해 하나의 문자로 만들어 저장한다. music[i - 1] = music[i - 1] + music[i]
- # 문자를 악보 정보 리스트에서 제거한다. del music[i]
- 반면 # 문자가 아니라면 인덱스를 다음 인덱스로 옮긴다. else: i += 1
- 전체 악보 정보의 길이를 저장한다. length = len(music)
- 해당 음악이 재생된 내용을 저장한다. play = music * (time // length) + music[ : time % length]
- 한 문자열인 기억한 멜로디 정보도 각 문자를 분리해 리스트로 저장한다. m = list(m)
- 기억한 멜로디 정보 또한 # 문자를 이전 문자에 붙여준다. i = 1
- 인덱스가 멜로디의 길이를 넘어가거나 # 문자가 없을 때까지 반복한다. while (i < len(m)) and ('#' in m)
- 만약 해당 인덱스의 문자가 #이면 if (m[i] == '#')
- # 문자를 이전 문자와 결합해 하나의 문자로 만들어 저장한다. m[i - 1] = m[i - 1] + m[i]
- # 문자를 멜로디 리스트에서 제거한다. del m[i]
- 반면 # 문자가 아니라면 인덱스를 다음 인덱스로 옮긴다. else: i += 1
- 음악의 재생된 내용을 가지고 기억한 멜로디의 부분이 있는지 확인한다. for i in range(len(play) - len(m) + 1)
- 만약 해당 재생된 부분이 기억한 멜로디와 동일하면 if (play[i : i + len(m)] == m)
- 해당 음악의 제목과 재생된 시간을 추가한다. result.append([info[2], time])
- 음악이 재생되었다는 것을 확인했으므로 확인을 종료한다. break
- 모든 음악을 확인한 후, 만약 가능한 모든 결과의 리스트에 결과가 있다면 if (len(result) > 0)
- 재생 시간이 긴 순서대로 정렬한다. result.sort(key = lambda x : x[1], reverse = True)
- 제일 앞에 오는 정보의 음악 제목을 저장한다. answer = result[0][0]
- 반면에 가능한 결과가 없다면 (None)을 저장한다. else: answer = '(None)'
반응형
3. 소스코드
def solution(m, musicinfos):
answer = ''
result = list()
for i in musicinfos:
info = i.split(',')
hour = int(info[1].split(':')[0]) - int(info[0].split(':')[0])
minute = int(info[1].split(':')[1]) - int(info[0].split(':')[1])
time = hour * 60 + minute
music = list(info[-1])
i = 1
while (i < len(music)) and ('#' in music):
if (music[i] == '#'):
music[i - 1] = music[i - 1] + music[i]
del music[i]
else:
i += 1
length = len(music)
play = music * (time // length) + music[ : time % length]
m = list(m)
i = 1
while (i < len(m)) and ('#' in m):
if (m[i] == '#'):
m[i - 1] = m[i - 1] + m[i]
del m[i]
else:
i += 1
for i in range(len(play) - len(m) + 1):
if (play[i : i + len(m)] == m):
result.append([info[2], time])
break
if (len(result) > 0):
result.sort(key = lambda x : x[1], reverse = True)
answer = result[0][0]
else:
answer = '(None)'
return answer
728x90
반응형
'프로그래머스 > Python' 카테고리의 다른 글
[프로그래머스] 시소 짝꿍 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.03.18 |
---|---|
[프로그래머스] 마법의 엘리베이터 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.02.04 |
[프로그래머스] 보석 쇼핑 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.11.17 |
[프로그래머스] 호텔 대실 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.11.15 |
[프로그래머스] 무인도 여행 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.11.11 |
[프로그래머스] 메뉴 리뉴얼 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.11.07 |
[프로그래머스] 불량 사용자 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.11.04 |
[프로그래머스] 스티커 모으기(2) - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.11.01 |