코딩뿌시기(연습)
[Java] 문자열을 정수로 바꾸기
thisnorm
2025. 1. 13. 18:18
문제 설명
문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.
제한 조건
- s의 길이는 1 이상 5이하입니다.
- s의 맨앞에는 부호(+, -)가 올 수 있습니다.
- s는 부호와 숫자로만 이루어져있습니다.
- s는 "0"으로 시작하지 않습니다.
입출력 예
예를들어 str이 "1234"이면 1234를 반환하고, "-1234"이면 -1234를 반환하면 됩니다.
str은 부호(+,-)와 숫자로만 구성되어 있고, 잘못된 값이 입력되는 경우는 없습니다.
쉬운 문제라고 하지만 실수가 잦아서 생각보다 조금 지연된 문제이다.
너무 초보자적인 실수지만 내가 초보자라... 다들 양해부탁드립니다 ㅎㅎ
먼저 길이를 제한해주자
if( 1 <= s.length && s.length <= 5)
여기서 내가 처음한 실수인데 .length는 함수이니깐 ()을 반드시 붙여줘야 한다.
if( 1 <= s.length() && s.length() <= 5 )
그리고 's' 라는 문자열이 숫자로만 이루어졌는지 확인하기 위해서
검색을 해보았는데 .charAt이라는 함수가 있다는 것을 알게 되었다.
charAt의 구현 방식은
public final class String {
// 문자열 데이터는 char 배열로 저장
private final char[] value;
// 문자열 길이
private final int count;
// charAt 메서드
public char charAt(int index) {
if (index < 0 || index >= count) {
throw new StringIndexOutOfBoundsException(index); // 유효하지 않은 인덱스 처리
}
return value[index]; // char 배열에서 인덱스 위치의 문자 반환
}
}
이런식으로 charAt이 작동한다.
마지막으로 문자열을 숫자열로 바꾸기 위해서 함수를 찾아보니
Integer.parseInt() 가 있었다.
이 메소드의 구현 방식은
public static int parseInt(String s) throws NumberFormatException {
return parseInt(s, 10); // 기본적으로 10진수 기반으로 처리
}
public static int parseInt(String s, int radix) throws NumberFormatException {
if (s == null) {
throw new NumberFormatException("null");
}
if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) {
throw new NumberFormatException("Radix out of range");
}
int result = 0;
boolean negative = false;
int i = 0, len = s.length();
int limit = -Integer.MAX_VALUE;
int multmin;
int digit;
if (len > 0) {
char firstChar = s.charAt(0);
if (firstChar < '0') { // 음수 또는 '+' 기호 처리
if (firstChar == '-') {
negative = true;
limit = Integer.MIN_VALUE;
} else if (firstChar != '+') {
throw new NumberFormatException("For input string: \"" + s + "\"");
}
if (len == 1) { // "+" 또는 "-"만 있는 경우 예외 처리
throw new NumberFormatException("For input string: \"" + s + "\"");
}
i++;
}
multmin = limit / radix;
while (i < len) {
// 현재 문자 값을 숫자로 변환
digit = Character.digit(s.charAt(i++), radix);
if (digit < 0) {
throw new NumberFormatException("For input string: \"" + s + "\"");
}
if (result < multmin) {
throw new NumberFormatException("For input string: \"" + s + "\"");
}
result *= radix;
if (result < limit + digit) {
throw new NumberFormatException("For input string: \"" + s + "\"");
}
result -= digit;
}
} else {
throw new NumberFormatException("For input string: \"" + s + "\"");
}
return negative ? result : -result;
}
으로 많이 복잡하게 구성되어있다.
간단히 말로 정리하면
1. 입력 검증:
- null 또는 빈 문자열이면 NumberFormatException 예외를 던집니다.
- 기본적으로 10진수를 사용하지만, radix(진법)를 명시적으로 지정할 수 있습니다.
- radix가 2~36의 범위를 벗어나면 예외 발생.
2. 부호 처리:
- 문자열의 첫 문자가 '-' 또는 '+'인지 확인.
- '-'이면 negative 플래그를 true로 설정하고 계산 시 음수로 처리.
- 부호만 입력된 경우 예외 발생.
3. 문자 변환 및 계산:
- 문자열의 각 문자를 Character.digit 메서드를 사용해 해당 진법에 맞는 정수 값으로 변환.
- 변환된 값을 기존 결과에 누적하며, 오버플로우가 발생할 가능성을 체크.
4. 오버플로우 방지:
- 누적 계산 중 오버플로우가 발생할 수 있으므로 Integer.MIN_VALUE와 Integer.MAX_VALUE를 기준으로 유효성 검사를 수행.
5. 최종 반환:
- 계산된 결과를 음수 또는 양수로 변환해 반환.
최종적으로 정리하자면
문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.
에 대한 코드는
class Solution {
public int solution(String s) {
int answer = 0;
if( 1 <= s.length() && s.length() <= 5 && s.charAt(0) != 0){
answer = Integer.parseInt(s);
}
return answer;
}
}
이거다.
다른 사람의 풀이 중 좋아요 수가 가장 많은 것을 보니
public int getStrToInt(String str) {
boolean Sign = true;
int result = 0;
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (ch == '-')
Sign = false;
else if(ch !='+')
result = result * 10 + (ch - '0');
}
return Sign?1:-1 * result;
}
직접 이렇게 코딩할 수 있다는게 정말 대단한 것 같다.