알고리즘

[구름톤 챌린지, JAVA] 1주차 합 계산기

jayoon 2024. 2. 7. 01:46

[문제]

계산할 횟수 T를 입력 받아 해당 횟수만큼 이항연산자인 "+, -, /, *"를 사용하여 계산한 값을 전부 더하는 문제이다.

[코드]

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int T = Integer.parseInt(scan.nextLine());
        int res = 0;

        for (int i = 0; i < T; i++) {
            String[] input = scan.nextLine().split(" ");
            int n1 = Integer.parseInt(input[0]);
            int n2 = Integer.parseInt(input[2]);
            String operator = input[1];

            switch (operator) {
                case "+":
                    res += n1 + n2;
                    break;
                case "-":
                    res += n1 - n2;
                    break;
                case "/":
                    res += n1 / n2;
                    break;
                case "*":
                    res += n1 * n2;
                    break;
                default:
                    throw new IllegalStateException("Unexpected value: " + operator);
            }
        }
        System.out.println(res);
    }
}

[풀이]

  • Scanner::nextInt()는 정수만 가져가고 개행을 남겨둔다. 다음에 nextLine()을 사용하면 되지만 굳이 이를 사용하지 않고, 문자열을 받은 뒤 이를 Integer.parseInt()로 정수로 변경해줬다.
  • 여기에서 중요한 것은 조건문 사용인데 총 네 가지에 Java는 switch에서 문자열 비교가 가능하므로 switch문을 사용하였다. break문을 사용해줘야 연산 후 res에 더하고 다음 연산을 하게 된다.
  • 여기에선 지역변수의 특성을 알아야 한다. 중괄호 {} 안에서 선언한 변수는 해당 영역의 지역 변수가 된다. 때문에 최종적으로 출력을 해야 하는 res는 for문 안이 아닌, 바깥에 선언을 해야 한다.
  • 처음에 원하는 값이 나오지 않아 디버깅을 위해 default 구문을 추가해봤는데 내가 *가 아닌 %를 넣어서 원하는 값이 나오지 않는 것이었다. 때문에 굳이 지우지 않았다.

[해설, 리팩토링]

  • 해설에서는 switch문을 사용하지 않고 if 조건문을 사용한다. 이때 문자열 비교를 == 연산자를 사용하지 않고, String::equals()를 사용하는 것이 핵심이다. == 연산자는 객체 참조를 비교하지 문자열 내부의 값을 비교하지 않는다. 하지만 이것이 틀렸다고 생각이 드는 예시가 있다. 그것은 아래와 같다.
String s1 = "123";
String s2 = "123";
if (s1 == s2)
	System.out.println("These are same");
  • 위 결과는 "These are same"이라는 문자열이 출력된다. 왜 == 연산자는 문자열 내부의 값이 아닌 객체 참조값을 비교한다는데 이것이 참이 될까? 이는 자바 언어의 문자열 리터럴 풀(pool) 대한 특징 때문이다. 자바는 문자열을 특정 리터럴 풀에 저장하며, 같은 문자열을 사용할 시 해당 문자열을 재사용한다. 때문에 메모리 상에서 같은 메모리를 참조하게 된다. 참조값이란 메모리와 연관 있는 값이므로 이는 같은 값을 같게 된다.