Day3 - 두 수의 연산값 비교하기
📌 문제 정보
- 문제 이름 : 코딩 기초 테스트 - 두 수의 연산값 비교하기
- 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/181938
📌 문제 요약
- 핵심 조건: 양의 정수 a와 b가 주어졌을 때, a ⊕ b와 2 * a * b 중 더 큰 값을 return 단, a ⊕ b와 2 * a * b가 같으면 a ⊕ b를 return (연산 ⊕는 두 정수에 대한 연산으로 두 정수를 붙여서 쓴 값을 반환)
- 제한: 1 ≤ a, b < 10,000
📌 내 풀이 및 코드
class Solution {
public int solution(int a, int b) {
int x = Integer.parseInt(String.valueOf(a) + String.valueOf(b));
int y = 2 * a * b;
if (x >= y) {
return x;
} else {
return y;
}
}
}
- 정수 2개를 문자열로 변환해서 최종적으로 문자열을 만드는 문법에 대해 몰라서 힌트 봄.
- String.valueof()를 써야했는데 x를 int로 받아야해서 문법이 더 필요했음. (incompatible types)
- parseInt() 써야했음. (문자열로 이어붙인 뒤, 그걸 다시 정수로 변환해야 함.)
📌 다른 사람들 풀이
// 1
return Math.max(Integer.parseInt(String.valueOf(a)+String.valueOf(b)),2*a*b);
// 2
int ab = Integer.parseInt(a + "" + b);
if(2 * a * b <= ab) {
return ab;
} else {
return 2 * a * b;
}
// 3
return Math.max(
(int)Math.pow(10, (int)Math.log10(b) + 1) * a + b,
2 * a * b
);
// 4
int t1 = Integer.parseInt("" + a + b);
int t2 = 2 * a * b;
if (t1 >= t2) {
return t1;
} else {
return t2;
}
<-- 다른 풀이 요약 -->
- 1 : Math.max + parseInt - but 값이 같을 때 Math.max는 둘 중 아무거나 반환하니 a를 반환한다는 보장이 없음. (불합 가능성)
- 2 : 내 코드에서 int x = Integer.parseInt(a + "" + b); 로 바꾼 코드. (깔끔함)
- 3 : parseInt 대신 수학으로 이어붙임 → a * 10^(자릿수(b)) + b (Math.max라 같을 때 ⊕ 보장 못함 → 조건 불일치)
=> Math.pow, Math.log10 → 부동소수점 연산, 캐스팅 필요 → 오히려 복잡 + 정수 오차 위험 있음
- 4 : String.valueof 대신 "" + a + b를 씀. 내 코드에서 ""로 문자열 변환한 것뿐임.
| 버전 | 조건 준수 | 복잡도 | 간결성 | 추천도 |
| Math.max | ❌ (같을 때 ⊕ 조건 위반) | 가장 간단 | 한 줄 | ❌ |
| if + parseInt (<=) | ✅ | 간단 | 문제 조건에 딱 맞음 | ✅✅✅ |
| Math.pow | ❌ (같을 때 ⊕ 조건 위반) | 불필요하게 복잡 | 부동소수점 위험 | ❌ |
| if + "" + a + b | ✅ | 간단 | String.valueOf 대신 "" | ✅✅ |
📌 새로 배운 문법
<-- 이번 문제에서 새로 배운 Java 문법 정리 -->
| 문법 | 의미 | 실전 예시 |
| a + "" + b | 정수를 문자열로 이어붙이기 | 12 + "" + 3 → "123" |
| String.valueOf(x) | 정수를 문자열로 변환 | String.valueOf(12) → "12" |
| Integer.parseInt(str) | 문자열을 정수로 변환 | Integer.parseInt("123") → 123 |
** Integer.parseInt() **
- Integer: 자바의 기본형 int를 다루는 클래스 / parseInt : 문자열(String)을 정수(int)로 바꿔주는 메서드
- String을 int로 바꿔주는 대표적인 표준 도구
| 메서드 | 설명 |
| Integer.parseInt(String s) | 기본 10진수 문자열을 정수로 |
| Integer.parseInt(String s, int radix) | 진법 지정 가능! |
| Integer.valueOf(String s) | parseInt랑 비슷한데, Integer 객체를 반환 |
- 자주하는 실수 : 문자열이 숫자가 아니면 에러. (Integer.parseInt("abc"); 이런 형식이면 안됨)
| 사용 예 | 결과 | 의미 |
| Integer.parseInt("456") | 456 (int) | 문자열 "456" → 정수 456 |
| Integer.parseInt("007") | 7 (int) | 앞에 0 붙어도 숫자로 인식 |
| Integer.parseInt("12" + "3") | 123 (int) | 문자열 이어붙인 뒤 정수 변환 |