Study with me/프로그래머스 L0 마스터하기

프로그래머스 - L0 두수의합

외계나무 2024. 4. 19. 14:10

프로그래머스 - level 0 두수의 합

String -> int[] -> String 으로 풀었는데, 테스트 31만 실패가 뜬다.

반례 고민중...

import java.util.Arrays;
import java.util.stream.Collectors;

class Solution {
    public String solution(String a, String b) {
        String answer = "";
        int[] arr = new int[a.length()+1];
        int[] brr = new int[b.length()+1];
        for(int i=0; i<a.length(); i++) {
            arr[i+1] = a.charAt(i)-'0';
        }
        for(int i=0; i<b.length(); i++) {
            brr[i+1] = b.charAt(i)-'0';
        }
        
        if(arr.length >= brr.length) {
            for(int i=0; i<brr.length; i++) {
                arr[arr.length-i-1] += brr[brr.length-i-1];
                if(arr[arr.length-i-1] > 9) {
                    arr[arr.length-i-1] -= 10;
                    arr[arr.length-i-2] += 1;
                }
            }
            answer = Arrays.stream(arr)
                     .mapToObj(String::valueOf)
                     .collect(Collectors.joining());
        } else {
            for(int i=0; i<arr.length; i++) {
                brr[brr.length-i-1] += arr[arr.length-i-1];
                if(brr[brr.length-i-1] > 9) {
                    brr[brr.length-i-1] -= 10;
                    brr[brr.length-i-2] += 1;
                }
            }
            answer = Arrays.stream(brr)
                     .mapToObj(String::valueOf)
                     .collect(Collectors.joining());
        }
        
        if(answer.charAt(0) == '0') answer = answer.substring(1);
        return answer;
    }
}

케이스 1 + 999 = 1000으로 확인 완료...

코드 구상하던 초반에는 생각을 하던 문제였는데 안 적어두니까 잊어버린 모양이다.

다음엔 주석이나 테스트 케이스에 일단 적어두고 코드를 짜야지..

import java.util.Arrays;
import java.util.stream.Collectors;

class Solution {
    public String solution(String a, String b) {
        String answer = "";
        int[] arr = new int[a.length()+1];
        int[] brr = new int[b.length()+1];
        for(int i=0; i<a.length(); i++) {
            arr[i+1] = a.charAt(i)-'0';
        }
        for(int i=0; i<b.length(); i++) {
            brr[i+1] = b.charAt(i)-'0';
        }
        
        if(arr.length >= brr.length) {
            for(int i=0; i<brr.length; i++) {
                arr[arr.length-i-1] += brr[brr.length-i-1];
            }
            for(int i=0; i<arr.length; i++) {
                if(arr[arr.length-i-1] > 9) {
                    arr[arr.length-i-1] -= 10;
                    arr[arr.length-i-2] += 1;
                }
            }
            answer = Arrays.stream(arr)
                     .mapToObj(String::valueOf)
                     .collect(Collectors.joining());
        } else {
            for(int i=0; i<arr.length; i++) {
                brr[brr.length-i-1] += arr[arr.length-i-1];
            }
            for(int i=0; i<brr.length; i++) {
                if(brr[brr.length-i-1] > 9) {
                    brr[brr.length-i-1] -= 10;
                    brr[brr.length-i-2] += 1;
                }
            }
            answer = Arrays.stream(brr)
                     .mapToObj(String::valueOf)
                     .collect(Collectors.joining());
        }
        
        if(answer.charAt(0) == '0') answer = answer.substring(1);

        return answer;
    }
}

근데 for loop를 너무 많이 사용하기도 했고, 불필요하게 길어서 좀 줄여야하지 싶다.

타인의 풀이중에서는 BigInteger 라는 큰 정수를 넣는 타입을 사용한 것도 있더라... 알아보니 문자열 형태로 숫자를 처리해서 가능하다고... (힙 영역에 저장되는 모양) 신긔..