반응형
일주일마다 팀을 바꿔가며 프로젝트를 한다고 했다.
이번이 처음으로 한 프로젝트이다.
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 배열로 받아서 비교하는 것이다.
밑 부분의 내용은 같다.
반응형
댓글