프로그래머스/Lv. 0(코딩 기초 트레이닝)

[프로그래머스 코딩테스트] 두 수의 연산값 비교하기(Java)

Sigfriede 2023. 4. 27. 13:10

  문제 설명

  연산 +는 두 정수에 대한 연산으로 두 정수를 붙여서 쓴 값을 반환합니다. 예를 들면 다음과 같습니다.

  • 12 + 3 = 123
  • 3 + 12 = 312

  양의 정수 a와 b가 주어졌을 때, a + b와 2 * a * b 중 더 큰 값을 return 하는 solution 함수를 완성해 주세요.

  단, a + b와 2 * a * b가 같으면 a + b를 return 합니다.

 

  제한사항

  • 1 <= a, b < 10,000

 

  입출력 예

a b result
2 91 364
91 2 912
class Solution {
    public int solution(int a, int b) {
        int answer = 0;
        String a1 = Integer.toString(a);
        String b1 = Integer.toString(b);
        String num = a1 + b1;
        if (Integer.parseInt(num) >= 2 * a * b) {
            answer = Integer.parseInt(num);
        } else {
            answer = 2 * a * b;
        }

        return answer;
    }
}

  매개변수를 각 문자열로 변경 후 합쳐주었습니다. if문에서는 합친 값을 담는 변수인 num과 문제에서 제시한 2 * a * b와 비교하였습니다. 만약 num이 크다면 answer에 num을 할당합니다. 만약 num이 작다면 answer에 2 * a * b를 할당합니다. 문자열과 정수형은 올바른 비교를 할 수 없으므로, 반드시 형변환 후에 비교해야 합니다.

class Solution {
    public int solution(int a, int b) {
        int answer = 0;
        int length = (int)Math.log10(b) + 1;
        int plus = a * (int)Math.pow(10, length) + b;
        if (plus >= 2 * a * b) {
            answer = plus;
        } else {
            answer = 2 * a * b;
        }
        return answer;
    }
}

  처음 코드와 달리 이 코드는 형변환 없이 진행합니다. a를 정수형인 상태로 더하기 위해서는 자릿수의 길이를 먼저 구해야 합니다. Math.log10(b) + 1은 자릿수의 길이를 구하는 식입니다. 만약 a와 b가 각각 12와 3이고, 이를 합치면 123인 예가 있습니다.  그렇다면 a에 b를 더할 때 12가 아닌 120을 더해주어야 하는 것입니다. 붙어야 하는 0의 개수를 구하기 위해 length를 계산하는 것입니다.

  plus 변수는 문제에서 제시한 조건대로 계산한 값입니다. Math.pow를 통해 10을 n제곱 함으로써 length에서 구한 길이만큼 a에 0을 붙여줄 것입니다.

  이후 if문은 문자열에서의 풀이와 같습니다.

왼쪽 문자열로 변경 후 풀이 코드, 오른쪽 정수형 풀이 코드

  예상대로 형변환을 할 때, 형변환을 하지 않았을 때보다 느린 것이 한눈에 보입니다. 잦은, 혹은 불필요한 형변환은 지양하는  것이 좋겠습니다.