알고리즘/백준 문제풀이
백준 [자바 java] 14888번 : 연산자 끼워넣기
잔디🌿
2022. 8. 1. 15:48
이 문제는 숫자 사이사이에 주어진 연산자를 끼워 넣어 최댓값과 최솟값을 구하는 문제입니다. 특이한 점은 연산자 우선순위를 무시한다는 점이었습니다.
import java.io.*;
import java.util.*;
class Main {
static int cnt = 0;
static int[] k ;
static boolean[] visit;
static int[] po;
static int max = -1000000000;
static int min = 1000000000;
static int[] l ;
static void arr2() {
int i;
int hap = k[0];
for(i = 0; i<cnt ;i++) {
if(l[po[i]] == 1) {
hap+=k[i+1];
}
else if(l[po[i]] == 2) {
hap-=k[i+1];
}
else if(l[po[i]] == 3) {
hap*=k[i+1];
}
else if(l[po[i]] == 4) {
hap/=k[i+1];
}
}
max = Math.max(hap, max);
min = Math.min(hap, min);
}
static void arr(int i) {
for(int j = 0;j<cnt;j++) {
if(visit[j] == false) {
po[i] = j;
if(i == cnt-1) {
arr2();
}
else {
visit[j] = true;
arr(i+1);
visit[j] = false;
}
}
}
}
public static void main(String[] arg) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader (System.in));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
k = new int[n];
visit = new boolean[n];
po = new int[n];
int i;
for(i = 0;i<n;i++) {
k[i] = Integer.parseInt(st.nextToken());
}
l = new int[12];
int now;
int j;
st = new StringTokenizer(br.readLine());
for(i = 1;i<=4;i++) {
now = Integer.parseInt(st.nextToken());
for(j = 1;j<=now;j++) {
l[cnt] = i;
cnt++;
}
}
arr(0);
System.out.println(max);
System.out.println(min);
}
}
숫자, 연산자를 입력받고 연산자는 배열을 이용해서 가능한 경우의 수 만큼 배치해 주었습니다.
8핀 문제를 풀었던 경험을 바탕으로 풀었는데 이런 문제는 언제 봐도 헷갈립니다ㅜㅜ
처음에는 재귀함수로 풀면 오버플로우 날까 봐 걱정되었는데 예상외로 굉장히 빨리 돌아갔어요! 앞으로는 재귀는 쓰면 안 된다 라는 생각을 조금은 버려도 될 것 같아요.
실수 1.
i를 1부터 시작하기도 하고 0부터 시작하기도 해서 여기저기서 막 꼬여서 답이 이상하게 나왔었습니다.
실수 2.
max값을 0으로 했습니다ㅜㅜ 다른 문제는 거의 0부터 시작하니까 무의식적으로 0보다 작은 값은 안 나올 것이라고 생각했나 봐요 사실 -10억인데 말이죠
기억해야 할 것
최댓값, 최솟값 얼마인지 똑바로 보고 초기값 설정하기!
다른 사람 코드랑 다른 점
=-*/ 네 가지 배열을 두고 없애(?) 가면서 구한다.