728x90
프리코딩테스트 1-3
3) Caculater
오답 노트 코드
Class Solution{
public class Calculator {
public static int calculate(String s) {
int result = 0; // 결과를 저장하는 변수
int sign = 1; // 숫자의 부호를 나타내는 변수 (1: 양수, -1: 음수)
int num = 0; // 현재 파싱 중인 숫자를 저장하는 변수
for (char c : s.toCharArray()) {
if (Character.isDigit(c)) {
num = num * 10 + (c - '0'); // 숫자를 만나면 현재 숫자를 덧붙임
} else if (c == '+') {
result += sign * num; // 현재 숫자를 적절한 부호로 결과에 더함
sign = 1; // 다음 숫자의 부호를 양수로 설정
num = 0; // 다음 숫자를 위해 현재 숫자를 리셋
} else if (c == '-') {
result += sign * num; // 현재 숫자를 적절한 부호로 결과에 더함
sign = -1; // 다음 숫자의 부호를 음수로 설정
num = 0; // 다음 숫자를 위해 현재 숫자를 리셋
}
}
// 남은 숫자와 부호를 처리하여 최종 결과 계산
result += sign * num;
return result;
}
public static void main(String[] args) {
String s = "-3+26-7";
int result = calculate(s);
System.out.println("계산 결과: " + result);
}
}
}
문제 풀이 코멘트
Character.isDigit(c)라는 함수를 처음 접해보았다. 해당 함수는 문자 c가 숫자인지 확인하는 함수다. 문자 c가 숫자인 경우에는 true를 반환하고, 숫자가 아닌 경우에는 false를 반환한다. num = num * 10 + (c - '0')는 현재 파싱 중인 숫자를 덧붙이는 과정을 나타낸다. 문자열에서 숫자를 파싱할 때, 각 자리의 숫자를 10진수의 자릿수로 간주하여 현재 파싱 중인 숫자에 덧붙이기 위해 사용된다. 예를 들어, 문자열 "123"을 파싱하는 경우
- 루프의 첫 번째 반복에서 c는 '1'입니다. '1'은 숫자이므로 Character.isDigit(c)는 true를 반환
- num은 초기에 0이므로 num * 10 + (c - '0')은 1이 됩니다. 따라서 num에 1이 저장
- 루프의 두 번째 반복에서 c는 '2'입니다. '2'도 숫자이므로 Character.isDigit(c)는 다시 true를 반환
- 이번에는 num이 이전에 1이었기 때문에 num * 10 + (c - '0')은 12가 됩니다. 따라서 num에 12가 저장
- 마지막으로, 루프의 세 번째 반복에서 c는 '3'입니다. '3'도 숫자이므로 Character.isDigit(c)는 다시 true를 반환
- num은 이전에 12였기 때문에 num * 10 + (c - '0')은 123이 됩니다. 따라서 num에 123이 저장
이렇게 하여 문자열 내의 숫자를 파싱하여 num 변수에 저장하는 과정을 거쳐 숫자를 추출하고, 이렇게 파싱된 숫자는 이후 덧셈과 뺄셈 연산에 활용된다.
이 문제는 함수활용과 파싱이 관건인 것 같다. 다시 풀어볼 문제 중 하나다.
728x90
'공log > [P&B]' 카테고리의 다른 글
[P&B] #18 Programmers (0) | 2023.08.05 |
---|---|
[P&B] #17 PreCodingTest (0) | 2023.08.04 |
[P&B] #15 PreCodingTest (0) | 2023.08.03 |
[P&B] #14 Programmers (0) | 2023.08.01 |
[P&B] #13 PreCodingTest (0) | 2023.07.31 |