[Programmers] 튜플 (Java)
by 뚜부니https://school.programmers.co.kr/learn/courses/30/lessons/64065
문제 요약
원소의 개수가 n개이고 중복되는 원소가 없는 튜플(a1, a2, a3,... an)이 주어질 때, 이는 집합 기호 ({ })를 이용해 다음과 같이 표현할 수 있습니다.
{{a1}, {a1, a2}, {a1, a2, a3}, ... , {a1, a2, a3,...., an}}
예를 들어 튜플이 (2, 1, 3, 4)인 경우 이는 {{2}, {2, 1}, {2, 3, 1}, {2, 1, 3, 4}} 와 같이 순서 상관없이 표현 가능합니다.
문제 풀이
위에서 주어진 (2, 1, 3, 4) 튜플을 보면 2가 4번, 1이 3번, 3이 2번, 4가 1번 나온 것을 알 수 있습니다.
즉, 집합 기호를 통해 표현되는 숫자를 나온 횟수를 기준으로 정렬하면 튜플이 완성된다는 의미입니다.
import java.util.*;
import java.util.stream.Collectors;
class Solution {
// 문제에서는 int[]로 주어지는 데, list로 변경하였습니다!
public List<Integer> solution(String s) {
String[] nums = s.replace("{", "").replace("}", "").split(","); // 숫자만 추출하여 배열에 저장
Map<String, Integer> countNum = new HashMap<>(); // 문자 개수를 담을 map
// 숫자를 key, 나온 횟수를 value로 하여 추가
for (String num : nums) {
countNum.merge(num, 1, Integer::sum); // merge는 map 병합, Integer::sum은 숫자합 의미
}
// map sort by value
countNum = countNum.entrySet()
.stream()
.sorted((e1, e2) -> e2.getValue().compareTo(e1.getValue())) // value를 기준으로 정렬 (내림차순)
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new)); // 다시 map으로 구성
List<Integer> answer = new ArrayList<>();
countNum.forEach((key, value) -> answer.add(Integer.valueOf(key))); // list에 key를 순서대로 추가
return answer;
}
}
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers] 호텔 방 배정 (Java) (0) | 2022.04.22 |
---|---|
[Programmers] n진수 게임 (Java) (0) | 2021.06.26 |
[Programmers] 섬 연결하기 (Java) (0) | 2021.06.10 |
[Programmers] 파일명 정렬 (Java) (0) | 2021.05.05 |
[Programmers] 구명보트 (Java) (0) | 2021.05.01 |
블로그의 정보
개발하는 두부
뚜부니