문제 :
https://school.programmers.co.kr/learn/courses/30/lessons/181846
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
에러 :
class Solution {
public String solution(String a, String b) {
int a1 = Integer.parseInt(a);
int a2 = Integer.parseInt(b);
int sum = a1+a2;
return a1+a2+"";
}
}
Exception in thread "main" java.lang.NumberFormatException: For input string: "18446744073709551615"
해결 :
import java.math.BigInteger;
class Solution {
public String solution(String bin1, String bin2) {
BigInteger num1 = new BigInteger(bin1);
BigInteger num2 = new BigInteger(bin2);
BigInteger result = num1.add(num2);
String answer = result.toString();
return answer;
}
}
BigInteger 클래스란?
매우 큰 값을 다루는 클래스( 정수의 크기에 제한을 두지 않음)
정수형으로 타입 변환이 필요하지 않고 문자열 형태로 숫자를 입력받아 내부적으로 해당 문자열을 정수로 변환하여 처리한다. 연산자를 사용하지 않고 각각 메서드를 사용한다.
+ : BigInteger sum = numA.add(numB);
- : BigInteger difference = numA.subtract(numB);
* : BigInteger product = numA.multiply(numB);
/,% : BigInteger division = numA.divide(numB);
다른 사람 풀이 :
class Solution {
public String solution(String a, String b) {
String answer = cal(a,b);
return answer;
}
private static String cal(String a, String b){
StringBuilder sb = new StringBuilder();
int aIndex = a.length() - 1;
int bIndex = b.length() - 1;
int prevTemp = 0;
while(aIndex >= 0 || bIndex >= 0){
int temp = prevTemp;
if(aIndex >= 0){
temp += Integer.parseInt(a.charAt(aIndex)+"") ;
}
if(bIndex >= 0){
temp += Integer.parseInt(b.charAt(bIndex)+"");
}
sb.append(temp % 10);
prevTemp = temp / 10;
aIndex--;
bIndex--;
}
if(prevTemp != 0){
sb.append(prevTemp);
}
return sb.reverse().toString();
}
}
공부 :
Integer.parseInt(x, y)
는 진수로 표현된 문자열을 정수로 변환할 때도 쓰인다.
x : 문자열
y : 진법
단, x는 y에 지정한 진법에 맞춰서 표현된 진수 문자열이여야 한다.
문제에서 a와 b는 2진수 문자열이기때문에 y자리에 2를 넣어준다.
Intger.toBinaryString()메서드로 더한 값을 다시 2진수 문자열로 변환한 뒤 반환한다.
Integer.parseInt() vs Integer.valueOf() 차이
Integer.parseInt() 는 int값 반환
Integer.valueOf() 는 Integer 객체 반환
2. 예외 처리
Integer.parseInt()는 변환할 수 없는 문자열이 들어오면 'NumberForException'을 던진다.
Integer.valueOf() 는 변환이 실패하면 'NumberForException'을 던진다.
3. Auto-unboxing
Integer.valueOf()가 Integer 객체를 반환하므로, 이를 int값으로 자동으로 언박싱할 수 있다.
Integer.parseInt()는 int값을 반환하므로 언박싱이 필요없다.
4. 캐싱
Integer.parseInt()는 매번 새로운 int값을 생성하므로 캐싱되지 않는다.
Integer.valueOf() 는 내부적으로 IntegerCache에 캐싱된다. -128부터 127까지의 정수를 변환하는 경우, 캐시된 객체를 반환한다. 이는 == 연산자로 비교할 때 동일성을 보장한다.
진법이란 무엇인가?
수를 표현하는데 사용되는 기초의 수를 의미한다.
가장 흔히 쓰이는 진법은 10진법이다. 0~9까지 10개의 기초 수를 사용하여 수를 나타낸다. 이 외에도 2진법, 8진법, 16진법 등이 있다. 컴퓨터에서는 2진법이 사용되며, 웹 개발에서는 16진법이 자주 사용된다.
진수란 무엇인가?
해당 진법에서 사용되는 숫자의 개수를 의미한다.
10진법은 0~9까지 10개의 진수
2진법은 0과 1까지 2개의 진수
16진법은 0~9와 A~F까지의 16개의 진수
'알고리즘 > [프로그래머스] JAVA' 카테고리의 다른 글
[코딩 기초 트레이닝] 0 떼기 (0) | 2024.02.10 |
---|---|
[코딩 기초 트레이닝] 배열의 원소 삭제하기 (0) | 2024.02.10 |
[코딩 기초 트레이닝] 부분 문자열 (0) | 2024.02.07 |
[코딩 기초 트레이닝] 날짜 비교하기 | LocalDate API (0) | 2024.02.07 |
[코딩 기초 트레이닝] 부분 문자열인지 확인하기 (0) | 2024.02.07 |