처음 봤을 때는 간단해 보여서 대충 풀 수 있을 것 같았는데, 생각보다 세심하게 조건을 챙겨야 했다.
사진마다 등장하는 인물들의 그리움 점수를 합산하는 문제다.
만약 사진에 있는 인물이 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;
}
}
이 방식이 시간 복잡도 면에서는 훨씬 낫다.
앞으로 비슷한 문제 만나면 무조건 맵부터 생각하기.
댓글
댓글 작성은 로그인 후에 가능합니다.