문제풀이/프로그래머스
[JAVA , Lv.2] 튜플
PhoB
2023. 2. 13. 17:12
[문제]
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
오늘 문제는 좀 길어서 링크로 대체 하겠습니다!
[내 풀이]
import java.util.*;
class Solution {
public int[] solution(String s) {
StringBuilder sb = new StringBuilder(s);
//1. 특수문자 제거
s = s.replaceAll("[^ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9]"," ");//특수문자를 공백으로 치환
//2. 공백 을 기준으로 split
StringTokenizer st = new StringTokenizer(s," ",false);
//3. HashMap에 삽입
Map<String,Integer> hm = new HashMap<>();
while(st.hasMoreTokens()){
String key = st.nextToken();
if(hm.containsKey(key)) hm.put(key,hm.get(key)+1); //키가 이미 존재하면 값+1
else hm.put(key,1); //존재하지 않는 키라면 새로 삽입
}
int[] answer = new int[hm.size()];
int cnt = hm.size();
int idx =0;
//4. value값이 높은순서대로 key반환
for(int i=0; i<answer.length; i++){
for(String key : hm.keySet()){
int value = hm.get(key);
if(cnt == value){
cnt--;
answer[i] = Integer.parseInt(key);
break;
}
}
}
return answer;
}
}
[풀이 과정]
나의 경우에는 HashMap을 사용해서 풀었다.
튜플이라는 것이 같은 원소의 조합이라도 순서가 다르면 서로다른 튜플이기 때문에 처음에 무작정 값을 집어넣고 그대로 출력하는 코드를 작성하니 실패하였다.
그래서 문제를 가만히 들여다보면서 규칙을 찾아보니 문자열 s를 보면 각 집합에서 가장 자주나오는 원소순으로 튜플이 만들어졌다.
예시1번을 보자 [2,1,3,4]를 표현하는 문자열 s는 {{2},{2,1},{2,1,3},{2,1,3,4}}이다. 각각의 집합에서 요소별 등장 횟수를 세어보면
요소 | 횟수 |
1 | 3 |
2 | 4 |
3 | 2 |
4 | 1 |
이렇게 나타낼 수 있다. 이 표에서 등장 횟수가 많은 순서대로 요소를 나열하면 [2,1,3,4] 가 된다.
또한 등장횟수의 최댓값 또한 문자열 s에 존재하는 숫자 종류의 갯수이므로(ex. 1 2 3 4) HashMap의 크기가 곧 튜플의 크기가 될것이라고 생각하였다.
이 과정을 그대로 구현해준다면 위의 풀이 코드가 된다.