[프로그래머스] 숫자 짝꿍 자바 코드

mango·2023년 7월 15일
0

프로그래머스 level 1

목록 보기
12/17
post-thumbnail

* Things you should know

1. 숫자 String에서 각 자리 숫자를 int로 바꾸는 방법

String a = "12345";

for(int i = 0; i < a.length(); i++){
	int b = (int)a.charAt(i);	//이건 틀렸음. 이렇게하면 1 = 49가 됨
    							// 숫자 char의 아스키코드값이 되기 때문
	int c = (int)a.charAt(i) - 48;	// 49-48 = 1 이 됨  
}

혹은 

int d = Integer.ParseInt(a);	// 전체를 그냥 int로 바로 바꾸는 방법

2. String의 비교와 char의 비교

2-1. String의 비교

String a = "123";
String b = "456";
Boolean c = false;
	
if(a.equals("123"))			//equals 는 String 비교함수
	c = true;
if(b.compareTo("456"))		//compareTo 는 String 비교함수
	c = true;

2-2. char의 비교

char a = '3';
Boolean b = false;

if(a == '3')
	b = true

3. Sort 가 가능한 자료구조 & sort 문법

Sort가 가능한 자료구조는 array, ArrayList, Set, HashMap이 있다.
3-1. array Sort

// int[] 정렬
int[] intA = new int[10];
intA = {0,1,2,3,4,5,6,7,8,9};

Arrays.sort(intA);
Arrays.sort(intA, reverseOrder());


// String[] 정렬 
//Stirng to String array

String[] stringA = new String[10];
String str = "0123456789"

stringA = str.split("");	//띄어쓰기 없이 ""로 split하면 그냥 char 한칸이 한자리가 됨

Arrays.sort(stringA);
Arrays.sort(stringA, Collections.reverseOrder());

3-2. ArrayList Sort

// Integer ArrayList 정렬
ArrayList<Integer> intAl = new ArrayList<Integer>();
// int[] to ArrayList 는 방법 x 반복문으로 넣어주기
for(int a: intA)
	intAl.add(a);

Collections.sort(intAl);									//ArrayList sort 내림차순
Collections.sort(intAl, Collections.reverseOrder());		//ArrayList sort 오름차순


// String ArrayList 정렬
ArrayList<String> stringAl = new ArrayList<String>();

Collections.sort(stringAl);									//ArrayList sort 내림차순
Collections.sort(stringAl, Collections.reverseOrder());		//ArrayList sort 오름차순

3-3. Set Sort

Set를 ArrayList에 넣고 sort

3-4. HashMap Sort

Map도 ArrayList에 넣고 sort

Map<Integer, Double> hm = new HashMap<Integer, Double>();
hm에는 
(1, 0.5)
(5, 0.6)
(3, 0.1)
(4, 0.9)
(2, 0.3)

ArrayList<Integer> keySet = new ArrayList<Integer>(hm.keySet());
//value 기준으로 오름차순한 후 key 순서
Collections.sort(keySet,  (o1, o2)->(hm.get(o1).compareTo(hm.get(o2))  ); //오름차순

//key 기준으로 오름차순한 후 key 순서
Collections.sort(keySet); //오름차순

4. StringBuffer 란?

4-1. StringBuffer 선언
4-2. StringBuffer 함수
4.3. StringBuffer to String

StringBuffer sb = new StringBuffer(""); 		//로 초기화
sb.append("hello");
sb.append(" ");
sb.append("world");

String answer = sb.toString();

answer, sb는 hello world

5. String to Stirng[]

String a = "12345";
String[] strA = new String[];

strA = a.split("");			// 띄어쓰기 없이 ""로 split하면 그냥 char 한칸이 한자리가 됨

6. String[] to String

String[] strA = ("1","2","34","5678"...);
String str = "";

str = strA.toString();			// str = 12345678...

* 알고리즘

  1. 0~9 까지 자리에 X의 원소 count갯수를 넣을 수 있는 array를 만들고 넣는다.
  2. Y를 읽으면서 count에서 그 숫자가 X에 있는지를 확인한다.
  3. 있으면 StringBuffer에 append로 추가
  4. 다 끝났으면 String[] array로 만들어서 DESC 내림차순 sort
  5. 짝꿍이 없으면 answer를 -1로 셋팅
  6. 첫째자리가 0이란 말은, 0000 이런식으로 0밖에 없다는 소리이므로 answer를 0으로 셋팅

* 자바 코드

- (1차)

import java.util.*;

class Solution {
    public String solution(String X, String Y) {
        String answer = "";
        ArrayList<Character> xList = new ArrayList<>();
        ArrayList<Character> yList = new ArrayList<>();
        ArrayList<Character> jjkk = new ArrayList<>();
        int intAnswer = 0;
        
        for(int i = 0; i < X.length(); i++){
            xList.add(X.charAt(i));
        }
        for(int i = 0; i < Y.length(); i++){
            yList.add(Y.charAt(i));        
        }
        
        boolean hasJJKK = false;
        for(int i = 0; i< xList.size(); i++){
            if (yList.contains(xList.get(i))){
                hasJJKK = true;
                jjkk.add(xList.get(i));
                yList.remove(yList.indexOf(xList.get(i)));
            }
        }
        
        if(!hasJJKK)    intAnswer = -1;
        else{
            Collections.sort(jjkk, Collections.reverseOrder());
            for(int i = jjkk.size() - 1, j = 0; i >= 0; i--, j++){
                // System.out.println(jjkk.get(j));
                intAnswer += (int)jjkk.get(j) * Math.pow(10, i);
            }
        }
        
        answer = intAnswer + "";
        return answer;
    }
}

-> 오.. 대박 character '5'를 int로 강제변환하면 5가 아니라 아스키코드 5인 53이 나옴
-> 그 부분 고쳤지만 틀렸다.

- (2차) 정답

import java.util.*;
import java.math.*;

class Solution {
    public String solution(String X, String Y) {
        String answer = "";
        StringBuffer sb = new StringBuffer("");
        int[] count = new int[10];
        
        for(int i = 0; i < X.length(); i++){
            count[X.charAt(i)-48]++;
        }
        
        Boolean haveJG = false;
        for(int i = 0; i < Y.length(); i++){
            if(count[Y.charAt(i)-48] != 0){
                count[Y.charAt(i)-48]--;
                haveJG = true;
                sb.append(Y.charAt(i));
            }
        }
        String[] str = sb.toString().split("");
        Arrays.sort(str, Collections.reverseOrder());
        sb = new StringBuffer("");
        for(int i = 0; i < str.length; i++){
            sb.append(str[i]);
        }
        answer = sb.toString();
        
        if(!haveJG) answer = "-1";
        else{
            if(answer.charAt(0) == '0') answer = "0";
        }
        
        return answer;
    }
}

-> 1차시도에서는 시간복잡도가 X * Y 였는데, 2차시도에서는 Y로 줄었다. 이번 알고리즘은 1차에서 HashMap으로 바꿔야하나 고민하다가 array로 가능하다는 정답을 보고 참고해서 짰다.
왜 array 방법을 생각못했지?? 그리고 String으로 출력하는데 왜 계산을 하고있냐고!
-> 이번에 찾아보면서 알게된 사실이 정말 많아서 모조리 정리해주겠어..

profile
앎의 즐거움을 아는 나는 mango ♪

0개의 댓글