반응형
프로그래머스 programmers Level1 숫자 짝꿍 - java 자바
[문제]
https://school.programmers.co.kr/learn/courses/30/lessons/131128
[풀이]
제한 사항을 보면 다음과 같다.
- 3 ≤ X , Y 의 길이(자릿수) ≤ 3,000,000입니다.
- X , Y 는 0으로 시작하지 않습니다.
- X , Y 의 짝꿍은 상당히 큰 정수일 수 있으므로, 문자열로 반환합니다.
for문을 사용해서 자릿수 전체를 확인할 필요가 있어보이는데, X , Y 의 길이가 최대 3,000,000 이므로 자칫 시간제한에 걸릴 위험이 커 보인다. 따라서 이 전에 풀었던 문제(완주하지 못한 선수)에서 사용했던 Map 의 getOrDefault() 메소드가 떠올랐고 그것을 사용하면 해볼만 하다고 생각했다.
- X 와 Y 의 각각 자리수를 담을 HashMap을 선언한다.
→ xMap, yMap - 문자열 X 의 자리수를 확인한다
2.1. 문자열 X 를 자리수로 잘라 배열에 담는다
2.2. key = 자리수, value = getOrDefault(key, 0) + 1
⇒ 중복되는 key가 있을 수 있으므로 getOrDefault(key, 0) + 1 로 value 설정 - 문자열 Y 의 자리수를 확인한다.
3.1. 문자열 Y 를 자리수로 잘라 배열에 담는다.
3.2. key = 자리수, value = getOrDefault(key, 0) +1
⇒ 중복되는 key가 있을 수 있으므로 getOrDefault(key, 0) + 1 로 value 설정 - xMap 과 yMap을 확인하여 공통된 숫자를 얻어 리스트에 담아준다.
- 내림차순 정렬하여 가장 큰 정수로 결과를 반환한다.
5.1. 리스트가 공백이면 공통된 숫자가 없으므로 -1 을 문자열로 리턴한다.
5.2. 리스트에 0만 존재하면 0 을 문자열로 리턴한다.
5.3. 이외의 경우 가장 큰 정수를 문자열로 리턴한다.
[java 코드]
import java.util.*;
import java.util.stream.*;
private final static String BLANK = "";
/**
* 숫자 짝꿍
* @param X
* @param Y
* @return X,Y 중 공통으로 나타나는 정수를 이용하여 가장 큰 정수, 공통수가 없으면 -1
*/
public String solution(String X, String Y) {
String answer = "";
Map<String, Integer> xMap = new HashMap<>();
Map<String, Integer> yMap = new HashMap<>();
// X 정수
String[] splitX = X.split("");
for (String sx : splitX) {
xMap.put(sx, xMap.getOrDefault(sx, 0) + 1);
}
// Y 정수
String[] splitY = Y.split("");
for (String sy : splitY) {
yMap.put(sy, yMap.getOrDefault(sy, 0) + 1);
}
List<String> result = new ArrayList<>();
for (String xKey : xMap.keySet()) {
// y 에 x 숫자가 존재하지 않는 경우
if (!yMap.containsKey(xKey)) {
continue;
}
// y 에 x 숫자가 존재하는 경우, 둘 다 있는 수만큼 넣어야 하므로 value 값이 작은 것으로 들어감
int min = Math.min(xMap.get(xKey), yMap.get(xKey));
for (int i = 0; i < min; i++) {
result.add(xKey);
}
}
// 내림차순 정렬하여 String 으로 변환
answer = result.stream().sorted(Collections.reverseOrder()).collect(Collectors.joining());
if (BLANK.equals(answer)) {
answer = "-1";
} else if (BLANK.equals(answer.replaceAll("0",""))) {
// 0밖에 없는 경우
answer = "0";
}
return answer;
}
반응형