[프로그래머스 level1] 추억 점수


문제 해석
name이라는 리스트가 있고, yearning이라는 리스트가 있고, photo라는 리스트가 있다.
name에 있는 리스트는 사람의 이름이 들어가 있고, yearning은 각 이름 별로 그리운 점수가 들어있다.
예를 들어, name이라는 리스트 ["may","kein","kain","radi"] 와 yearning이라는 리스트 [5, 10, 1, 3]이 있으면
may는 5점만큼 그립고
kein은 10점만큼 그립고
kain은 1점만큼 그립고
radi는 3점만큼 그리운 것이다.
그리고 photo라는 리스트가 있고, 이 리스트는 사진에 들어있는 사람의 이름들이다.
[["may", "kein", "kain", "radi"],["may", "kein", "brin", "deny"], ["kon", "kain", "may", "coni"]]
이렇게 되어 있는 건, 0번째 사진에는 ["may", "kein", "kain", "radi"]이 사람들이 있고,
1번째 사진에는["may", "kein", "brin", "deny"] 이 사람들로 이루어져 있고,
2번째 사진에는 ["kon", "kain", "may", "coni"]이 사람들로 이루어진 것이다.
이렇게 사진에 사람 이름이 리스트로 들어가 있을 때 name에 들어있는 사람 이름이라면 그리운 점수를 다 더해서 순서대로 출력하면 된다.
예를 들어
["may","kein","kain","radi"]이렇게 있으면
5점 + 10점 + 1점 + 3점 = 19점
["may","kein","brin","deny"]이렇게 있으면
5점 + 10점 brin과 deny는 없으니까 0점 = 15점
["kon","kain","may","coni"]이렇게 있으면
1점 + 5점 + 0점 = 6점
해서 결과로는 [19, 15, 6]이 출력되어야 한다.
풀이
def solution(name, yearning, photo):
history = {}
total=[]
for i in range(len(name)):
history[name[i]] = yearning[i]
for p in photo:
result = []
for ps in p:
if ps in name:
result.append(history[ps])
# print(result)
total.append(sum(result))
return total
1. 딕셔너리 생성하기
일단 history라는 딕셔너리를 만들어서 name에 해당하는 점수 yearning을 키와 값으로 저장한다.
나중에 키를 이용해서 value를 찾도록 할 예정이다.
그래서 코드를 짜면
for i in range(len(name)):
history[name[i]] = yearning[i]
name의 리스트 길이만큼 i를 0,1,2,...len(name) 생성한다.
비어있는 history에 name을 키로 yearning을 값으로 i가 0일 때부터 생성한다.
그러면 앞 예시로 들면 history = {"may" : 5, "kein" : 10, "kain" : 1, "radi" : 3} 이런식의 딕셔너리가 생성될 것이다.
2. 이중 for문을 사용하여 photo요소값 하나하나 접근하기
결국 photo리스트 안에 리스트로 된 요소의 합을 구해야 하니까, 요소 하나 하나에 접근해서 요소 하나의 점수가 어떤 것인지 확인해야 한다.
for p in photo: 를 하면 [[],[],[]] 리스트 안의 리스트로 된 요소를 접근하게 된다.
또 for ps in p:를 하면 []안의 요소 하나하나 접근하게 된다.
예를들어
[["may", "kein", "kain", "radi"],["may", "kein", "brin", "deny"], ["kon", "kain", "may", "coni"]]
이렇게 되어있다면, for p in photo가 되면
["may", "kein", "kain", "radi"]
["may", "kein", "brin", "deny"]
["kon", "kain", "may", "coni"]
p에는 for문이 돌면서 이렇게 들어갈 것이다.
또 for ps in p:가 되면
may, kein, kain...이렇게 돌게 될 것이다.
3. 접근한 요소가 딕셔너리 키값에 해당한다면 딕셔너리 키에 해당하는 값을 더한다.
- 3-1. 접근한 요소가 딕셔너리 키값에 해당한다면
'접근한 요소가' -> ps일거고
'딕셔너리 키값에 해당한다' -> in name: 일 것이다.
'면' -> if 이여서
if ps in name:
- 3-2. 딕셔너리 키에 해당하는 값을 더한다.
먼저 키에 해당하는 값을 찾으면 history[ps] 일 것이다.
그래서 p에 속해있는 ps의 키에 해당하는 값의 요소들을 찾아 result라는 리스트에 넣어준다.
그리고 p가 바뀔때 result가 초기화 될 수 있도록 for p in photo: 밑에 result=[]해준다. (초기화 안하면 p마다 구분되어야 하는데, 하나에 다 저장되기 때문에 안된다.)
그리고 result에 저장된 숫자들을 sum 함수로 다 더한다.
그 더한 수를 total이라는 리스트를 정의해서 (total = []) append함수를 사용하여 넣는다.
그렇게 모여지면, return total을 하면 된다.
(주의할 점)
for문이 2중으로 쓰였기 때문에, 리스트의 내용을 매번 프린트하면서 위치를 잘 넣어줘야 더하는 값에 오류가 안난다.