문제 주소
https://school.programmers.co.kr/learn/courses/30/lessons/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 함수를 완성해주세요.
제한사항
- 3 ≤ X, Y의 길이(자릿수) ≤ 3,000,000입니다.
- X, Y는 0으로 시작하지 않습니다.
- X, Y의 짝꿍은 상당히 큰 정수일 수 있으므로, 문자열로 반환합니다.
입출력 예
X Y result
"100" | "2345" | "-1" |
"100" | "203045" | "0" |
"100" | "123450" | "10" |
"12321" | "42531" | "321" |
"5525" | "1255" | "552" |
입출력 예 설명
입출력 예 #1
- X, Y의 짝꿍은 존재하지 않습니다. 따라서 "-1"을 return합니다.
입출력 예 #2
- X, Y의 공통된 숫자는 0으로만 구성되어 있기 때문에, 두 수의 짝꿍은 정수 0입니다. 따라서 "0"을 return합니다.
입출력 예 #3
- X, Y의 짝꿍은 10이므로, "10"을 return합니다.
입출력 예 #4
- X, Y의 짝꿍은 321입니다. 따라서 "321"을 return합니다.
입출력 예 #5
- 지문에 설명된 예시와 같습니다.
풀이과정
⭐sort ArrayList
Collections.sort(list);
ArrayList를 오름차순으로 정렬합니다.
Collections.sort(list, Collections.reverseOrder());
Collections.sort()의 2번째 파라미터로
내림차순 정렬을 나타내는 Comparator를 전달해서,
ArrayList를 내림차순으로 정렬하였습니다.
Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
String.CASE_INSENSITIVE_ORDER 를 전달하면, 대소문자 구분없이 오름차순으로 정렬됩니다.
여기서 'a'와 'A'는 같은 순위로 취급되므로, 원래의 순서를 유지합니다.
Collections.sort(list, Collections.reverseOrder(String.CASE_INSENSITIVE_ORDER));
대소문자 구분없이, 내림차순으로 정렬합니다.
import java.util.ArrayList;
import java.util.Collections;
class Solution {
public String solution(String X, String Y) {
String answer = "";
ArrayList<String> common = new ArrayList<String>();
for(int i = 0; i<X.length(); i++){
String target = "" + X.charAt(i);
if(Y.contains(target)){
Y.replaceFirst(target,"");
common.add(target);
}
}
Collections.sort(common,Collections.reverseOrder());
for(int i = 0; i<common.size(); i++){
answer += common.get(i);
}
return answer;
}
}
테스트 1
입력값 〉 "100", "2345"
기댓값 〉 "-1"
실행 결과 〉 실행한 결괏값 ""이 기댓값 "-1"과 다릅니다.
테스트 2
입력값 〉 "100", "203045"
기댓값 〉 "0"
실행 결과 〉 실행한 결괏값 "00"이 기댓값 "0"과 다릅니다.
테스트 3
입력값 〉 "100", "123450"
기댓값 〉 "10"
실행 결과 〉 실행한 결괏값 "100"이 기댓값 "10"과 다릅니다.
테스트 4
입력값 〉 "12321", "42531"
기댓값 〉 "321"
실행 결과 〉 실행한 결괏값 "32211"이 기댓값 "321"과 다릅니다.
테스트 5
입력값 〉 "5525", "1255"
기댓값 〉 "552"
실행 결과 〉 실행한 결괏값 "5552"이 기댓값 "552"과 다릅니다.
아 일단 -1이랑 0인 케이스 분류해봄
import java.util.ArrayList;
import java.util.Collections;
class Solution {
public String solution(String X, String Y) {
String answer = "";
ArrayList<String> common = new ArrayList<String>();
for(int i = 0; i<X.length(); i++){
String target = "" + X.charAt(i);
if(Y.contains(target)){
Y.replaceFirst(target,"");
common.add(target);
}
}
Collections.sort(common,Collections.reverseOrder());
if(common.size()==0){
return "-1";
}else if(common.get(0).equals("0")){
return "0";
}
for(int i = 0; i<common.size(); i++){
answer += common.get(i);
}
return answer;
}
}
테스트 1
입력값 〉 "100", "2345"
기댓값 〉 "-1"
실행 결과 〉 테스트를 통과하였습니다.
테스트 2
입력값 〉 "100", "203045"
기댓값 〉 "0"
실행 결과 〉 테스트를 통과하였습니다.
테스트 3
입력값 〉 "100", "123450"
기댓값 〉 "10"
실행 결과 〉 실행한 결괏값 "100"이 기댓값 "10"과 다릅니다.
테스트 4
입력값 〉 "12321", "42531"
기댓값 〉 "321"
실행 결과 〉 실행한 결괏값 "32211"이 기댓값 "321"과 다릅니다.
테스트 5
입력값 〉 "5525", "1255"
기댓값 〉 "552"
실행 결과 〉 실행한 결괏값 "5552"이 기댓값 "552"과 다릅니다.
아니 또 실수함
⚠️replace하고 String에 안 넣어주시면 안됩니다
Y.replaceFirst(target,"");
→
Y = Y.replaceFirst(target,"");
제발.’…
고쳐봄
import java.util.ArrayList;
import java.util.Collections;
class Solution {
public String solution(String X, String Y) {
String answer = "";
ArrayList<String> common = new ArrayList<String>();
for(int i = 0; i<X.length(); i++){
String target = "" + X.charAt(i);
if(Y.contains(target)){
Y = Y.replaceFirst(target,"");
common.add(target);
}
}
Collections.sort(common,Collections.reverseOrder());
if(common.size()==0){
return "-1";
}else if(common.get(0).equals("0")){
return "0";
}
for(int i = 0; i<common.size(); i++){
answer += common.get(i);
}
return answer;
}
}
테스트 1 〉 통과 (8.26ms, 70.5MB)
테스트 2 〉 | 통과 (6.76ms, 77.1MB) |
테스트 3 〉 | 통과 (6.42ms, 76.6MB) |
테스트 4 〉 | 통과 (6.48ms, 75.6MB) |
테스트 5 〉 | 통과 (6.91ms, 66.6MB) |
테스트 6 〉 | 통과 (22.86ms, 93.4MB) |
테스트 7 〉 | 통과 (13.32ms, 79.6MB) |
테스트 8 〉 | 통과 (18.47ms, 83.3MB) |
테스트 9 〉 | 통과 (13.01ms, 75MB) |
테스트 10 〉 | 통과 (19.34ms, 78MB) |
테스트 11 〉 | 실패 (시간 초과) |
테스트 12 〉 | 실패 (시간 초과) |
테스트 13 〉 | 실패 (시간 초과) |
테스트 14 〉 | 실패 (시간 초과) |
테스트 15 〉 | 실패 (시간 초과) |
테스트 16 〉 | 통과 (5.89ms, 77.7MB) |
테스트 17 〉 | 통과 (6.96ms, 78.3MB) |
테스트 18 〉 | 통과 (7.61ms, 75.7MB) |
테스트 19 〉 | 통과 (6.91ms, 74.6MB) |
ㅎㅎ 시간초과뜸 이걸 어떻게 해결하지
일단 common String에 넣었다가 char array로 바꿔서 정렬하는게 낫겠음
⭐java String to charArray
String s = "GeeksForGeeks";
char[] gfg = s.toCharArray();
⭐java arrays.sort()
Arrays.sort(arr);
import java.util.Arrays;
class Solution {
public String solution(String X, String Y) {
String answer = "";
String common = "";
for(int i = 0; i<X.length(); i++){
String target = "" + X.charAt(i);
if(Y.contains(target)){
Y = Y.replaceFirst(target,"");
common+=target;
}
}
if(common.length()==0){
return "-1";
}
char [] commonArr = common.toCharArray();
Arrays.sort(commonArr);
if(common.charAt(commonArr.length-1)=='0'){
return "0";
}
for(int i = commonArr.length-1; i>=0; i--){
answer += commonArr[i];
}
return answer;
}
}
테스트 1
입력값 〉 "100", "2345"
기댓값 〉 "-1"
실행 결과 〉 테스트를 통과하였습니다.
테스트 2
입력값 〉 "100", "203045"
기댓값 〉 "0"
실행 결과 〉 테스트를 통과하였습니다.
테스트 3
입력값 〉 "100", "123450"
기댓값 〉 "10"
실행 결과 〉 실행한 결괏값 "0"이 기댓값 "10"과 다릅니다.
테스트 4
입력값 〉 "12321", "42531"
기댓값 〉 "321"
실행 결과 〉 테스트를 통과하였습니다.
테스트 5
입력값 〉 "5525", "1255"
기댓값 〉 "552"
실행 결과 〉 테스트를 통과하였습니다.
지금보니까 sort는 commonArr로 하고 common에서 맨 뒤에 char이 0인지 읽고있음 sort도 안 되어있는데 ㅋㅋ
import java.util.Arrays;
class Solution {
public String solution(String X, String Y) {
String answer = "";
String common = "";
for(int i = 0; i<X.length(); i++){
String target = "" + X.charAt(i);
if(Y.contains(target)){
Y = Y.replaceFirst(target,"");
common+=target;
}
}
if(common.length()==0){
return "-1";
}
char [] commonArr = common.toCharArray();
Arrays.sort(commonArr);
if(commonArr[commonArr.length-1]=='0'){
return "0";
}
for(int i = commonArr.length-1; i>=0; i--){
answer += commonArr[i];
}
return answer;
}
}
테스트 1 〉 통과 (17.97ms, 71.5MB)
테스트 2 〉 통과 (13.61ms, 83.5MB)
테스트 3 〉 통과 (29.86ms, 80.3MB)
테스트 4 〉 통과 (19.04ms, 69.6MB)
테스트 5 〉 통과 (20.74ms, 87.7MB)
테스트 6 〉 통과 (27.32ms, 78.3MB)
테스트 7 〉 통과 (23.62ms, 74.8MB)
테스트 8 〉 통과 (31.05ms, 87.2MB)
테스트 9 〉 통과 (25.50ms, 79MB)
테스트 10 〉 통과 (32.29ms, 78.9MB)
테스트 11 〉 실패 (시간 초과)
테스트 12 〉 실패 (시간 초과)
테스트 13 〉 실패 (시간 초과)
테스트 14 〉 실패 (시간 초과)
테스트 15 〉 실패 (시간 초과)
테스트 16 〉 통과 (8.56ms, 80MB)
테스트 17 〉 통과 (7.16ms, 74.2MB)
테스트 18 〉 통과 (5.68ms, 75.2MB)
테스트 19 〉 통과 (12.07ms, 83.6MB)
ㅎㅎ 여전히 이러네 처음부터 String 말고 char Array로 한번 바꿔봄
import java.util.Arrays;
class Solution {
public String solution(String X, String Y) {
String answer = "";
String common = "";
char [] xArr = X.toCharArray();
for(int i = 0; i<xArr.length; i++){
String target = "" + xArr[i];
if(Y.contains(target)){
Y = Y.replaceFirst(target,"");
common+=target;
}
}
if(common.length()==0){
return "-1";
}
char [] commonArr = common.toCharArray();
Arrays.sort(commonArr);
if(commonArr[commonArr.length-1]=='0'){
return "0";
}
for(int i = commonArr.length-1; i>=0; i--){
answer += commonArr[i];
}
return answer;
}
}
테스트 1 〉 통과 (17.89ms, 88.7MB)
테스트 2 〉 통과 (18.42ms, 76.9MB)
테스트 3 〉 통과 (12.40ms, 80.6MB)
테스트 4 〉 통과 (17.64ms, 80.2MB)
테스트 5 〉 통과 (13.06ms, 76.5MB)
테스트 6 〉 통과 (21.42ms, 83MB)
테스트 7 〉 통과 (20.85ms, 77.8MB)
테스트 8 〉 통과 (27.49ms, 88.1MB)
테스트 9 〉 통과 (15.89ms, 81.5MB)
테스트 10 〉 통과 (35.92ms, 72.9MB)
테스트 11 〉 실패 (시간 초과)
테스트 12 〉 실패 (시간 초과)
테스트 13 〉 실패 (시간 초과)
테스트 14 〉 실패 (시간 초과)
테스트 15 〉 실패 (시간 초과)
테스트 16 〉 통과 (6.01ms, 85.3MB)
테스트 17 〉 통과 (7.22ms, 70.8MB)
테스트 18 〉 통과 (5.61ms, 78.7MB)
테스트 19 〉 통과 (6.23ms, 78.6MB)
replace말고 charArray를 써야할까봐 ㅎ
읽고나서 그냥 거기를 숫자 말고 이상한걸로 넣어두면 다시 비교하고 count할 일 없잖아
아 아니다 그냥 arrayList 써서 remove하는게 원소가 줄어가서 제일 빠르겠다
같은거 찾으면 break하고
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 3 out of bounds for length 3
at java.base/java.util.ArrayList.get(ArrayList.java:427)
-. i랑 j 또 헷갈려서 j 써야되는 데에 i써놓음 ㅎ
import java.util.Arrays;
import java.util.ArrayList;
class Solution {
public String solution(String X, String Y) {
String answer = "";
String common = "";
char [] xArr = X.toCharArray();
//char [] yArr = Y.toCharArray();
ArrayList<String> yArr = new ArrayList<String>();
for(int i = 0; i<Y.length(); i++){
yArr.add(""+Y.charAt(i));
}
for(int i = 0; i<xArr.length; i++){
for(int j = 0; j<yArr.size(); j++){
if(yArr.get(j).equals(""+xArr[i])){
yArr.remove(j);
common += xArr[i];
break;
}
}
}
if(common.length()==0){
return "-1";
}
char [] commonArr = common.toCharArray();
Arrays.sort(commonArr);
if(commonArr[commonArr.length-1]=='0'){
return "0";
}
for(int i = commonArr.length-1; i>=0; i--){
answer += commonArr[i];
}
return answer;
}
}
테스트 1 〉 통과 (18.30ms, 76MB)
테스트 2 〉 통과 (16.65ms, 82.2MB)
테스트 3 〉 통과 (22.26ms, 92.6MB)
테스트 4 〉 통과 (16.59ms, 75.9MB)
테스트 5 〉 통과 (16.18ms, 72.8MB)
테스트 6 〉 통과 (36.95ms, 73MB)
테스트 7 〉 통과 (42.94ms, 78.4MB)
테스트 8 〉 통과 (43.90ms, 72.1MB)
테스트 9 〉 통과 (25.49ms, 87.6MB)
테스트 10 〉 통과 (26.14ms, 73.4MB)
테스트 11 〉 실패 (시간 초과)
테스트 12 〉 실패 (시간 초과)
테스트 13 〉 실패 (시간 초과)
테스트 14 〉 실패 (시간 초과)
테스트 15 〉 실패 (시간 초과)
테스트 16 〉 통과 (14.84ms, 74.5MB)
테스트 17 〉 통과 (12.08ms, 73.5MB)
테스트 18 〉 통과 (6.96ms, 76.5MB)
테스트 19 〉 통과 (8.50ms, 77.8MB)
오 근데 아까보다 더 느려졌음
걍 char배열로 한번 해본다
import java.util.Arrays;
import java.util.ArrayList;
class Solution {
public String solution(String X, String Y) {
String answer = "";
String common = "";
char [] xArr = X.toCharArray();
char [] yArr = Y.toCharArray();
//ArrayList<String> yArr = new ArrayList<String>();
// for(int i = 0; i<Y.length(); i++){
// yArr.add(""+Y.charAt(i));
// }
for(int i = 0; i<xArr.length; i++){
for(int j = 0; j<yArr.length; j++){
if(yArr[j]==xArr[i]){
yArr[j]= '%';
common += xArr[i];
break;
}
}
}
if(common.length()==0){
return "-1";
}
char [] commonArr = common.toCharArray();
Arrays.sort(commonArr);
if(commonArr[commonArr.length-1]=='0'){
return "0";
}
for(int i = commonArr.length-1; i>=0; i--){
answer += commonArr[i];
}
return answer;
}
}
테스트 1 〉 통과 (9.48ms, 84.3MB)
테스트 2 〉 통과 (14.05ms, 82.1MB)
테스트 3 〉 통과 (12.99ms, 80.3MB)
테스트 4 〉 통과 (33.36ms, 68.6MB)
테스트 5 〉 통과 (16.26ms, 80.8MB)
테스트 6 〉 통과 (25.24ms, 81.4MB)
테스트 7 〉 통과 (16.32ms, 73.6MB)
테스트 8 〉 통과 (33.54ms, 65.7MB)
테스트 9 〉 통과 (18.26ms, 80.9MB)
테스트 10 〉 통과 (15.02ms, 87.7MB)
테스트 11 〉 실패 (시간 초과)
테스트 12 〉 실패 (시간 초과)
테스트 13 〉 실패 (시간 초과)
테스트 14 〉 실패 (시간 초과)
테스트 15 〉 실패 (시간 초과)
테스트 16 〉 통과 (13.77ms, 78.3MB)
테스트 17 〉 통과 (20.32ms, 79MB)
테스트 18 〉 통과 (0.02ms, 75.4MB)
테스트 19 〉 통과 (0.02ms, 73.2MB)
아까랑 걍 거의 비슷함
크기가 많아질때 어떻게 효과적으로 탐색하지
for문 두번 돌리면 안될거같음 이거
자료구조 공부하고 다시해본다
걍 String으로 한번 해봅니다
안됩니다
Map을 써야할 거 같습니다
- 배열 만들어서 푸는것도 좋은듯
아이디어가 떠오르면 이거저거 시도해보세요…
한 방식만 고집하지 말고
import java.util.HashMap; // import the HashMap class
HashMap<String, String> capitalCities = new HashMap<String, String>();
// Add keys and values (Country, City)
capitalCities.put("England", "London")
capitalCities.get("England");
capitalCities.remove("England");
capitalCities.clear();
hash_map.containsKey(20));
⭐HashMap이 Key를 포함하고 있는지 아는 법
hash_map.containsKey(20));
⭐**How to update a value, given a key in a hashmap?**
map.put(key, map.get(key) + 1);
how to remove entry from hashmap by Value?
There's a simple method, but it'll use iteration internally. (There's no way around that.)
map.values().remove(valueToRemove);
how to loop through hashmap
for (String key: map.keySet()) {
System.out.println("key : " + key);
System.out.println("value : " + map.get(key));
}
how to sort hashmap
Sorting a Hashmap according to values
// function to sort hashmap by values
public static HashMap<String, Integer> sortByValue(HashMap<String, Integer> hm)
{
// Create a list from elements of HashMap
List<Map.Entry<String, Integer> > list =
new LinkedList<Map.Entry<String, Integer> >(hm.entrySet());
// Sort the list
Collections.sort(list, new Comparator<Map.Entry<String, Integer> >() {
public int compare(Map.Entry<String, Integer> o1,
Map.Entry<String, Integer> o2)
{
return (o1.getValue()).compareTo(o2.getValue());
}
});
// put data from sorted list to hashmap
HashMap<String, Integer> temp = new LinkedHashMap<String, Integer>();
for (Map.Entry<String, Integer> aa : list) {
temp.put(aa.getKey(), aa.getValue());
}
return temp;
}
정렬 너무 일이 커지는데 어차피 숫자는 9부터밖에 없으니까
9부터 세어보자
Key existence check in HashMap
Foo value = map.get(key);
if (value != null) {
...
} else {
// Key might be present...
if (map.containsKey(key)) {
// Okay, there's a key but the value is null
} else {
// Definitely no such key
}
}
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
public String solution(String X, String Y) {
HashMap<String, String> couples = new HashMap<String, String>();
for(int i=0;i<X.length();i++){
couples.put((""+X.charAt(i)),"-1");
}
for(int i=0;i<Y.length();i++){
if(couples.containsKey((""+Y.charAt(i)))){
couples.put((""+Y.charAt(i)),(""+Y.charAt(i)));
}
}
couples.values().remove("-1");
if(couples.size()<0){
return "-1";
}
String answer = "";
for(int i = 9;i>=0;i--){
while(couples.containsKey(Integer.toString(i))){
answer += i;
couples.remove(Integer.toString(i));
}
}
if(answer.charAt(0)=='0'){
return "0";
}
return answer;
}
}
테스트 1
입력값 〉 "100", "2345"
기댓값 〉 "-1"
실행 결과 〉 실행한 결괏값 "1"이 기댓값 "-1"과 다릅니다.
테스트 2
입력값 〉 "100", "203045"
기댓값 〉 "0"
실행 결과 〉 테스트를 통과하였습니다.
테스트 3
입력값 〉 "100", "123450"
기댓값 〉 "10"
실행 결과 〉 테스트를 통과하였습니다.
테스트 4
입력값 〉 "12321", "42531"
기댓값 〉 "321"
실행 결과 〉 테스트를 통과하였습니다.
테스트 5
입력값 〉 "5525", "1255"
기댓값 〉 "552"
실행 결과 〉 실행한 결괏값 "52"이 기댓값 "552"과 다릅니다.
5의 경우에 중복되는 숫자가 안 꺼내지는 거 같음
Hashmap.get을 더 알아보자 put에 중복도 들어가는거 맞지?
Java: How to get set of keys having same value in hashmap
근데 굳이 저렇게 안 하고 couple이면 숫자를 올리면 되잖아
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
public String solution(String X, String Y) {
HashMap<String, String> couples = new HashMap<String, String>();
for(int i=0;i<X.length();i++){
couples.put((""+X.charAt(i)),"0");
}
for(int i=0;i<Y.length();i++){
if(couples.containsKey((""+Y.charAt(i)))){
couples.put((""+Y.charAt(i)),(couples.get(""+Y.charAt(i))++));
}
}
couples.values().remove("0");
if(couples.size()<0){
return "-1";
}
String answer = "";
for(int i = 9;i>=0;i--){
while(couples.containsKey(Integer.toString(i))){
answer += Integer.toString(i).repeat(couples.get(Integer.toString(i)));
couples.remove(Integer.toString(i));
}
}
if(answer.charAt(0)=='0'){
return "0";
}
return answer;
}
}
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
public String solution(String X, String Y) {
HashMap<String, String> couples = new HashMap<String, String>();
for(int i=0;i<X.length();i++){
couples.put((""+X.charAt(i)),"0");
}
for(int i=0;i<Y.length();i++){
if(couples.containsKey((""+Y.charAt(i)))){
int count = Integer.parseInt(couples.get(""+Y.charAt(i)));
count++;
couples.put((""+Y.charAt(i)),Integer.toString(count));
}
}
couples.values().remove("0");
if(couples.size()<0){
return "-1";
}
String answer = "";
for(int i = 9;i>=0;i--){
if(couples.containsKey(Integer.toString(i))){
int count = Integer.parseInt(couples.get(Integer.parseInt(i)));
answer += Integer.toString(i).repeat(count);
couples.remove(Integer.toString(i));
}
}
if(answer.charAt(0)=='0'){
return "0";
}
return answer;
}
}
/Solution.java:26: error: incompatible types: int cannot be converted to String
int count = Integer.parseInt(couples.get(Integer.parseInt(i)));
^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
1 error
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
public String solution(String X, String Y) {
HashMap<String, String> couples = new HashMap<String, String>();
for(int i=0;i<X.length();i++){
couples.put((""+X.charAt(i)),"0");
}
for(int i=0;i<Y.length();i++){
if(couples.containsKey((""+Y.charAt(i)))){
int count = Integer.parseInt(couples.get(""+Y.charAt(i)));
count++;
couples.put((""+Y.charAt(i)),Integer.toString(count));
}
}
couples.values().remove("0");
if(couples.size()==0){
return "-1";
}
String answer = "";
for(int i = 9;i>=0;i--){
if(couples.containsKey(Integer.toString(i))){
int count = Integer.parseInt(couples.get(Integer.toString(i)));
answer += Integer.toString(i).repeat(count);
couples.remove(Integer.toString(i));
}
}
if(answer.charAt(0)=='0'){
return "0";
}
return answer;
}
}
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:48)
at java.base/java.lang.String.charAt(String.java:711)
at Solution.solution(Unknown Source)
at SolutionTest.lambda$main$0(Unknown Source)
at SolutionTest$SolutionRunner.run(Unknown Source)
at SolutionTest.main(Unknown Source)
테스트 결과 (~˘▾˘)~
5개 중 4개 성공
저기서 왜 오류가 나지..?
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
public String solution(String X, String Y) {
HashMap<String, String> couples = new HashMap<String, String>();
for(int i=0;i<X.length();i++){
couples.put((""+X.charAt(i)),"0");
}
for(int i=0;i<Y.length();i++){
if(couples.containsKey((""+Y.charAt(i)))){
int count = Integer.parseInt(couples.get(""+Y.charAt(i)));
count++;
couples.put((""+Y.charAt(i)),Integer.toString(count));
}
}
couples.values().remove("0");
if(couples.size()==0){
return "-1";
}
String answer = "";
for(int i = 9;i>=0;i--){
if(couples.containsKey(Integer.toString(i))){
int count = Integer.parseInt(couples.get(Integer.toString(i)));
answer += Integer.toString(i).repeat(count);
couples.remove(Integer.toString(i));
}
}
// if(answer.charAt(0)=='0'){
// return "0";
// }
return answer;
}
}
저부분 주석처리했더니 괜찮아짐
테스트 1
입력값 〉 "100", "2345"
기댓값 〉 "-1"
실행 결과 〉 실행한 결괏값 ""이 기댓값 "-1"과 다릅니다.
테스트 2
입력값 〉 "100", "203045"
기댓값 〉 "0"
실행 결과 〉 실행한 결괏값 "00"이 기댓값 "0"과 다릅니다.
테스트 3
입력값 〉 "100", "123450"
기댓값 〉 "10"
실행 결과 〉 테스트를 통과하였습니다.
테스트 4
입력값 〉 "12321", "42531"
기댓값 〉 "321"
실행 결과 〉 테스트를 통과하였습니다.
테스트 5
입력값 〉 "5525", "1255"
기댓값 〉 "552"
실행 결과 〉 테스트를 통과하였습니다.
if(couples.size()==0){
return "-1";
}
이 부분이 안 읽어지고 넘어가져서 “-1” 리턴하는 대신 “”가 넘어간 다음 charAt(0)에서 걸리는 거 같음
java hashmap size
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
public String solution(String X, String Y) {
HashMap<String, String> couples = new HashMap<String, String>();
for(int i=0;i<X.length();i++){
couples.put((""+X.charAt(i)),"0");
}
for(int i=0;i<Y.length();i++){
if(couples.containsKey((""+Y.charAt(i)))){
int count = Integer.parseInt(couples.get(""+Y.charAt(i)));
count++;
couples.put((""+Y.charAt(i)),Integer.toString(count));
}
}
couples.values().remove("0");
// if(couples.size()==0){
// return "-1";
// }
String answer = "";
for(int i = 9;i>=0;i--){
if(couples.containsKey(Integer.toString(i))){
int count = Integer.parseInt(couples.get(Integer.toString(i)));
answer += Integer.toString(i).repeat(count);
couples.remove(Integer.toString(i));
}
}
if(answer.equals("")){
return "-1";
}
if(answer.charAt(0)=='0'){
return "0";
}
return answer;
}
}
그냥 저렇게 맞춰보긴 함
테스트 1 〉 통과 (9.46ms, 69.8MB)
테스트 2 〉 통과 (12.60ms, 72.7MB)
테스트 3 〉 실패 (8.36ms, 76.3MB)
테스트 4 〉 통과 (8.88ms, 77MB)
테스트 5 〉 실패 (8.36ms, 74.8MB)
테스트 6 〉 통과 (12.15ms, 75.5MB)
테스트 7 〉 통과 (10.63ms, 73.7MB)
테스트 8 〉 실패 (10.74ms, 78.4MB)
테스트 9 〉 통과 (7.53ms, 81.2MB)
테스트 10 〉 실패 (8.53ms, 75.1MB)
테스트 11 〉 실패 (560.09ms, 455MB)
테스트 12 〉 실패 (678.04ms, 436MB)
테스트 13 〉 실패 (571.93ms, 427MB)
테스트 14 〉 실패 (573.86ms, 439MB)
테스트 15 〉 실패 (547.73ms, 434MB)
테스트 16 〉 통과 (7.60ms, 78.4MB)
테스트 17 〉 통과 (7.38ms, 77.4MB)
테스트 18 〉 통과 (7.92ms, 79.5MB)
테스트 19 〉 통과 (5.58ms, 80.7MB)
흑흑… 적어도 이제 타임아웃 오류는 안 나네 하지만 수많은 실패가 따흐흑
생각해보니 지금 X에 5가 두개 있으면 두개 넣는데 Y에 5가 3개 있으면 어떻게 되는거지…?
다시 생각을 좀 해봐야 할 거 같다
테스트 5
입력값 〉 "5525", "1255"
기댓값 〉 "552"
실행 결과 〉 테스트를 통과하였습니다.
희한하네 이거 왜 되고 있는거임
뭔가 좀 이상해서 코드를 바꿔봄
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
public String solution(String X, String Y) {
HashMap<String, String> couples = new HashMap<String, String>();
HashMap<String, String> counts = new HashMap<String, String>();
for(int i=0;i<X.length();i++){
couples.put((""+X.charAt(i)),"0");
if(!counts.containsKey(""+X.charAt(i))){
counts.put((""+X.charAt(i)),"0");
}
}
for(int i=0;i<Y.length();i++){
if(couples.containsKey((""+Y.charAt(i)))){
int count = Integer.parseInt(couples.get(""+Y.charAt(i)));
if(count==0){
count++;
couples.remove(""+Y.charAt(i));
counts.put((""+Y.charAt(i)),Integer.toString(count));
}
}
}
counts.values().remove("0");
// if(counts.size()==0){
// return "-1";
// }
String answer = "";
for(int i = 9;i>=0;i--){
if(counts.containsKey(Integer.toString(i))){
int count = Integer.parseInt(counts.get(Integer.toString(i)));
answer += Integer.toString(i).repeat(count);
counts.remove(Integer.toString(i));
}
}
if(answer.equals("")){
return "-1";
}
if(answer.charAt(0)=='0'){
return "0";
}
return answer;
}
}
테스트 1
입력값 〉 "100", "2345"
기댓값 〉 "-1"
실행 결과 〉 테스트를 통과하였습니다.
테스트 2
입력값 〉 "100", "203045"
기댓값 〉 "0"
실행 결과 〉 테스트를 통과하였습니다.
테스트 3
입력값 〉 "100", "123450"
기댓값 〉 "10"
실행 결과 〉 테스트를 통과하였습니다.
테스트 4
입력값 〉 "12321", "42531"
기댓값 〉 "321"
실행 결과 〉 테스트를 통과하였습니다.
테스트 5
입력값 〉 "5525", "1255"
기댓값 〉 "552"
실행 결과 〉 실행한 결괏값 "52"이 기댓값 "552"과 다릅니다.
로그 찍어봄
⭐**How to update a value, given a key in a hashmap?**
map.put(key, map.get(key) + 1);
put을 해봤자 중복된 값은 안 들어갈 거 같아
테스트 5
입력값 〉 "5525", "1255"
기댓값 〉 "552"
실행 결과 〉 실행한 결괏값 "52"이 기댓값 "552"과 다릅니다.
출력 〉
key:2count:1
key:5count:1 -> key:5 count:2가 되어야 함
out
key:5count:1
answer5
key:2count:1
answer52
생각을 정리해 봄
in
X돌면서
일단 Xcounts Hashmap에 몇개인지 넣어줌
→
out
Y돌면서
Ycounts에 더해보기, Xcounts의 값보다 커질 수 없음
→
Ycounts에서 꺼내보기
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
public String solution(String X, String Y) {
HashMap<String, String> Xcounts = new HashMap<String, String>();
HashMap<String, String> Ycounts = new HashMap<String, String>();
for(int i=0;i<X.length();i++){
if(!Xcounts.containsKey(""+X.charAt(i))){
Xcounts.put((""+X.charAt(i)),"1");
}else{
int count = Integer.parseInt(Xcounts.get(Integer.toString(i)));
count++;
Xcounts.put((""+X.charAt(i)),Integer.toString(count));
}
}
for(int i=0;i<Y.length();i++){
if(Xcounts.containsKey((""+Y.charAt(i)))){
int countX = Integer.parseInt(Xcounts.get(""+Y.charAt(i)));
if(Ycounts.containsKey(""+Y.charAt(i))){
int countY = Integer.parseInt(Ycounts.get(""+Y.charAt(i)));
countY++;
if(countY<=countX){
Ycounts.put((""+Y.charAt(i)),Integer.toString(countY));
}
}else{
Ycounts.put((""+Y.charAt(i)),"1");
}
}
}
String answer = "";
System.out.println("out");
for(int i = 9;i>=0;i--){
if(Ycounts.containsKey(Integer.toString(i))){
int count = Integer.parseInt(Ycounts.get(Integer.toString(i)));
answer += Integer.toString(i).repeat(count);
System.out.println("key:"+i+"count:"+count);
System.out.println("answer"+answer);
Ycounts.remove(Integer.toString(i));
}
}
if(answer.equals("")){
return "-1";
}
if(answer.charAt(0)=='0'){
return "0";
}
return answer;
}
}
Exception in thread "main" java.lang.NumberFormatException: null
at java.base/java.lang.Integer.parseInt(Integer.java:614)
integer.parseInt 들을 살펴보기로 함
for(int i=0;i<X.length();i++){
if(!Xcounts.containsKey(""+X.charAt(i))){
Xcounts.put((""+X.charAt(i)),"1");
}else{
int count = Integer.parseInt(Xcounts.get(Integer.toString(i)));
count++;
Xcounts.put((""+X.charAt(i)),Integer.toString(count));
}
}
→
int count = Integer.parseInt(Xcounts.get(""+X.charAt(i)));
이걸로 수정함
됨!!
제출 코드
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
public String solution(String X, String Y) {
HashMap<String, String> Xcounts = new HashMap<String, String>();
HashMap<String, String> Ycounts = new HashMap<String, String>();
for(int i=0;i<X.length();i++){
if(!Xcounts.containsKey(""+X.charAt(i))){
Xcounts.put((""+X.charAt(i)),"1");
}else{
int count = Integer.parseInt(Xcounts.get(""+X.charAt(i)));
count++;
Xcounts.put((""+X.charAt(i)),Integer.toString(count));
}
}
for(int i=0;i<Y.length();i++){
if(Xcounts.containsKey((""+Y.charAt(i)))){
int countX = Integer.parseInt(Xcounts.get(""+Y.charAt(i)));
if(Ycounts.containsKey(""+Y.charAt(i))){
int countY = Integer.parseInt(Ycounts.get(""+Y.charAt(i)));
countY++;
if(countY<=countX){
Ycounts.put((""+Y.charAt(i)),Integer.toString(countY));
}
}else{
Ycounts.put((""+Y.charAt(i)),"1");
}
}
}
String answer = "";
for(int i = 9;i>=0;i--){
if(Ycounts.containsKey(Integer.toString(i))){
int count = Integer.parseInt(Ycounts.get(Integer.toString(i)));
answer += Integer.toString(i).repeat(count);
Ycounts.remove(Integer.toString(i));
}
}
if(answer.equals("")){
return "-1";
}
if(answer.charAt(0)=='0'){
return "0";
}
return answer;
}
}
다른 사람의 풀이
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class Solution {
public String solution(String X, String Y) {
Map<String, Integer> mapX = new HashMap<>();
Map<String, Integer> mapY = new HashMap<>();
List<String> list = new ArrayList<>();
for (String key : X.split("")) {
mapX.put(key, mapX.getOrDefault(key, 0) + 1);
}
for (String key : Y.split("")) {
mapY.put(key, mapY.getOrDefault(key, 0) + 1);
}
for (String key : mapX.keySet()) {
if (mapY.containsKey(key)) {
int dup = mapX.get(key) - mapY.get(key);
if (dup >= 0) {
for (int i = 0; i < mapY.get(key); i++) {
list.add(key);
}
} else {
for (int i = 0; i < mapX.get(key); i++) {
list.add(key);
}
}
}
}
if (list.isEmpty()) {
return "-1";
}
list.sort((s1, s2) -> s2.compareTo(s1)); // 리스트에 있는 값을 내림차순으로 정렬
String result = String.join("", list); // 배열을 ""기준으로 합침
if (result.matches("^[0]+$")) {
return "0";
} else {
return result;
}
}
}
개신기함
'Coding Test' 카테고리의 다른 글
[프로그래머스]둘만의 암호 (0) | 2023.12.15 |
---|---|
[프로그래머스] 대충 만든 자판 (0) | 2023.12.12 |
[프로그래머스]옹알이 (1) | 2023.12.11 |
[프로그래머스]로또의 최고 순위와 최저 순위 (1) | 2023.12.11 |
[프로그래머스]푸드 파이트 대회 (1) | 2023.11.30 |