반응형
1248번 맞춰봐
1. 이해하기
- 설명은 길게 되어 있지만 결국은 N개의 숫자를 선택하는 문제이다. 하지만 부호를 잘 맞춰야 하는 문제이다.
- 완전 탐색과 백트랙킹으로 풀 수 있다.
2. 구현하기
solve(index)
index를 N까지 진행해보며 N에 도달했다면 true를 반환한다.
0 ~ 20 부터 반복하면서 result배열에 하나씩 넣어본다. 이때 -10을 하고 넣어줘서 -10 ~ 10의 구간을 만들어준다.
이때 가장 중요한 것은 추가를 했을 때, 바로 가능한 경우인지를 비교해줘서 체크를 해야 시간 초과 등의 문제를 피할 수 있다.
static boolean solve(int index) { if(index == N) return true; for(int i = 0; i <= 20; i++) { result[index] = i-10; if(check(index) && solve(index+1)) return true; } return false; }
check(index)
현재까지 정한 수들이 결과가 맞게 나오는 수들인지 체크하는 함수이다.
부호들이 저장되어 있는 buho[][] 배열을 이용하여 i ~ index 까지의 부호가 맞게 설정이 되어 있는지를 비교한다.
static boolean check(int index) { int sum = 0; for(int i = index; i >= 0; i--) { sum += result[i]; if(buho[i][index] == 0 && sum != 0) return false; if(buho[i][index] < 0 && sum >= 0) return false; if(buho[i][index] > 0 && sum <= 0) return false; } return true; }
3. 전체코드
import java.util.Scanner;
public class Main {
static int N;
static String str;
static char[] cArr;
static int[][] buho;
static int[] result;
static int[] sum;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
sc.nextLine();
str = sc.nextLine();
result = new int[N];
buho = new int[N][N];
sum = new int[N+1];
int strIdx = 0;
for(int i = 0; i < N; i++) {
for(int j = i; j < N; j++) {
if(str.charAt((strIdx)) == '-')
buho[i][j] = -1;
else if(str.charAt(strIdx) == '0')
buho[i][j] = 0;
else if(str.charAt(strIdx) == '+')
buho[i][j] = 1;
strIdx++;
}
}
solve(0);
for(int i = 0; i < N; i++)
System.out.print(result[i]+" ");
sc.close();
}
static boolean solve(int index) {
if(index == N)
return true;
for(int i = 0; i <= 20; i++) {
result[index] = i-10;
if(check(index) && solve(index+1))
return true;
}
return false;
}
static boolean check(int index) {
int sum = 0;
for(int i = index; i >= 0; i--) {
sum += result[i];
if(buho[i][index] == 0 && sum != 0)
return false;
if(buho[i][index] < 0 && sum >= 0)
return false;
if(buho[i][index] > 0 && sum <= 0)
return false;
}
return true;
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 17471번 게리맨더링 (0) | 2020.02.13 |
---|---|
[백준] 2660번 회장뽑기 (0) | 2020.02.13 |
[백준] 1918번 후위표기식 (0) | 2020.02.11 |
[백준] 17070번 파이프 옮기기1 (0) | 2020.02.08 |
[백준] 16637번 괄호 추가하기 (0) | 2020.02.08 |