강의로 돌아가기
je-pa

1~6 자바 런타임 에러 (스포주의)

결국 블로그 참고해서 풀긴 했는데요 ㅠ

import java.util.*;
import java.util.stream.*;
public String solution(int[] numbers) {
        String str = Arrays.stream(numbers).mapToObj(String::valueOf)
                .sorted((a,b) -> {
                    int aLen = a.length();
                    int bLen = b.length();
                    if(aLen == bLen) return b.compareTo(a);

                    int minLen = Math.min(aLen, bLen);
                    for(int i=0 ; i<minLen; i++){
                        char cA = a.charAt(i);
                        char cB = b.charAt(i);
                        if(cA!=cB) return cB - cA;
                    }
                    return (minLen == aLen)
                            ? b.charAt(minLen) - a.charAt(minLen-1)
                            : b.charAt(minLen-1) - a.charAt(minLen);
                })// 30 3 34 -> 34 3 30
                .collect(Collectors.joining());
        return str.startsWith("0") ? "0" : str;
    }

에서 반례좀 찾아주실분 계신가요 ㅠㅠ
지금 작성된 코드는 블로그 참고해서 고쳤습니다 ㅠ

작성중인 코드―Solution.java
1
2
3
4
5
6
7
8
9
10
11
import java.util.*;
import java.util.stream.*;
class Solution {
    public String solution(int[] numbers) {
        String str = Arrays.stream(numbers).mapToObj(String::valueOf)
            .sorted( (o1, o2) -> (o2 + o1).compareTo(o1 + o2)
            )// 30 3 34 -> 34 3 30
            .collect(Collectors.joining());
        return str.startsWith("0") ? "0" : str;
    }
}
  • 조지부시

    이제 코테 시작한 자바 초보인데요. 제가 생각한 반례를 말해보자면 a=87, b=87871이 있다고 합시다. 이 경우 sorted()의 삼항 연산자가 있는 마지막 return문까지 옵니다. 이 곳에서 87, 87871에서 최소 길이 2, 첫번째 항을 계산하면 양수(8-7)이 됩니다. 89와 89891이면 음수(8-9)가 되고요. 즉, 고려해야 하는 부분은 1. 다른 길이(a:2, b:5) 2. 최소 길이의 문자열은 공통(87 또는 89) 일 때의 더 긴 문자열(87871)에서 나머지와(871) 공통된 부분(87)을 비교해야합니다. 아래 코드에서는 두 항목을 붙여서 조합해서 비교함으로써 정상적으로 작동하고요. 쉽게 설명한다고 했는데 잘 전달이 됐으면 좋겠네요. 만약 반례가 아니라면 반대로 설명 부탁드리겠습니다.

    조지부시―2023.09.01 16:33
0 개의 답변
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다.