[프로그래머스] 가장 큰 수 만들기

    반응형

    일주일마다 팀을 바꿔가며 프로젝트를 한다고 했다.

    이번이 처음으로 한 프로젝트이다.

    Q. 음수가 아닌 수들이 주어졌을 때 그 수들을 이어서 만들 수 있는 가장 큰 수를 구하시오. 예를 들어 [1,2,3]이 주어졌을 때 만들 수 있는 가장 큰 수는 321이고, [3, 30, 34, 5, 9]가 주어지면 만들 수 있는 가장 큰 수는 9534330이다.

    package Team;
    
    public class Team01 {
    	public static int Number(int i) {// 첫 번째 글자를 뽑아내기 위한 클래스 생성
    		while (i >= 10) {// i가 10보다 클 때
    			i /= 10;// i를 10으로 나누기
    		}
    		return i;
    	}
    
    	public static void main(String[] args) {
    		int[] arr01 = { 733, 573, 33, 55, 575 }; // 주어진 배열
    		int n = arr01.length;
    		int temp = 0;
    
    		for (int i = 0; i < n - 1; i++) {// 첫 번째 글자 뽑아내기
    			for (int j = 0; j < n - i - 1; j++) {
    				int num1 = Number(arr01[j]);
    				int num2 = Number(arr01[j + 1]);
    
    				if (num1 < num2) {// 앞자리 두 값을 비교 했을 때 큰 값이 나오면
    					temp = arr01[j];// num1과 num2 순서를 바꾸기
    					arr01[j] = arr01[j + 1];
    					arr01[j + 1] = temp;
    				} else if (num1 == num2)// 앞자리의 두 값이 똑같고
    					if (arr01[j] < arr01[j + 1]) {// 전체 숫자가 더 크다면 
    						temp = arr01[j];// num1과 num2 순서를 바꾸기
    						arr01[j] = arr01[j + 1];
    						arr01[j + 1] = temp;
    					}
    			}
    		}
    
    		for (int i = 0; i < arr01.length; i++) {
    			System.out.print(arr01[i] + " ");// 733 575 573 55 33 
    		}
    	}
    }

    처음에 나는 이렇게 코드를 짰는데 이렇게 짰을 때 오류가 있었다.

    else if (num1 == num2)// 앞자리의 두 값이 똑같고
        if (arr01[j] < arr01[j + 1]) {// 전체 숫자가 더 크다면 
            temp = arr01[j];// num1과 num2 순서를 바꾸기
            arr01[j] = arr01[j + 1];
            arr01[j + 1] = temp;

    위 코드에서 이 부분을 보면 9와 91이 나왔을 때, 원래의 문제 의도는 '991'이 나와야 하는데

    내가 짠 코드는 앞자리가 똑같으면 더 큰 값이 앞으로 나와서 '919'가 나왔다.

    이 부분을 어떻게 수정할지 너무 막막했는데 같은 팀원의 아이디어를 가져왔다.

    팀원의 아이디어는 int를 String으로 변환해 두 값을 붙여서 서로 비교하는 방법이다.

    예를 들어, 919와 991을 비교해서 919 < 991이 나온다면 자리를 바꿔주는 것이다.

    그래서 내가 수정한 코드는 다음과 같다.

    package Team;
    
    class Test {
    	public static int Number(int i) {
    		while (i >= 10) {
    			i /= 10;
    		}
    		return i;
    	}
    
    	//기존 코드에서 추가한 부분
    	boolean swap(int n1, int n2) {//int를 String으로 변환해서 서로 붙여주기
    		String s1 = Integer.toString(n1) + Integer.toString(n2);
    		String s2 = Integer.toString(n2) + Integer.toString(n1);
    
    		if (Integer.parseInt(s1) < Integer.parseInt(s2))//값 비교
    			return true;
    		else {
    			return false;
    		}
    	}
    }
    
    // 메인
    public class Team02 {
    
    	public static void main(String[] args) {
    
    		Test check = new Test();
    
    		int[] arr01 = { 9, 915, 25, 22, 8, 22089 }; // 주어진 배열
    		int n = arr01.length;
    		int temp = 0;
    
    		for (int i = 0; i < n - 1; i++) {
    			for (int j = 0; j < n - i - 1; j++) {
    				int num1 = Test.Number(arr01[j]);
    				int num2 = Test.Number(arr01[j + 1]);
    				if (num1 < num2) {// 앞자리 비교
    					temp = arr01[j];
    					arr01[j] = arr01[j + 1];
    					arr01[j + 1] = temp;
    				} else if (num1 == num2) {// 앞자리가 똑같을 때 비교
    					// 기존에서 수정한 부분
    					if (check.swap(arr01[j], arr01[j + 1])) {
    						temp = arr01[j];
    						arr01[j] = arr01[j + 1];
    						arr01[j + 1] = temp;
    					}
    				}
    			}
    		}
    		for (int i = 0; i < arr01.length; i++) {
    			System.out.print(arr01[i] + " ");// 9 915 8 25 22 22089 
    		}
    	}
    }

    이렇게 수정을 하고나면 원하는 값으로 출력된다. int를 String으로 바꿔서 서로 붙여서 비교해 보는 생각을 난 절대 하지 못했는데 팀원의 도움으로 코드를 짤 수 있었다. 그리고 우리 팀끼리 최종으로 짠 코드는 다음과 같다.

    import java.util.Arrays;
    
    class BigNum {
       
       String[] sort(String[] strArr) { // 0번째 숫자가 큰 것부터 정렬
          String str;
          // [54, 95, 89, 92, 9, 72, 75]
          // i = 0<6, length=7이기 때문에 -1
          for (int i = 0; i < strArr.length - 1; i++) {
             // j = 1<7
             for (int j = i + 1; j < strArr.length; j++) {
                // charAt()을 이용해서 0번째 수 비교
                // 0번째가 크면 자리 바꾸기
                if (strArr[i].charAt(0) < strArr[j].charAt(0)) {
                   str = strArr[i];
                   strArr[i] = strArr[j];
                   strArr[j] = str;
                }
    //            System.out.println(Arrays.toString(strArr));
             }
          }
          return strArr;
       }
    
       boolean swap(String a, String b) { 
          // [95, 92, 9, 89, 72, 75, 54]
          // a+b, b+a를 비교해서 큰 값 비교
          // b+a가 더 클경우 true 리턴
          // a+b가 더 클경우 false 리턴
          
          // 0번째 1번째 숫자 비교
          // 95+92 < 92+95
          // 9592<9295 이므로 false 리턴(자리 변경X)
          // [95, 92, 9, 89, 72, 75, 54]
    
    
          // 0번째 2번째 숫자 비교 959<995이므로
          // true 리턴 (자리 변경)
          // [9, 92, 95, 89, 72, 75, 54]
          
          boolean swap = false;
          if (Integer.parseInt(a + b) < Integer.parseInt(b + a)) {
             swap = true;
          }
          return swap;
       }
    }
    
    public class Test00 {
       public static void main(String[] args) {
          String[] strNum = { "54", "95", "89", "92", "9", "72", "75" }; // 9959289757254
          BigNum bigNum = new BigNum();
          System.out.println(Arrays.toString(strNum));
    
          // strNum 배열 정렬
          strNum = bigNum.sort(strNum);
          // 첫번째 숫자가 제일 큰 것부터 정렬
          System.out.println(Arrays.toString(strNum));
    
          String temp;
          
          //i = 0<6
          for (int i = 0; i < strNum.length - 1; i++) {
             //j = 0<7
             for (int j = i + 1; j < strNum.length; j++) {
                //true 값이 오면 값변경
                if (bigNum.swap(strNum[i], strNum[j])) {
                   temp = strNum[i];
                   strNum[i] = strNum[j];
                   strNum[j] = temp;
                }
    //            System.out.println(Arrays.toString(strNum));
             }
          }
          System.out.println(Arrays.toString(strNum));
          
          for (String string : strNum) {
             System.out.print(string);
          }
       }
    }

    내가 짠 코드는 int로 배열을 받아서 String으로 바꿔줬는데 최종은 처음부터 String 배열로 받아서 비교하는 것이다.

    밑 부분의 내용은 같다.

    반응형

    댓글