이 문제 포스팅을 작성한 이유 키워드: Integer Parse / 약간의 동적 계획법
‼️이 문제의 정답 코드는 맨 마지막(Github Gist)에 있습니다. 중간중간의 코드들은 제 생각을 담은 일대기를 작성하였습니다.
첫번째 생각
맨 처음에 이 문제를 보고 든 생각은, 어떻게 빼는 수를 크게 할까? 였다.
괄호를 넣어서 '-' 부분을 극대화→식을 java 라이브러리로 계산하는 방법
을 생각하여 다음과 같이 코드를 작성하게 되었다.
import java.util.*;
import java.io.*;
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String ss = br.readLine();
StringBuilder s = new StringBuilder(ss); //기존의 식
StringBuilder s2 = new StringBuilder(ss); //괄호를 포함한 식
int mode = 0;
for(int i=0;i<s.length();i++) {
//mode 1일 때: - 부분이 존재할 때
//mode 0일 때: - 부분이 존재하지 않을 때
if(s.charAt(i)=='-' & mode==0) {
mode =1;
s2.insert(i+1, "(");
}else if(s.charAt(i)=='-' & mode==1) {
s2.insert(i+1, ")");
}else if(mode == 1 & i==s.length()-1) {
s2.append(")");
}
}
System.out.println(s2.toString());
}
}
하지만, java로 식을 계산하는 마땅한 라이브러리가 없었다. →그래서 포기
그래서 java 라이브러리 말고 직접 숫자를 읽어서 푸는 방법도 생각하였지만
- 문제의 본질을 해친다는 생각
- 1000자리 숫자는 어떻게 감당할 수 있을까..
하는 생각이 들어서 아예 다른 방법으로 접근하기로 생각했다.
두번째 생각
'-'를 기준으로 식을 분리한다는 문제의 본질에 맞추어 split을 통해 문장을 분리하고, 각각의 분리된 string에서 +를 따로 분리하여 작성하는 방법을 생각했다. 이를 바탕으로 코드를 작성하였다.
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().split("\\-");
**int res = Integer.parseInt(s[0]);**
for(int i =1;i<s.length;i++) {
int sum=0;
String[] add = s[i].split("\\+");
for(int l=0;l<add.length;l++) {
sum += Integer.parseInt(add[l]);
}
res -= sum;
}
System.out.println(res);
}
}
하지만, 계속해서 런타임 에러가 난다고 나왔고, 이에 split되어 계산되는 부분에 이상함을 느꼈다. 오류는 처음에 int res를 정의할 때 나타남을 감지하고 최종 코드를 작성하였다. 이와 더불어 클린 코드를 위해 함수를 따로 빼서 작성하였다.
이와 같이 작성되었을 때, 맞았다.
맞히고 나서 보니,
- 기준으로 나뉘어 분리된 작은 문제들을 해결하는 면에서 동적 계획법을 생각해볼 수 있었고,
- String → Integer Parse 부분에서의 대응법/처리 방법에 관해 한 층 더 깊게 생각해볼 수 있었다.
'Coding > Basic' 카테고리의 다른 글
[Pytorch] permute/transpose/view/reshape/flatten/squeeze (0) | 2022.11.12 |
---|---|
[백준] 1463번: 1로 만들기(JAVA) (0) | 2021.01.28 |
[운영체제] 전체 기본 개념 정리 (2) | 2020.07.03 |
[Algorithms] Sorting정렬 한꺼번에 살펴보기 (0) | 2019.11.08 |
[백준] 10773번: 제로 (0) | 2019.10.03 |