공log/[P&B]

[P&B] #16 PreCodingTest

ming_OoO 2023. 8. 3. 21:09
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"을 파싱하는 경우

  1. 루프의 첫 번째 반복에서 c는 '1'입니다. '1'은 숫자이므로 Character.isDigit(c)는 true를 반환
  2. num은 초기에 0이므로 num * 10 + (c - '0')은 1이 됩니다. 따라서 num에 1이 저장
  3. 루프의 두 번째 반복에서 c는 '2'입니다. '2'도 숫자이므로 Character.isDigit(c)는 다시 true를 반환
  4. 이번에는 num이 이전에 1이었기 때문에 num * 10 + (c - '0')은 12가 됩니다. 따라서 num에 12가 저장
  5. 마지막으로, 루프의 세 번째 반복에서 c는 '3'입니다. '3'도 숫자이므로 Character.isDigit(c)는 다시 true를 반환
  6. 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