문제
규현이는 멍청하다. 왜냐하면, 1~10까지 수 밖에 모르기 때문이다. 어느 날 규현이 옆을 지나가던 태석이가 규현이를 보고 이렇게 외쳤다. "빵빵!!" 규현이는 "아하!" 하면서 세상에는 빵이란 수도 있구나 했다. 그날 이후로 규현이는 매일 친구들을 볼 때면 "빵빵!!" 거리면서 인사를 했다. 규현이의 친구 중에는 태방이가 있다. 자꾸 규현이가 "빵빵!!" 거릴때 마다 자신을 놀리는 것 처럼 생각했던 태방이는 규현이에게 그건 "빵이 아니고 영이야" 라고 가르쳐 줬다.
이제 규현이는 0~10까지 수를 알고 있다. 어느 날 자신이 알고 있는 숫자를 까먹지 않으려고 종이에 1~10까지 수를 썻다. (0은 잠시 까먹었다) 규현이의 친구 석원이는 밀덕이다. 계급을 엄청나게 좋아해서, 규현이가 써 놓은 숫자에 이등병 마크인 -를 모두 그렸다. 석원이는 규현이에게 이렇게 말했다. "너, 우리 위대하신 미하엘 칼라시니코프께서 뭐라고 했는지 알아? 단순함과 신뢰성, 그리고 저렴한 가격이 최고야!"
규현이는 그 말을 듣고서 아하 세상에는 음수도 있구나 했다.
이제 규현이가 아는 수는 -10부터 10까지 20개가 되었다. 아차, 0을 빼먹었구나, 21개가 되었다.
근처 사파리에 놀러간 규현이는 사파리 가이드 승환이와 함께 관광을 시작했다. "저기, 사자 1마리가 보이죠? 그 옆이 그 사자 부인이에요. 그러니깐, 1 더하기 1은 2죠" 규현이는 덧셈을 익혔다. "저 사자는 아까 그 사자의 자식 2마리 입니다. 그럼 총 사자는 몇 마리이지요?" 이제 규현이는 1+1을 제외한 다른 덧셈도 할 수 있다. 만세!
인도네시아에 놀러간 규현이는 자바 섬에 방문했다. 자바 섬에는 자바 커피를 재배하는 홍태석 농부가 있었다. 홍태석은 "ㅋㅋㅋ 님 음수와 양수와 0의 차이도 모름?" 하면서 음수와 양수와 0을 설명해주었다.
지금까지 배운 것을 종합해서, 한국으로 돌아오는 비행기에서 규현이는 종이에 수를 N개 썼다. (규현이가 아는 가장 큰 수는 10이기 때문에, 수를 10개까지만 쓸 수 있다.) 그 다음에, 가능한 모든 N*(N+1)/2개의 구간의 합을 구했다. 이 것을 해인이는 행렬로 표현했다.
규현이가 쓴 수를 A라고 하면, A[i]는 규현이가 i번째 쓴 수이다. 그리고, S[i][j]는 A[i]부터 A[j]까지 합이 0보다 크면 +, 0이면 0, 0보다 작으면 -이다. 여기서 i는 항상 j보다 작거나 같다. 이렇게 배열을 채우면 배열에는 총 N*(N+1)/2개의 문자가 있다. (+, -, 0 중 하나) 이 S 배열이 주어졌을 때, 규현이가 쓴 N개의 수 A를 구해서 출력하면 된다. 규현이는 -10부터 10까지의 정수밖에 모르기 때문에, A도 -10부터 10까지의 정수로만 이루어져 있어야 한다.
입력
첫째 줄에 수열의 크기 N이 주어진다. N은 10보다 작거나 같은 자연수이다. 둘째 줄에는 N(N+1)/2 길이의 문자열이 주어진다. 처음 N개의 문자는 부호 배열의 첫 번째 줄에 해당하고, 다음 N-1개의 문자는 두 번째 줄에 해당한다. 마찬가지로 마지막 문자는 N번째 줄에 해당하는 문자다.
출력
첫째 줄에 수열의 원소 N개를 빈 칸을 사이에 두고 출력한다. 답이 여러 가지 일 경우에는 아무거나 출력하면 된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.security.Principal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class baekjoon1248_2 {
private static int n;
private static String s;
private static Character[] info;
private static int[] indexInfo;
private static List<Integer> res;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
s = br.readLine();
info = new Character[n];
indexInfo = new int[n];
res = new ArrayList<>();
int targetIndex = 0;
int nextTarget = n;
for (int i = 0; i < n; i++) {
info[i] = s.charAt(targetIndex);
indexInfo[i] = targetIndex;
targetIndex += nextTarget;
nextTarget--;
}
nextPermutation(0);
}
private static void nextPermutation(int index) {
if (index == n) {
if (check()) {
for (int i : res) {
System.out.print(i + " ");
}
System.exit(0);
}
return;
}
for (int i = 1; i < 11; i++) {
if (info[index] == '+') {
res.add(i);
if (check()) {
nextPermutation(index + 1);
}
res.remove(res.size() - 1);
} else if (info[index] == '-') {
res.add(-i);
if (check()) {
nextPermutation(index + 1);
}
res.remove(res.size() - 1);
} else {
res.add(0);
if (check()) {
nextPermutation(index + 1);
}
res.remove(res.size() - 1);
}
}
}
private static boolean check() {
for (int i = 0; i < res.size(); i++) {
for (int j = i; j < res.size(); j++) {
if (!check2(i, j, indexInfo[i] + j - i)) {
return false;
}
}
}
return true;
}
private static boolean check2(int start, int end, int infoIndex) {
int infoSum = 0;
for (int i = start; i < end + 1; i++) {
infoSum += res.get(i);
}
if (infoSum > 0 && s.charAt(infoIndex) == '+') {
return true;
}
if (infoSum < 0 && s.charAt(infoIndex) == '-') {
return true;
}
if (infoSum == 0 && s.charAt(infoIndex) == '0') {
return true;
}
return false;
}
}
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static char[][] qAry;
static int[] resAry;
static int num;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
num = sc.nextInt();
resAry = new int[num];
qAry = new char[num][num];
String q = sc.next();
int count = 0;
for (int i = 0; i < num; i++) {
for (int j = i; j < num; j++) {
qAry[i][j] = q.charAt(count);
count++;
}
}
permutation(0);
}
static Boolean check(int index) {
int temp = 0;
for (int i = index; i >= 0; i--) {
temp += resAry[i];
if (qAry[i][index] == '0') {
if (temp != 0) {
return false;
}
} else if (qAry[i][index] == '+') {
if (temp <= 0) {
return false;
}
} else if (qAry[i][index] == '-') {
if (temp >= 0) {
return false;
}
}
}
return true;
}
static void permutation(int index) {
if (index == num) {
// toDo 완결 조건 마무리 하기
for (int i = 0; i < num; i++) {
System.out.print(resAry[i] + " ");
}
System.out.println();
System.exit(0);
}
for (int i = -10; i <= 10; i++) {
resAry[index] = i;
if (check(index)) {
permutation(index + 1);
}
}
}
}
'알고리즘 > 초급1' 카테고리의 다른 글
[JAVA] 백준 1182번: 부분수열의 합 ( 2-33 ) (0) | 2021.10.05 |
---|---|
[JAVA] 백준 11723번: 집합 ( 2-32 ) (0) | 2021.10.05 |
[JAVA] 백준 2529번: 부등호 ( 초급 2-30 ) (0) | 2021.10.01 |
[JAVA] 백준 15661번: 링크와 스타트 ( 초급 2-29 ) (0) | 2021.10.01 |
[JAVA] 백준 14889번: 스타트와 링크 ( 초급 2-28 ) - hard (0) | 2021.09.30 |