프로그래머스 - 추억 점수
출처 - https://school.programmers.co.kr/learn/courses/30/lessons/176963?language=java
문제 설명
문제 풀이
import java.util.*;
import java.util.stream.*;
class Solution {
public int[] solution(String[] name, int[] yearning, String[][] photo) {
// 스트림을 사용하여 배열을 맵으로 변환
Map<String, Integer> nameMap = IntStream.range(0, yearning.length)
.boxed()
.collect(Collectors.toMap(i -> name[i], i -> yearning[i]));
// 짧은 배열 길이 이후에 대해 0으로 값을 할당
IntStream.range(yearning.length, name.length)
.forEach(i -> nameMap.put(name[i], 0));
// photo 배열을 맵의 key와 비교하여 점수로 바꾸고 더함
int[] result = Arrays.stream(photo)
.mapToInt(array -> Arrays.stream(array)
.mapToInt(value -> nameMap.getOrDefault(value, 0))
.sum())
.toArray();
return result;
}
}
아이디어
문제 이해 자체는 어렵지 않은데 2차원 배열은 for문으로 돌리기 다소 난해하기도 하고
for문으로는 꺼내고 꺼내는게 한참 걸려서 안 써본 stream을 공부해서 쓰려고 노력했다.
1. nameMap을 만들어 key로는 이름을 value로는 yearning 배열의 값을 넣었고,
yearning 값이 없는 경우를 대비해서 0을 할당하는 코드를 추가로 넣었다.
2. 2차원 배열의 photo 값에서 이름을 꺼내 nameMap과 비교하는 작업을 했다.
1) photo 2차원 배열을 스트림으로 변경하여 꺼내고
.mapToInt(array -> Arrays.stream(array)
.mapToInt(value -> nameMap.getOrDefault(value, 0))
.sum())
.toArray();
2) 그 안에 있는 배열을 다시 꺼내면서 getOrDefault 메소드를 통해 value(key)값이 있으면 꺼내고,
없으면 0으로 바꾼다음 다시 그 값들을 sum() 메소드로 더헀다.
마지막으로 다시 IntStream으로 바꾸고 다시 배열로 변경했다.
스킬
1. 배열이 두 개인 경우 collect(Collectors.toMap()); 을 이용하여 key와 value를 넣기
2. getOrDefault 사용(key 값을 찾아 value 값을 꺼내기)
'CS > 코딩테스트' 카테고리의 다른 글
리트코드 - 80. Remove Duplicates from Sorted Array II (0) | 2023.08.24 |
---|---|
리트코드 - 26. Remove Duplicates from Sorted Array (2) | 2023.08.24 |
리트코드 - 27. Remove Element (0) | 2023.08.24 |
리트코드 - 88. Merge Sort Array (2) | 2023.08.24 |
프로그래머스 - 달리기 경주(java) (0) | 2023.06.01 |
남에게 설명할 때 비로소 자신의 지식이 된다.
포스팅이 도움되셨다면 하트❤️ 또는 구독👍🏻 부탁드립니다!! 잘못된 정보가 있다면 댓글로 알려주세요.