본문 바로가기
개발/알고리즘

[프로그래머스/JAVA] 가장 큰 수 - 정렬

by zuzuu 2022. 2. 20.
반응형

 

 

이 문제도 쉽게 잘 풀렸다고 생각했고, 문제의 예제가 내가 대입한 숫자로는 결과가 잘 나왔다.

하지만 테스트 33.3 점을 받았다..ㅎㅎ 이 정도면 예제가 운 좋게 맞은 수준..

  public String solution(int[] numbers) {
        String answer = "";
        
        Integer[]numbers2 = Arrays.stream(numbers).boxed().toArray(Integer[]::new); 
        Arrays.sort(numbers2, new Comparator<Integer>() {

			@Override
			public int compare(Integer o1, Integer o2) {
				
				
				if(o1.toString().charAt(0) == o2.toString().charAt(0)) {
					if(o1.toString().length() != o2.toString().length()) {
						
						
						if(o1.toString().length() > o2.toString().length()) {
							
							String temp = null;
							for(int i= 0; i<o1.toString().length()-1; i++) {
								if(i==0) {
									temp = o2.toString();
								}
								temp = temp + o2.toString();
							}
							return Integer.parseInt(temp) - o1;
						}else {
							
							String temp = null;
							for(int i= 0; i<o2.toString().length()-1; i++) {
								if(i==0) {
									temp = o1.toString();
								}
								temp = temp + o1.toString();
							}
							return o2 - Integer.parseInt(temp);
						}
					}
					return o2 - o1;
				}else {
					return o2.toString().charAt(0) - o1.toString().charAt(0);
				}
				
			}
		});

        
        	
        for(int num : numbers2) {
        	answer = answer + num;
		}
        
        return answer;
    }

 

그래서 이번엔 Integer Array가 아닌  String Array로 변환하여 Sorting하였다.

예를들어 3, 34를 비교할 때 "3"+"34" = "334"와 "34"+"3" = "343" 을 비교하여 내림차순 정렬되도록 처리했다.

public String solution(int[] numbers) {
        String answer = "";
        
        String[] strArr = Arrays.stream(numbers).mapToObj(String :: valueOf).toArray(String[]::new);
        
        Arrays.sort(strArr, new Comparator<String>() {

			@Override
			public int compare(String o1, String o2) {
				int a = Integer.parseInt(o2+o1);
				int b = Integer.parseInt(o1+o2);
				return a-b;
			}
        	
        });
        
        for(String str : strArr) {
        	answer = answer + str;
		}
        
       return answer;
    }

 

하지만 또 테스트 코드 하나가 통과하지 못했고, 이유를 찾아보니 0만 있는 배열의 경우 0을 리턴해야하는데 000 이런식으로 리턴하고 있었다. 

 

int i = Integer.parseInt(answer);
if(i == 0) {
    return "0";
}

이 코드를 추가했는데 런타임에러가 우수수 떨어지더라.. 테스트 케이스 중 숫자가 큰 경우 int 범위 밖이라 그런듯..

 

아래와 같이 소스를 수정하여 테스트에 통과하였다! 

public String solution(int[] numbers) {
        String answer = "";
        
        String[] strArr = Arrays.stream(numbers).mapToObj(String :: valueOf).toArray(String[]::new);
        
        Arrays.sort(strArr, new Comparator<String>() {

			@Override
			public int compare(String o1, String o2) {
				int a = Integer.parseInt(o2+o1);
				int b = Integer.parseInt(o1+o2);
				return a-b;
			}
        	
        });
        
        int zeroCnt = 0;
        for(String str : strArr) {
        	 int i = Integer.parseInt(str);
        	 if(i ==0) {
        		 zeroCnt++;
        	 }
        	answer = answer + str;
		}
        if(zeroCnt == strArr.length) {
        	return "0";
        }
       
        
       return answer;
    }

 

728x90
반응형

댓글