프로그래머스 lv.1 - 131128 숫자 짝꿍 문제 풀이
문제 설명
두 정수 X, Y의 임의의 자리에서 공통으로 나타나는 정수 k(0 ≤ k ≤ 9)들을 이용하여 만들 수 있는 가장 큰 정수를 두 수의 짝꿍이라 합니다(단, 공통으로 나타나는 정수 중 서로 짝지을 수 있는 숫자만 사용합니다). X, Y의 짝꿍이 존재하지 않으면, 짝꿍은 -1입니다. X, Y의 짝꿍이 0으로만 구성되어 있다면, 짝꿍은 0입니다.
예를 들어, X = 3403이고 Y = 13203이라면, X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 3, 0, 3으로 만들 수 있는 가장 큰 정수인 330입니다. 다른 예시로 X = 5525이고 Y = 1255이면 X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 2, 5, 5로 만들 수 있는 가장 큰 정수인 552입니다(X에는 5가 3개, Y에는 5가 2개 나타나므로 남는 5 한 개는 짝 지을 수 없습니다.)
두 정수 X, Y가 주어졌을 때, X, Y의 짝꿍을 return하는 solution 함수를 완성해주세요.
문제의 자세한 내용은 해당 링크를 통해 확인 : 문제 링크
풀이 코드
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
class Solution {
public String solution(String X, String Y) {
Map<Character, Integer> xMap = new HashMap<>();
Map<Character, Integer> yMap = new HashMap<>();
for(char c : X.toCharArray()) {
Character key = Character.valueOf(c);
if(xMap.containsKey(key)) {
xMap.replace(key, xMap.get(key) + 1);
} else {
xMap.put(key, 1);
}
}
for(char c : Y.toCharArray()) {
Character key = Character.valueOf(c);
if(yMap.containsKey(key)) {
yMap.replace(key, yMap.get(key) + 1);
} else {
yMap.put(key, 1);
}
}
StringBuffer answer = new StringBuffer();
List<Character> keyList = new ArrayList<>(xMap.keySet());
keyList.sort((k1, k2) -> k2.compareTo(k1));
for(Character k : keyList) {
if(yMap.containsKey(k)) {
int count = 0;
if(xMap.get(k) >= yMap.get(k)) {
count = yMap.get(k);
} else {
count = xMap.get(k);
}
for(int i = 0; i < count; i++) {
answer.append(k);
}
}
}
if(answer.length() == 0) {
return "-1";
} else {
return answer.toString().replaceAll("0", "").length() == 0 ? "0" : answer.toString();
}
}
}
문제 해결 전략
이라 쓰고 문제를 보고서 어떻게 풀면 될까?에 대한 생각을 정리한 항목
정말 간단하게 푼다면.. 2중 for문을 사용하여 입력받은 문자열 X와 Y를 단어 1개씩 비교하는 방법으로, Y의 단어가 X에 존재 한다면 기록한 후 큰 숫자부터 나열하는 방법으로 구현이 가능하기는 하지만 시간 복잡도를 고려한다면 좋은 방법은 아니며, 해당 문제에서도 테스트 11 ~ 15 과정에서 이를 확인하도록 되어있다.
그래서 X와 Y에 나오는 단어를 Key, 횟수를 Value로 두어 Map으로 저장한 후 Y의 Map의 Key를 기반으로 X의 Map을 조회하며 횟수를 비교하여 기록하여 반환, 이 때 Y Map의 Key를 내림차순 정렬을 한 후 사용하기 때문에 그대로 기록해도 가장 큰 수가 된다.
만약 기록한 문자열의 길이가 0이라면 중복되는 단어가 없다는 의미이므로 '-1'을 반환
기록한 문자열에서 '0'을 전부 공백으로 치환 후 길이가 0이라면 중복되는 단어가 '0'만 존재한다는 의미이므로 '0'을 반환
다른 모든 경우에는 기록된 문자열을 그대로 반환하여 해결
아마 더 좋은 방법이 있지 않을까 싶은데.. 떠오르지 않아서 다음에 다시 한번 생각해 보면 좋을 것 같다.
추가로.. 해당 문제가 왜 Lv.1인지 잘 이해가 안된다..
최소 Lv.2로 책정이 되어야 하는게 아닐까 싶은데..?
2022.11.04 - [Develop/Algorithm] - 프로그래머스 lv.2 - 12939 최댓값과 최솟값
프로그래머스 lv.2 - 12939 최댓값과 최솟값
프로그래머스 lv.2 - 12939 최댓값과 최솟값 문제 풀이 문제 설명 문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 최소값과 최대값을 찾아 이를 "(최소값) (최대
injae-dev.tistory.com
이 최댓값과 최솟값 문제가 Lv.1 문제가 되어야 할 것 같고 말이죠..? 의문의문
코드를 업로드해 둔 깃 허브
'Develop > Algorithm' 카테고리의 다른 글
우테코 온보딩 - Problem 1 (0) | 2022.11.09 |
---|---|
프로그래머스 lv.2 - 12939 최댓값과 최솟값 (0) | 2022.11.04 |
프로그래머스 lv.2 - 92335 k진수에서 소수 개수 구하기 (0) | 2022.11.03 |
프로그래머스 Lv.1 - 118666 성격 유형 검사하기 (0) | 2022.10.24 |
프로그래머스 Lv.1 - 12954 x만큼 간격이 있는 n개의 숫자 (0) | 2022.10.23 |