개발하는 두부

[Programmers] 튜플 (Java)

by 뚜부니

https://school.programmers.co.kr/learn/courses/30/lessons/64065

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 요약

원소의 개수가 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;
    }
}

블로그의 정보

개발하는 두부

뚜부니

활동하기