Project

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

PEAZH 2023. 6. 23. 09:39
반응형

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

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

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 배열로 받아서 비교하는 것이다.

밑 부분의 내용은 같다.

반응형