일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 백준
- REACT
- 오블완
- 기본 문법
- 시뮬레이션
- 회고
- 토이 프로젝트
- 브루트포스
- 수학
- js
- HTML5
- 해시를 사용한 집합과 맵
- react-three/fiber
- 자바스크립트
- 자료 구조
- 티스토리챌린지
- poiemaweb
- 코딩일기
- 세그먼트 트리
- 엔트리포인트
- 자바
- 개발 회고
- 프론트엔드
- three.js
- 모던 자바스크립트 튜토리얼
- 구현
- styled-components
- JavaScript
- State
- Next.js
Archives
- Today
- Total
코딩하는 고릴라
[Java] BOJ_1541. 잃어버린 괄호 본문
반응형
🦍 문제
1541번: 잃어버린 괄호
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다
www.acmicpc.net

🐈 문제 풀이
1. 무엇을 구해야 할까?
주어진 입력값을 토대로 괄호를 적절히 쳐 최소값의 결과를 만들어야 한다.
2. 어떻게 구해야 할까?
- 주어진 문자열에서 부호, 숫자를 적절히 파싱한다.
- 더하기, 빼기 연산만 있는 식에서 결과값을 최소화 하기 위해 어떤 부분에 괄호를 쳐야 할 지 고려해본다.
-> 빼는 수를 크게 할 수록 결과값이 작아지므로 뺄셈 부호와 뺄셈 부호 사이의 식에 괄호를 쳐주면 된다.
-> 이는 조금 더 나아가면 첫 뺄셈 부호를 만나기 이전의 값들은 모두 더하고, 그 이후의 값들은 모두 빼주면 된다는 결론에 도달한다.
- 문자열을 쭉 읽어나가며 부호를 만났을 때 부호 앞쪽 문자열을 Integer로 파싱
- 해당 숫자가 더해지는 숫자인지, 빼지는 숫자인지 판단 후 이에 맞는 ArrayList에 add
🐕🦺 소스 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
List<Integer> plus = new ArrayList<>();
List<Integer> minus = new ArrayList<>();
// start : 숫자 파싱에 사용할 인덱스 값
int start = 0;
List<Integer> target = plus;
for (int i = 1; i < input.length(); i++) {
// '+' 부호를 만났다면
if (input.charAt(i) == '+') {
// 숫자를 파싱한 후 target 리스트에 저장
target.add(Integer.parseInt(input.substring(start, i)));
// start 인덱스 값 갱신
start = i + 1;
}
// '-' 부호를 만났다면
else if (input.charAt(i) == '-') {
// 숫자를 파싱한 후 target 리스트에 저장
target.add(Integer.parseInt(input.substring(start, i)));
// start 인덱스 값 갱신
start = i + 1;
// 기존의 target 리스트가 plus였다면 minus로 변경
// 이는 첫번째 '-' 부호를 만난 이후 다음의 값들은 모두 빼줘야 한다는 결론과 부합
if (target == plus) {
target = minus;
}
}
}
// 가장 뒤에 위치한 숫자를 target 리스트에 저장
target.add(Integer.parseInt(input.substring(start, input.length())));
int answer = 0;
for (int i : plus) {
answer += i;
}
for (int i : minus) {
answer -= i;
}
System.out.print(answer);
}
}

🐖 Think
- 그리디 알고리즘 문제는 거의 풀어본 적 없어 사실 접근이 쉽지는 않았다.
- 정답을 도출하기 위한 조건들을 나열한 후, 각 조건에 부합되도록 코드를 작성하는 연습을 해봐야겠다.
반응형
'APS' 카테고리의 다른 글
[Javascript] BOJ_2263. 트리의 순회 (0) | 2024.10.22 |
---|---|
[Javascript] Algospot_JUMPGAME. 외발뛰기 (2) | 2024.10.04 |
[Javascript] BOJ_20055. 컨베이어 벨트 위의 로봇 (1) | 2023.12.30 |
[Javascript] BOJ_14500. 테트로미노 (0) | 2023.12.18 |
[Javascript] BOJ_17144. 미세먼지 안녕! (0) | 2023.12.18 |