처음 봤을 때는 간단해 보여서 대충 풀 수 있을 것 같았는데, 생각보다 세심하게 조건을 챙겨야 했다. 사진마다 등장하는 인물들의 그리움 점수를 합산하는 문제다. 만약 사진에 있는 인물이 name 리스트에 없다면 0점으로 처리하는 것도 조심해야 했다. 나의 풀이:

import java.util.Arrays;

class Solution {
    public int[] solution(String[] name, int[] yearning, String[][] photo) {
        int[] score = new int[photo.length];
        
        for(int i = 0; i < photo.length; i++){
            for(int j = 0; j < photo[i].length; j++){
                int idx = Arrays.asList(name).indexOf(photo[i][j]);
                if(idx == -1){
                    continue;
                }else{
                    score[i] += yearning[idx];                    
                }
            }
        }
        return score;
    }
}

처음에는 단순히 Arrays.asList(name).indexOf(사람 이름) 이런 식으로 인덱스를 찾는 방법을 썼다. 근데 indexOf를 매번 호출하면 리스트를 순회하는 거라, 이름 수가 많을 경우 성능 이슈가 있을 수도 있다. 더 좋은 방법은 HashMap으로 (이름, 점수) 를 미리 매핑해 두고, 사진 순회할 때마다 바로 점수를 가져오는 방식이다. 그래도 제한사항이 크지 않아서 (name 최대 100개) 이 정도 풀이는 무리 없이 통과했다. HashMap 이용한 개선된 코드:

import java.util.HashMap;

class Solution {
    public int[] solution(String[] name, int[] yearning, String[][] photo) {
        HashMap map = new HashMap<>();
        for (int i = 0; i < name.length; i++) {
            map.put(name[i], yearning[i]);
        }
        
        int[] score = new int[photo.length];
        
        for (int i = 0; i < photo.length; i++) {
            for (int j = 0; j < photo[i].length; j++) {
                score[i] += map.getOrDefault(photo[i][j], 0);
            }
        }
        return score;
    }
}

이 방식이 시간 복잡도 면에서는 훨씬 낫다. 앞으로 비슷한 문제 만나면 무조건 맵부터 생각하기.