https://school.programmers.co.kr/learn/courses/30/lessons/64065
풀이
튜플을 표현하는 모든 집합에 들어있는 각 숫자들의 개수를 세면 첫번째 예시의 경우 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. answer에 map의 크기만큼 크기를 할당한다.
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;
}
}
Reference
'Algorithm 문제 풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv.1 : 숫자 문자열과 영단어 - 자바[Java] (0) | 2022.11.15 |
---|---|
[프로그래머스] Lv.2 : [1차] 뉴스 클러스터링 - 자바[Java] (0) | 2022.11.15 |
[프로그래머스] Lv.2 : 배달 (그래프 최단 경로 알고리즘) - 자바[Java] (0) | 2022.11.08 |
[프로그래머스] Lv.2 : 방문 길이 - 자바[Java] (0) | 2022.11.06 |
[프로그래머스] Lv.2 : 점프와 순간이동 - 자바[Java] (0) | 2022.11.03 |