문제 설명

사진들을 보며 추억에 젖어 있던 루는 사진별로 추억 점수를 매길려고 합니다. 사진 속에 나오는 인물의 그리움 점수를 모두 합산한 값이 해당 사진의 추억 점수가 됩니다. 예를 들어 사진 속 인물의 이름이 [“may”, “kein”, “kain”]이고 각 인물의 그리움 점수가 [5점, 10점, 1점]일 때 해당 사진의 추억 점수는 16(5 + 10 + 1)점이 됩니다. 다른 사진 속 인물의 이름이 [“kali”, “mari”, “don”, “tony”]이고 [“kali”, “mari”, “don”]의 그리움 점수가 각각 [11점, 1점, 55점]이고, “tony”는 그리움 점수가 없을 때, 이 사진의 추억 점수는 3명의 그리움 점수를 합한 67(11 + 1 + 55)점입니다.
그리워하는 사람의 이름을 담은 문자열 배열 name, 각 사람별 그리움 점수를 담은 정수 배열 yearning, 각 사진에 찍힌 인물의 이름을 담은 이차원 문자열 배열 photo가 매개변수로 주어질 때, 사진들의 추억 점수를 photo에 주어진 순서대로 배열에 담아 return하는 solution 함수를 완성해주세요.

제한사항

  • 3 ≤ name의 길이 = yearning의 길이≤ 100
    • 3 ≤ name의 원소의 길이 ≤ 7
    • name의 원소들은 알파벳 소문자로만 이루어져 있습니다.
    • name에는 중복된 값이 들어가지 않습니다.
    • 1 ≤ yearning[i] ≤ 100
    • yearning[i]는 i번째 사람의 그리움 점수입니다.
  • 3 ≤ photo의 길이 ≤ 100
    • 1 ≤ photo[i]의 길이 ≤ 100
    • 3 ≤ photo[i]의 원소(문자열)의 길이 ≤ 7
    • photo[i]의 원소들은 알파벳 소문자로만 이루어져 있습니다.
    • photo[i]의 원소들은 중복된 값이 들어가지 않습니다.
  • 문제 보러가기


문제 풀이

(1) 코드 작성

def solution(name, yearning, photo):
    dic = {n:y for n, y in zip(name, yearning)}
    answer = []
    for one_photo in photo:
        memory_point = 0
        for person in one_photo:
            if person in name:
                memory_point += dic[person]
        answer.append(memory_point)
    return answer

(2) 코드 리뷰

이름별 추억점수를 딕셔너리형태로 저장하였고 photo의 요소들에 대한 추억점수를 구하기 위해 반복문을 사용했다(반복문 중첩). photo 리스트 안에 3개 이상의 리스트가 존재하는데 그 리스트안의 추억점수를 각각 구해야하기 때문에 반복문을 중첩하여 사용했다. 사진에는 추억의 점수가 없는 사람이 존재하는데 존재하지 않는 이름을 딕셔너리에서 구하려고 하면 에러가 뜨기 때문에 사진 속 인물이 name에 있는지 판단하고 있으면 추억점수를 매길 수 있도록 코드를 작성했다. 위 코드는 잘 작성했다! 라는 생각은 들지않아서 조금 더 간결하게 작성해 보았다(아래 코드).

def solution(name, yearning, photo):
    dic = {n:y for n, y in zip(name, yearning)}
    return [sum([dic[n] for n in p if n in name]) for p in photo]

한 번에 이해하기 쉬운 코드가 아니라는 점에서 위 코드도 마음에 들진 않는다.

def solution(name, yearning, photo):
    answer = []
    for one_photo in photo:
        memory_point = 0
        for person in one_photo:
            if person in name:
                memory_point += yearning[name.index(person)]
        answer.append(memory_point)
    return answer

위 코드는 (1) 코드 작성 부분의 코드와 거의 같다. 다른 점은 이름별 추억점수를 딕셔너리로 만들지않고 index 값을 불러와서 추억점수를 더해주었는 점이다. 실행결과를 보니 딕셔너리로 만들어서 점수를 더해가는 방법이 속도 부분에서 성능이 더 좋았다. 아무래도 for - for 중첩문에 if로 찾는 연산 + index 함수로 찾는 연산 때문에 마지막 코드의 성능이 더 안좋게 나타난 것같다.
문제를 풀때 여러 방법으로 접근해 보는 과정이 너무 재밌는 것같다.

👩🏻‍💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.

댓글남기기