[Java] 숫자 짝꿍 - Lv1 프로그래머스코딩테스트/프로그래머스2023. 3. 25. 06:46
Table of Contents
728x90
728x90
https://school.programmers.co.kr/learn/courses/30/lessons/131128
풀이
첫 풀이
class Solution {
public String solution(String X, String Y) {
String answer = "";
int[] x = new int[10];
int[] y = new int[10];
for(int i=0; i<X.length(); i++) {
x[X.charAt(i) - '0']++;
}
for(int i=0; i<Y.length(); i++) {
y[Y.charAt(i) - '0']++;
}
for(int i=9; i>=0; i--) {
if(x[i] > 0 && y[i] > 0) {
int min = Math.min(x[i], y[i]);
if(min > 1) {
for(int j=0; j<min; j++) {
answer += i;
}
}
else answer += i;
}
}
if(answer == "") return "-1";
if(answer.charAt(0) == '0') return "0";
return answer;
}
}
자리수가 최대 3,000,000인 String 문자열이 주어졌지만 우선 풀어봤다.
결과는 아래처럼 5가지 경우의 수에서 시간이 초과되었다.
String문자열이 길어질 때 계속해서 String 객체를 생성해서 값을 입력시켜주기 때문에 그런 것 같았다.
바꾼 코드
class Solution {
public String solution(String X, String Y) {
StringBuilder answer = new StringBuilder();
int[] x = new int[10];
int[] y = new int[10];
for(int i=0; i<X.length(); i++) {
x[X.charAt(i) - '0']++;
}
for(int i=0; i<Y.length(); i++) {
y[Y.charAt(i) - '0']++;
}
for(int i=9; i>=0; i--) {
for(int j=0; j<Math.min(x[i], y[i]); j++) {
answer.append(i);
}
}
if(answer.length() == 0) return "-1";
if(answer.charAt(0) == '0') return "0";
return answer.toString();
}
}
String을 StringBuilder이나 StringBuffer로 바꿔서 풀어주면 될 것 같았고 나는 Builder을 사용했다.
또한 아래의 경우에서 쓸데없는 조건문과 조건문, 그리고 반복문이 진행되고 있었기 때문에 코드를 간결하게 해 성능을 향상시켜 주었다.
for(int i=9; i>=0; i--) {
if(x[i] > 0 && y[i] > 0) {
int min = Math.min(x[i], y[i]);
if(min > 1) {
for(int j=0; j<min; j++) {
answer += i;
}
}
else answer += i;
}
}
아래처럼, 어짜피 배열에 기본으로 0이 채워져 있기 때문에, 양쪽 모두 숫자가 들어가 있지 않을 경우 해당 숫자에서는 반복이 진행되지 않을 것이다.
for(int i=9; i>=0; i--) {
for(int j=0; j<Math.min(x[i], y[i]); j++) {
answer.append(i);
}
}
728x90
300x250
@mag1c :: 꾸준히 재밌게
2023.04 ~ 백엔드 개발자의 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!