[코딩테스트] 프로그래머스 64065, 튜플
2022. 7. 15. 14:25ㆍCodingTest
문제
https://school.programmers.co.kr/learn/courses/30/lessons/64065
문제접근
- 부분집합에서 나온 숫자들을 카운팅한 다음에 내림차순으로 정렬합니다.
- 예를 들어 "{{2},{2,1},{2,1,3},{2,1,3,4}}" 문자열을 입력받으면 부분집합에 나온 숫자들을 카운팅하여 해시맵에 넣은 결과는 다음과 같습니다.
map = {
1 : 3,
2 : 4,
3 : 2,
4 : 1
}
- 해시맵에서 key : 부분집합에 나온 숫자, value : 해당 숫자가 나온 횟수를 의미합니다.
- 결과는 value가 높은 key순으로 2->1->3->4 임을 알 수 있습니다.
구현
import org.junit.Assert;
import org.junit.jupiter.api.Test;
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int[] solution(String s) {
int[] answer = {};
int len = s.length();
String sub = s.substring(1, len-1);
Map<Integer, Integer> counter = new HashMap<>();
String num = "";
for(int i = 0; i < sub.length(); i++){
if(Character.isDigit(sub.charAt(i))){
num += sub.charAt(i);
}else if((sub.charAt(i) == ',' || sub.charAt(i) == '}') && !num.equals("")){
int target = Integer.parseInt(num);
int cnt = counter.getOrDefault(target, 1);
counter.put(target, cnt+1);
num = "";
}
}
answer = new int[counter.size()];
// 부분집합에서 가장 빈번히 나온 숫자의 내림차순 탐색하여 저장
int i = 0;
while(counter.size() != 0){
int max_key = 0;
int max = 0;
// 가장 큰 value를 가진 key를 탐색합니다.
for(Integer key : counter.keySet()){
if(counter.get(key) > max){
max = counter.get(key);
max_key = key;
}
}
answer[i++] = max_key;
counter.remove(max_key);
}
return answer;
}
@Test
void test1(){
String s = "{{2},{2,1},{2,1,3},{2,1,3,4}}";
int[] answer = new Solution().solution(s);
Assert.assertArrayEquals(new int[]{2, 1, 3, 4}, answer);
}
@Test
void test2(){
String s = "{{20,111},{111}}";
int[] answer = new Solution().solution(s);
Assert.assertArrayEquals(new int[]{111, 20}, answer);
}
}
'CodingTest' 카테고리의 다른 글
[코딩테스트] 프로그래머스 42842, 카펫 (0) | 2022.07.17 |
---|---|
[코딩테스트] 프로그래머스 12949, 행렬의 곱셈 (0) | 2022.07.17 |
[코딩테스트] 프로그래머스 42839, 소수 찾기 (1) | 2022.07.15 |
[코딩테스트] 프로그래머스 12951, JadenCase 문자열 만들기 (0) | 2022.07.10 |
[코딩테스트] 프로그래머스 42890, 후보키 (0) | 2022.07.08 |