[Baekjoon] 1541번 잃어버린 괄호.cpp

세동네·2022년 10월 14일
0
post-thumbnail

[백준] 1541번 잃어버린 괄호 문제 링크

쉬운 문제지만 경험이 많이 없는 유형이라 한 번에 많은 걸 배운 문제이다. 먼저 필자가 풀었던 방식이다.

· 최초 풀이 방식

#include <iostream>
#include <string>

int main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(NULL);
	std::cout.tie(NULL);

	std::string notation;

	std::cin >> notation;

	int result = 0;
	int num = 0;

	int plusMinus = 1;

	for (int index = 0; index < notation.length(); index++) {
		if (notation[index] >= '0' && notation[index] <= '9') {
			num = (num * 10) + notation[index] - '0';
		}
		else {
			result += (plusMinus * num);
			if (notation[index] == '-') {
				plusMinus = -1;
			}
			num = 0;
		}
	}
	result += plusMinus * num;

	std::cout << result << std::endl;
}
  1. 입력을 하나의 문자열로 받고, 이를 파싱하여 정수로 변환하였다.
  2. 첫 숫자는 반드시 양수이고, 이후 음수가 나올 때부터 결과에서 빼주기 시작한다. 이때, - 연산자를 만나고 이후의 숫자부터 결과를 적용해주기 위해 연산 후 연산자의 값을 바꿔 주었다.
  3. 마지막 숫자는 연산자를 만나기 전에 for문에서 빠져 나오기 때문에 따로 result에 더하는 코드를 추가해었다.

그리고 이를 개선한 코드는 아래와 같다.

· 개선 풀이 방식

#include <iostream>
#include <string>

int main() {
	int result;

	int num;
	char oper;

	int plusMinus = 1;
	
	for (scanf("%d", &result); scanf("%c", &oper), oper != 10;) {
		scanf("%d", &num);
		if (oper == '-') {
			plusMinus = -1;
		}
		result += plusMinus * num;
	}
	printf("%d\n", result);
}
  1. 정수와 문자 하나를 번갈아 입력 받으면 파싱 과정을 생략할 수 있다. 이때 scanf()는 함수이고, 반환값을 가지므로 for 구문의 각 영역에 들어갈 수 있다.
  2. 첫 숫자는 바로 result에 입력하여 초기화해준다.
  3. oper에 대한 입력을 for 구문 내부에 두면 마지막 문자 \n을 입력했을 때의 조건문을 따로 추가해주어야 하므로 조건 검사에서 연산자에 대한 입력을 받는다. 입력은 틀리는 경우가 없으므로 연산자 입력에서 문제가 발생할 일은 없다.

이러한 개선 코드를 사용하면 모든 문제점을 해결하면서 간결하게 코드를 작성할 수 있다.

0개의 댓글