[문제]
계산할 횟수 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) 대한 특징 때문이다. 자바는 문자열을 특정 리터럴 풀에 저장하며, 같은 문자열을 사용할 시 해당 문자열을 재사용한다. 때문에 메모리 상에서 같은 메모리를 참조하게 된다. 참조값이란 메모리와 연관 있는 값이므로 이는 같은 값을 같게 된다.
'알고리즘' 카테고리의 다른 글
[구름톤 챌린지, JAVA] 1주차 프로젝트 매니징 (1) | 2024.02.06 |
---|---|
[구름톤 챌린지, JAVA] 1주차 운동 중독 플레이어 (0) | 2024.02.02 |