[문제 링크] 👇
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이 방법
photo 에서 한 행씩 꺼내고, 해당 행의 열을 하나씩 꺼내서 이름 리스트에 이름이 있는 경우 점수에 누적시킨다.
한 행을 다 돌았으면 점수를 결과 리스트에 추가한다.
Solution
def solution(name, yearning, photo):
answer = []
for i in photo:
score = 0
for j in i:
if j in name: # 해당 이름이 있는 경우
score += yearning[name.index(j)]
answer.append(score)
return answer
현재 코드는 name.index(j)를 통해 리스트에서 이름의 인덱스를 찾는데, 리스트 검색이 반복적으로 수행되어 비효율적일 수 있다. 특히, photo의 크기가 커질수록 성능이 저하될 가능성이 크다.
개선할 점
- 딕셔너리를 사용하여 검색 시간 단축
리스트를 매번 검색하지 않고, name과 yearning을 매핑한 딕셔너리를 사용하면 검색 시간이 상수 시간(O(1))으로 줄어든다. - 코드 가독성 향상
변수를 적절히 네이밍하고 반복문을 간소화하면 가독성이 좋아진다.
개선된 코드
def solution(name, yearning, photo):
# 이름과 그리움 점수를 딕셔너리로 매핑
yearning_dict = dict(zip(name, yearning))
answer = []
for people in photo:
# 각 사진 속 인물의 점수를 계산
score = sum(yearning_dict.get(person, 0) for person in people)
answer.append(score)
return answer
시간 복잡도
- 기존 코드
- photo의 각 사진마다 j in name과 name.index(j)를 수행하므로 최악의 경우 O(N * M * K) (N: photo 길이, M: 사진 속 이름 수, K: name 길이).
- 개선 코드
- 딕셔너리를 사용하여 점수 조회가 O(1)이 되므로, 전체 시간 복잡도는 O(N * M).
dict.get()
딕셔너리에서 존재하지 않는 키를 조회할 때 기본값(여기서는 0)을 반환하도록 설정하여 예외 처리를 간소화한다.
'프로그래머스 코딩테스트 > Level 1' 카테고리의 다른 글
[Programmers] L1. 카드 뭉치 (Python) (2) | 2024.11.16 |
---|---|
[Programmers] L1. [1차] 비밀지도 (Python) (1) | 2024.11.12 |
[Programmers] L1. 푸드 파이트 대회 (Python) (0) | 2024.11.11 |
[Programmers] L1. 콜라 문제 (Python) (0) | 2024.11.07 |
[Programmers] L1. 모의고사 (완전탐색/Python) (0) | 2024.11.06 |