728x90
코드 힌트
- 문제 설명
- 주어진 두 문자열 X와 Y에서 공통으로 포함된 숫자들로 만들 수 있는 가장 큰 숫자를 구하는 문제입니다.
- 자릿수 배열 생성
- 각 문자열에서 숫자의 빈도를 저장할 배열을 생성합니다.
- int[] x = new int[10]; : X 문자열에 대해 0부터 9까지 각 숫자의 빈도를 저장하는 배열입니다.
- 빈도 계산
- X와 Y 문자열의 각 자릿수를 배열에 저장합니다.
- X 문자열의 경우: for (int i = 0; i < X.length(); i++) { x[X.charAt(i) - '0']++; }
- Y 문자열의 경우: for (int i = 0; i < Y.length(); i++) { y[Y.charAt(i) - '0']++; }
- 최댓값 문자열 생성
- 9부터 0까지 배열을 돌면서 공통으로 존재하는 숫자를 문자열로 저장합니다.
- 숫자가 큰 순서대로 비교하여 문자열에 저장하면 최댓값을 만들 수 있습니다.
- StringBuilder 사용
- 문자열을 효율적으로 저장하기 위해 StringBuilder를 사용합니다.
- StringBuilder는 String과 달리 새로운 값을 추가할 때마다 새로운 메모리를 할당하지 않습니다.
- 최종 반환
- StringBuilder에 저장된 결과를 문자열로 변환하여 반환합니다.
- sb.toString() 메소드를 사용합니다.
- 추가 연습
- 이 문제는 HashMap을 사용하여 풀 수도 있으므로, 연습이 필요하신 분들은 HashMap을 사용한 방법으로도 풀어보시기 바랍니다.
- HashMap으로 푸는 방법도 정답에 같이 적어놓겠습니다.
정답은 더보기 클릭
더보기
class Solution {
public String solution(String X, String Y) {
// 결과를 저장할 StringBuilder
StringBuilder sb = new StringBuilder();
// 각 숫자의 빈도를 저장할 배열
int[] x = new int[10];
int[] y = new int[10];
// X 문자열에서 각 숫자의 빈도를 세어 x 배열에 저장
for (int i = 0; i < X.length(); i++) {
x[X.charAt(i) - '0']++;
}
// Y 문자열에서 각 숫자의 빈도를 세어 y 배열에 저장
for (int i = 0; i < Y.length(); i++) {
y[Y.charAt(i) - '0']++;
}
// 9부터 0까지 숫자를 비교하여 공통으로 존재하는 숫자를 StringBuilder에 추가
for (int i = 9; i >= 0; i--) {
int count = Math.min(x[i], y[i]);
for (int j = 0; j < count; j++) {
sb.append(i);
}
}
// 공통 숫자가 없다면 -1 반환
if (sb.length() == 0) {
return "-1";
}
// 결과가 0으로만 이루어져 있다면 0 반환
else if (sb.charAt(0) == '0') {
return "0";
}
// 결과 문자열 반환
return sb.toString();
}
}
HashMap으로 풀기
import java.util.*;
class Solution {
public String solution(String X, String Y) {
// 결과를 저장할 StringBuilder
StringBuilder sb = new StringBuilder();
// 각 문자열의 문자 빈도를 저장할 HashMap
HashMap<Character, Integer> mapX = new HashMap<>();
HashMap<Character, Integer> mapY = new HashMap<>();
// X 문자열에서 각 문자의 빈도를 계산하여 mapX에 저장
for (int i = 0; i < X.length(); i++) {
mapX.merge(X.charAt(i), 1, Integer::sum);
}
// Y 문자열에서 각 문자의 빈도를 계산하여 mapY에 저장
for (int i = 0; i < Y.length(); i++) {
mapY.merge(Y.charAt(i), 1, Integer::sum);
}
// mapX의 keySet을 리스트로 변환하여 key를 정렬 (내림차순)
List<Character> keySet = new ArrayList<>(mapX.keySet());
keySet.sort((o1, o2) -> o2 - o1);
// 정렬된 key를 이용해 결과 문자열을 생성
for (char key : keySet) {
// 각 key의 빈도를 비교하여 공통으로 존재하는 숫자만큼 sb에 추가
int count = Math.min(mapX.get(key), mapY.getOrDefault(key, 0));
for (int i = 0; i < count; i++) {
sb.append(key);
}
}
// 결과 문자열이 비어있는 경우 "-1" 반환
if (sb.length() == 0) {
return "-1";
}
// 결과 문자열이 "0"으로만 이루어져 있는 경우 "0" 반환
if (sb.charAt(0) == '0') {
return "0";
}
// 결과 문자열 반환
return sb.toString();
}
}
728x90
'프로그래머스(Java) > Level 1' 카테고리의 다른 글
[프로그래머스] 평균 구하기 (0) | 2024.08.01 |
---|---|
[프로그래머스] 서울에서 김서방 찾기 (0) | 2024.08.01 |
[프로그래머스] 대충 만든 자판 (0) | 2024.07.28 |
[프로그래머스] 제일 작은 수 제거하기 (0) | 2024.07.24 |
[프로그래머스] 나머지가 1이 되는 수 찾기 (0) | 2024.07.24 |