IT 공부/코딩테스트

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

unnimm 2023. 8. 6. 02:23

문제 해석

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중으로 쓰였기 때문에, 리스트의 내용을 매번 프린트하면서 위치를 잘 넣어줘야 더하는 값에 오류가 안난다.