티스토리 뷰
Algorithm/[Java+Python+JavaScript]BackJoon
[Java+Python]1541번, 잃어버린 괄호
Vagabund.Gni 2023. 6. 2. 23:23728x90
반응형
목차
Greedy Algorithm
문제
세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다.
그리고 나서 세준이는 괄호를 모두 지웠다.
그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.
괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.
입력
첫째 줄에 식이 주어진다.
식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다.
그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다.
수는 0으로 시작할 수 있다.
입력으로 주어지는 식의 길이는 50보다 작거나 같다.
출력
첫째 줄에 정답을 출력한다.
풀이
주어진 식에 괄호를 추가해서 합이 최소가 되려면, 덧셈 기호(+)로 연결된 모든 숫자를 더하고 마지막에 뺄셈 연산을 하면 된다.
이를 이해했다면 조금 간단하게 처리하기 위해 처음 뺄셈 기호(-)를 만나기 전까지만 숫자를 더해주고
그다음부터는 계속해서 빼주면 된다.
각 변수를 포함한 알고리즘의 흐름은 다음과 같다.
- 주어진 식을 통째로 문자열로 입력받아 expression에 저장한다.
- 최종 결과를 저장할 변수 total을 0으로 초기화한다.
- 중간 연산을 저장할 변수 subTotal을 0으로 초기화한다.
- 중간 연산이라고 적어서 헷갈릴 수 있겠지만 해당 문자가 연산자가 아닌 경우 숫자를 구성하는데 쓰인다.
- 이를 표현한 부분이 자바 코드의 subTotal = subTotal * 10 + (ch - '0'); 이다.
- 문자열을 순회하며 첫 뺄셈이 나온 이후의 값은 모두 뺄셈으로 바꿔준다.
- 반복문이 끝난 뒤 마지막 숫자를 같은 방식으로 빼준다.
코드만 읽으면 더하고 빼고를 반복하는 듯 보일 수 있지만 덧셈은 첫 뺄셈 기호 이후엔
다시 기호를 만나기 전의 숫자 구성에만 쓰인다.
Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Prob1541 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String expression = br.readLine();
int total = 0;
int subTotal = 0;
boolean isSubtract = false;
for (int i = 0; i < expression.length(); i++) {
char ch = expression.charAt(i);
if (ch == '+' || ch == '-') {
total += isSubtract ? -subTotal : subTotal;
subTotal = 0;
if (ch == '-') {
isSubtract = true;
}
} else {
subTotal = subTotal * 10 + (ch - '0');
}
}
total += isSubtract ? -subTotal : subTotal;
System.out.println(total);
}
}
Python
import sys
expression = sys.stdin.readline().rstrip()
total = 0
sub_total = 0
is_subtract = False
for i, ch in enumerate(expression):
if ch == '+' or ch == '-':
total += -sub_total if is_subtract else sub_total
sub_total = 0
if ch == '-':
is_subtract = True
else:
sub_total = sub_total * 10 + int(ch)
total += -sub_total if is_subtract else sub_total
print(total)
VSCode의 추천대로 enumerate() 내장함수를 이용해서 풀어보았다.
Performance
반응형
'Algorithm > [Java+Python+JavaScript]BackJoon' 카테고리의 다른 글
[Java+Python]1992번, 쿼드 트리 (1) | 2023.06.06 |
---|---|
[Java+Python]2630번, 색종이 만들기 (2) | 2023.06.05 |
[Java+Python]13305번, 주유소 (1) | 2023.06.04 |
[Java+Python]11339번, ATM (0) | 2023.05.31 |
[Java+Python]1931번, 회의실 배정 (0) | 2023.05.30 |
[Java+Python]16139번, 인간-컴퓨터 상호작용 (0) | 2023.05.29 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- a6000
- Python
- 리스트
- 세계일주
- 세계여행
- BOJ
- 면접 준비
- 자바
- 동적계획법
- 칼이사
- 세모
- 남미
- 스프링
- 중남미
- 기술면접
- RX100M5
- 야경
- Algorithm
- 맛집
- spring
- 지지
- 백준
- java
- 파이썬
- 스트림
- Backjoon
- 유럽
- 알고리즘
- 유럽여행
- 여행
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함