▼ Why ?
이번 문제는 문자나 숫자가 아닌 String 배열 입력받는 문제라 한 번 풀어보려고 한다
▼ 추억 점수
문제 정보
사진들을 보며 추억에 젖어 있던 루는 사진별로 추억 점수를 매길려고 합니다. 사진 속에 나오는 인물의 그리움 점수를 모두 합산한 값이 해당 사진의 추억 점수가 됩니다. 예를 들어 사진 속 인물의 이름이 ["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 함수를 완성해주세요.
코딩테스트 연습 - 추억 점수 | 프로그래머스 스쿨 (programmers.co.kr)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
제한 사항
- 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]의 원소들은 중복된 값이 들어가지 않습니다.
입출력 예

어떻게 해결해야 할까?
- 일단 String 배열의 요소인 ' name[i] ' 을 key 값으로, 추억 점수를 담고 있는 ' yearning[i] ' 를 value 값으로 하여 HashMap class의 intance(' nameYearn ')을 생성하고 저장한다
- 반환할 결과값을 담을 배열 ' answer ' 도 하나 생성해준다
- 그렇게 저장한 값들을 기반으로 2차원 배열인 ' photo ' 에 행(row)별로 순차적으로 접근하고 그 행에 저장돼 있는 문자열과 ' nameYearn ' 의 key 값에 매칭되는 value 값들을 모두 더해준다
- 그렇게 더한 값을 ' answer ' 에서 해당 행을 index로 하는 요소에 저장해주자
해결 코드 0
import java.util.*;
class Solution {
public int[] solution(String[] name, int[] yearning, String[][] photo) {
HashMap<String, Integer> nameYearn = new HashMap<>();
for(int i = 0; i < name.length; i++) {
nameYearn.put(name[i], yearning[i]);
}
int[] answer = new int[photo.length];
for(int i = 0; i < photo.length; i++) {
for(int j = 0; j < photo[i].length; j++) {
// if(nameYearn.containsKey(photo[i][j]))
// answer[i] += nameYearn.get(photo[i][j]);
answer[i] += nameYearn.getOrDefault(photo[i][j], 0);
}
}
return answer;
}
}

해결 코드 1
- 확장 for문을 이용해서도 코드를 작성해보자
import java.util.*;
class Solution {
public int[] solution(String[] name, int[] yearning, String[][] photo) {
HashMap<String, Integer> nameYearn = new HashMap<>();
for (int i = 0; i < name.length; i++) {
nameYearn.put(name[i], yearning[i]);
}
int[] answer = new int[photo.length];
int idx = 0;
for (String[] persons : photo) {
for (String person : persons) {
answer[idx] += nameYearn.getOrDefault(person, 0);
}
idx++;
}
return answer;
}
}

▼ 정리
- ' length ' 는 문자열의 길이를 반환할 때 쓰고, ' length() '는 배열의 길이를 반환할 때 쓴다 (헷갈림)
- key 값이 없는 경우에도 value 값을 얻길 원하는 경우엔, ' containsKey() ' 메서드로 해당 key 값이 있는지 확인하고 다음 작업을 수행하도록 하는 코드도 작성해봤는데, ' getOrDefault() ' 메서드를 이용하면 간결하게 코드를 작성할 수 있음을 확인할 수 있었다
(가독성은 ' containsKey() ' 메서드를 사용하는 것이 더 좋은 것 같다) - 지금까지 푼 문제들은 ' getOrDefault ' 메서드를 HashMap에 값을 넣을 때 주로 사용했는데, 이번 문제처럼 HashMap에 원하는 key 값이 없어도 value 값을 얻고 싶을 때도 유용하게 사용할 수 있다
- 이번 문제는 향상된 for문을 사용하여 풀어도 되지만, 2차원 배열의 행(row)을 index로 하여 추억 점수의 합을 저장해야 하기 때문에, 성능적인 면에서 차이가 없기도 하고 굳이 향상된 for문을 사용하기 위해 새로운 변수를 생성할 필요는 없을 것 같다
▼ Why ?
이번 문제는 문자나 숫자가 아닌 String 배열 입력받는 문제라 한 번 풀어보려고 한다
▼ 추억 점수
문제 정보
사진들을 보며 추억에 젖어 있던 루는 사진별로 추억 점수를 매길려고 합니다. 사진 속에 나오는 인물의 그리움 점수를 모두 합산한 값이 해당 사진의 추억 점수가 됩니다. 예를 들어 사진 속 인물의 이름이 ["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 함수를 완성해주세요.
코딩테스트 연습 - 추억 점수 | 프로그래머스 스쿨 (programmers.co.kr)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
제한 사항
- 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]의 원소들은 중복된 값이 들어가지 않습니다.
입출력 예

어떻게 해결해야 할까?
- 일단 String 배열의 요소인 ' name[i] ' 을 key 값으로, 추억 점수를 담고 있는 ' yearning[i] ' 를 value 값으로 하여 HashMap class의 intance(' nameYearn ')을 생성하고 저장한다
- 반환할 결과값을 담을 배열 ' answer ' 도 하나 생성해준다
- 그렇게 저장한 값들을 기반으로 2차원 배열인 ' photo ' 에 행(row)별로 순차적으로 접근하고 그 행에 저장돼 있는 문자열과 ' nameYearn ' 의 key 값에 매칭되는 value 값들을 모두 더해준다
- 그렇게 더한 값을 ' answer ' 에서 해당 행을 index로 하는 요소에 저장해주자
해결 코드 0
import java.util.*;
class Solution {
public int[] solution(String[] name, int[] yearning, String[][] photo) {
HashMap<String, Integer> nameYearn = new HashMap<>();
for(int i = 0; i < name.length; i++) {
nameYearn.put(name[i], yearning[i]);
}
int[] answer = new int[photo.length];
for(int i = 0; i < photo.length; i++) {
for(int j = 0; j < photo[i].length; j++) {
// if(nameYearn.containsKey(photo[i][j]))
// answer[i] += nameYearn.get(photo[i][j]);
answer[i] += nameYearn.getOrDefault(photo[i][j], 0);
}
}
return answer;
}
}

해결 코드 1
- 확장 for문을 이용해서도 코드를 작성해보자
import java.util.*;
class Solution {
public int[] solution(String[] name, int[] yearning, String[][] photo) {
HashMap<String, Integer> nameYearn = new HashMap<>();
for (int i = 0; i < name.length; i++) {
nameYearn.put(name[i], yearning[i]);
}
int[] answer = new int[photo.length];
int idx = 0;
for (String[] persons : photo) {
for (String person : persons) {
answer[idx] += nameYearn.getOrDefault(person, 0);
}
idx++;
}
return answer;
}
}

▼ 정리
- ' length ' 는 문자열의 길이를 반환할 때 쓰고, ' length() '는 배열의 길이를 반환할 때 쓴다 (헷갈림)
- key 값이 없는 경우에도 value 값을 얻길 원하는 경우엔, ' containsKey() ' 메서드로 해당 key 값이 있는지 확인하고 다음 작업을 수행하도록 하는 코드도 작성해봤는데, ' getOrDefault() ' 메서드를 이용하면 간결하게 코드를 작성할 수 있음을 확인할 수 있었다
(가독성은 ' containsKey() ' 메서드를 사용하는 것이 더 좋은 것 같다) - 지금까지 푼 문제들은 ' getOrDefault ' 메서드를 HashMap에 값을 넣을 때 주로 사용했는데, 이번 문제처럼 HashMap에 원하는 key 값이 없어도 value 값을 얻고 싶을 때도 유용하게 사용할 수 있다
- 이번 문제는 향상된 for문을 사용하여 풀어도 되지만, 2차원 배열의 행(row)을 index로 하여 추억 점수의 합을 저장해야 하기 때문에, 성능적인 면에서 차이가 없기도 하고 굳이 향상된 for문을 사용하기 위해 새로운 변수를 생성할 필요는 없을 것 같다