Seren dev's blog
article thumbnail

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

 

프로그래머스

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

programmers.co.kr

풀이

튜플을 표현하는 모든 집합에 들어있는 각 숫자들의 개수를 세면 첫번째 예시의 경우 2는 4개, 1은 3개, 3은 2개, 4는 1개다. 즉, 개수가 많은 순대로 answer 배열에 저장하면 된다.

문자열 s에 저장되어있는 각 집합을 구한 후, 각 집합에 있는 숫자들을 구해서 숫자와 숫자가 등장한 횟수Map에 저장한다.

 

문자열 s는 "{{2},{2,1},{2,1,3},{2,1,3,4}}" 와 같은 형식으로 저장되어 있으므로 s의 맨 앞글자와 뒷글자를 제거하고, 각 집합이 끝나는 부분은 "}"이므로 split() 메서드를 사용해 문자열 s을 "}"를 기준으로 잘라 String 배열 tuples에 저장한다.

그러면 tuples에는 다음과 같이 저장된다.

{2
,{2,1
,{2,1,3
,{2,1,3,4

숫자 앞에 있는 '{', ','는 필요 없으므로 맨 앞에 이 두 문자도 삭제한다.

그 다음 split() 메서드를 사용해 각 문자열을 ","를 기준으로 잘라 String 배열 words에 저장한다.

최종적으로 words에는 다음과 같이 저장된다.

"2"
"2", "1"
"2", "1", "3"
"2", "1", "3", "4"

이제 words에 저장된 문자열을 사용해 map(숫자(String), 숫자가 등장한 횟수)를 저장한다.

 

로직

1. 문자열 s의 맨 앞글자와 뒷글자를 삭제한다.

2. 숫자(String)와 숫자가 등장한 횟수를 저장하기 위해 HashMap<String, Integer> map을 선언한다.

3. split() 메서드를 사용해 "}"를 기준으로 문자열 s을 잘라 String 배열 tuples에 저장한다.

4. tuples에 저장된 각 문자열 tuple에 대해

  • 맨 앞에 '{', ',' 두 문자가 있을 경우 삭제한다.
  • ","를 기준으로 문자열을 잘라 String 배열 words에 저장한다.
  • words에 저장된 각 문자열을 사용하여 map에 저장한다.

5. answermap의 크기만큼 크기를 할당한다.

6. map을 통해 answer에 값을 저장한다.

 

코드

import java.util.*;

class Solution {
    public int[] solution(String s) {
        s = s.substring(0, s.length() - 1);
        s = s.substring(1);
        
        HashMap<String, Integer> map = new HashMap<>();
        
        String[] tuples = s.split("}");
        for (String tuple : tuples) {
            if (tuple.charAt(0) == ',')
                tuple = tuple.substring(1);
            if (tuple.charAt(0) == '{')
                tuple = tuple.substring(1);
            
            String[] words = tuple.split(",");
            
            for (String word : words) {
                map.put(word, map.getOrDefault(word, 0)+1);
            }
        }
        
        int[] answer = new int[map.size()];
        for (String word : map.keySet()) {
            int value = map.get(word);
            answer[map.size() - value] = Integer.parseInt(word);
        }
        
        return answer;
    }
}

 

수정한 코드

"{", "}"을 따로 삭제할 필요 없이 repleaceAll() 메서드를 사용해 "{" ,"}"를 삭제하고, 이후 문자열을 ","를 기준으로 잘라 String 배열 words에 저장한다.

import java.util.*;

class Solution {
    public int[] solution(String s) {
        HashMap<String, Integer> map = new HashMap<>();
        
        s = s.replaceAll("[{|}]", "");
        String[] words = s.split(",");
        for (String word : words) {
            map.put(word, map.getOrDefault(word, 0)+1);
        }
        
        int[] answer = new int[map.size()];
        for (String word : map.keySet()) {
            int value = map.get(word);
            answer[map.size() - value] = Integer.parseInt(word);
        }
        
        return answer;
    }
}

 

1번째 풀이
2번째 풀이

 

Reference

 

 

728x90
profile

Seren dev's blog

@Seren dev

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!