[BOJ 1287] 할 수 있다

2021. 10. 11. 17:08Baekjoon

728x90

https://www.acmicpc.net/problem/1287

 

1287번: 할 수 있다

곱하기가 연산자 우선순위가 빠르므로 5+(1+2)*3 = 5+3*3 = 5+9 = 14가 된다. 연산자의 우선순위는 다음과 같다. (), */, +- 여기서 *와 /가 연산자 우선순위가 같고, +와 -가 연산자 우선순위가 같다. ()가

www.acmicpc.net

 

- 문제 요약

 

식이 문자열 형식으로 주어지면 그 식을 계산하여 결괏값을 10진수 형식으로 출력하시오.

단, 식을 구성하는 문자는 0~9까지의 숫자, +, -, /, *, (, )이고 +, -, /, *는 이항 연산자이다.

식이 올바르지 않아 계산 할 수 없다면 "ROCK"를 출력한다.

 

 

- 알고리즘 정리

 

이 문제는 무조건 파이썬으로 푸는 게 편할 것 같아서 이번만큼은 C++을 버리고 파이썬으로 풀어보려 합니다.

 

우선 문자열 하나를 입력받고 문자열 길이만큼 for문을 돌리면서 식이 바른지 아닌지를 검증합니다.

그리고 올바른 식이라면 eval() 함수를 이용해서 식을 계산하면 됩니다.

 

+) eval() 함수는 식을 문자열로 받아서 계산을 해주는 함수입니다.

 

 

- 코드 작성

 

s=input()
new=''
check=''
arr=['0','1','2','3','4','5','6','7','8','9','(',')']

if s.count('()')!=0:
    new+='x'
for i in s:
    if i=='/':
        new+='//'
    else:
        new+=i
    if i not in arr:
        check+='&'
    else:
        check+=i

try:
    eval(check)
    print(eval(new))
except:
    print("ROCK")

 

문자열 s를 입력받고, s 안에 ()가 들어있는지 확인해줍니다. (괄호 쌍이 들어있으면 식이 성립이 안됩니다.)

만약 들어있다면 나중에 eval(new) 부분에서 에러가 나고 except 부분으로 넘어갈 수 있도록 x를 집어넣어 줍니다.

 

그리고 나선 for문을 돌리면서 식을 만들어주고 eval(new)를 출력해줍니다.

 

코드 제출 결과

이번 문제는 eval() 함수 덕분에 쉽게 풀 수 있었습니다.

만약 eval() 함수를 몰랐더라면 저는 큐브 문제를 풀 때처럼 C++로 막노동을 하고 있었겠죠...ㅋㅋㅋㅋ

언어 학습의 중요성을 다시 한번 상기시키는 문제였습니다.

728x90

'Baekjoon' 카테고리의 다른 글

[BOJ 3830] 교수님은 기다리지 않는다  (0) 2022.08.20
[BOJ 1655] 가운데를 말해요  (0) 2022.05.04
[BOJ 15590] Rental Service  (0) 2022.05.03
[BOJ 5373] 큐빙  (0) 2021.08.12
[BOJ 17428] K번째 괄호 문자열  (0) 2021.08.07