Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- BFS
- 백준 14501
- EditorInfo
- dfs
- 약수 구하기
- 최단경로
- 2501
- 오르막수
- 완전탐색
- 조합
- hilt
- 스카이라인 쉬운거
- 자바
- imeOptions
- 지능형 기차2
- BuildConfig
- Android
- 백준 퇴사
- 순수함수
- EditText
- Parcelable
- 백준
- Kotlin
- 순열
- 시뮬레이션
- Parcelize
- 프로그래머스
- val
- java
- SWEA
Archives
- Today
- Total
안드 공부를 해볼까?
[Java] 백준 연산자 끼워넣기 본문
728x90
1. 문제 분석
주어진 숫자에 연산자를 넣는 문제다.
연산자의 개수는 주어진 숫자 - 1 만큼 주어지므로 순열을 통해 연산자의 집합을 구하면 된다.
2. 구현
import java.util.*;
import java.io.*;
public class Solution {
static int size;
static int[] numArr;
static ArrayList<Character> operList = new ArrayList<>();
static int max = Integer.MIN_VALUE;
static int min = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
size = Integer.parseInt(br.readLine());
numArr = new int[size];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < size; i++) {
numArr[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
for (int i = 0; i < 4; i++) {
int operSize = Integer.parseInt(st.nextToken());
for (int j = 0; j < operSize; j++) {
switch (i) {
case 0: {
operList.add('+');
break;
}
case 1: {
operList.add('-');
break;
}
case 2: {
operList.add('*');
break;
}
default: {
operList.add('/');
break;
}
}
}
}
int operSize = operList.size();
perm(new char[operSize], new boolean[operSize], operSize, operSize, 0);
System.out.println(max);
System.out.println(min);
}
static void perm(char[] output, boolean[] visited, int n, int r, int depth) {
if (r == depth) {
calc(output);
return;
}
for (int i = 0; i < n; i++) {
if (!visited[i]) {
visited[i] = true;
output[depth] = operList.get(i);
perm(output, visited, n, r, depth + 1);
visited[i] = false;
output[depth] = 0;
}
}
}
static void calc(char[] operArr) {
int answer = numArr[0];
for(int i = 1; i<size; i++) {
switch(operArr[i-1]) {
case '+':{
answer += numArr[i];
break;
}
case '-':{
answer -= numArr[i];
break;
}
case '*':{
answer *= numArr[i];
break;
}
case '/':{
answer /= numArr[i];
break;
}
}
}
max = Math.max(max, answer);
min = Math.min(min, answer);
}
}
switch가 많아서 그렇지 제일 중요한 부분은 perm이다.
백트래킹을 통해서 순열을 구했고 연산자 배열이 다 나오면 계산을 해주었다.
3. 마무리
싸피 알고리즘 시간에 풀었던 문제라고 생각했는데 아닌가보다.
중복순열?을 사용해야하나 싶어서 일단 순열로 돌려보자 했는데 시간초과도 안나오고 바로 통과됐다.
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[Java] 백준 세 친구 (0) | 2022.12.23 |
---|---|
[Java] 백준 최단경로 (0) | 2022.12.21 |
[Java] 백준 인구 이동 (0) | 2022.10.13 |
[Java] 백준 보물섬 (0) | 2022.10.10 |
[Java] 백준 빙산 (0) | 2022.10.09 |
Comments