티스토리 뷰
Dessert (Dessert.cpp)
문제
농부 존은 소들의 저녁식사 줄 세우는 새로운 방법을 개발 했다. N(1~15)마리의 소들을 순서대로 세 워놓은 후, 각 소들 사이에 +, - , . 셋 중 1가지가 써져있는 냅킨을 배치해서 최종 결과가 0 이 되게 해야 하는 것이다. 점(.)이 써져있는 냅킨을 통해 더 큰 수를 만들 수 있게 된다. 아래와 같은 경우를 보자. (ps .이 써져있는 냅킨은 '공백'이라고 생각하면 된다.)
1-2.3-4.5+6.7
이와 같은 배치는 1-23-45+67 을 나타낸다. 결과는 0 이다. 10.11은 1011 로 해석된다.
입력
첫 째 줄에는 소들의 수 N이 입력된다.
출력
처음 20줄에 대해 가능한 20가지 답을 출력하는데, 사전 순으로 앞선 것을 출력한다. 순서는 +가 가장 앞서고 -와 . 이 순서대로 뒤따른다. 답이 20개 미만이면 가능한 답을 각 숫자와 문자 사이에 공백을 두고 출력한다. 모두 출력한다. 마지막 줄에는 가능한 답의 총 가지수를 출력한다.
예제 입력
7
예제 출력
1 + 2 - 3 + 4 - 5 - 6 + 7
1 + 2 - 3 - 4 + 5 + 6 - 7
1 - 2 + 3 + 4 - 5 + 6 - 7
1 - 2 - 3 - 4 - 5 + 6 + 7
1 - 2 . 3 + 4 + 5 + 6 + 7
1 - 2 . 3 - 4 . 5 + 6 . 7
6
코드
//소들의 줄
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Queue;
import java.util.Scanner;
public class Main {
public static ArrayList<String[]> box = new ArrayList<>();
public static String[] zz = {"1", "-", "2" ,".","3", "+", "4", "+", "5", "+", "6", "+", "7" };
public static int count = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//총 몇개의 숫자를 입력 받을 것인지
int a;
int b = 1;
int c = 0;
a = sc.nextInt();
String[] x = new String[(2*a)-1];
for(int i = 0 ; i < x.length ; i = i+2) {
x[i] = String.valueOf(b);
b++;
}
dessert(x,0,a-1);
System.out.println(count);
}
public static void dessert(String[] input,int a, int max) {
if(a == max) {
if(operationSum(input) == 0) {
count++;
if(count <= 20)printString(input);
}
}else {
input[(2*a)+1] = "+";
dessert(input,a+1,max);
input[(2*a)+1] = "-";
dessert(input,a+1,max);
input[(2*a)+1] = ".";
dessert(input,a+1,max);
}
}
public static void printString(String[] input) {
for(int i = 0 ; i < input.length; i++) {
System.out.print(input[i]+" ");
}
System.out.println("");
}
public static String[] deepcopy(String[] input) {
String[] result = new String[input.length];
for(int i = 0 ; i < input.length; i++) {
result[i] = input[i];
}
return result;
}
public static int operationSum(String[] in) {
//ex 1 + 2 - 3 + 4 - 5 - 6 + 7
int sum = 0;
int plus = 0;
String operation = "+";
String[] input = deepcopy(in);
// 처리
for(int i = 0; i < input.length; i++) {
String z = input[i];
if(z.equals(".")) {
int a = Integer.parseInt(input[i-1]);
input[i-1] = "0";
if(Integer.parseInt(input[i+1]) < 10) {
input[i+1] = String.valueOf(a*10 + Integer.parseInt(input[i+1]));
}else {
input[i+1] = String.valueOf(a*100 + Integer.parseInt(input[i+1]));
}
input[i] = operation;
}else if(z.equals("+") || z.equals("-")) {
operation = z;
}
}
operation = "+";
for(int i = 0; i < input.length; i++) {
String z = input[i];
switch (z) {
case "+" :
operation = z;
break;
case "-" :
operation = z;
break;
default:
plus = Integer.parseInt(z);
if(operation.equals("+")) sum = sum+plus;
else if(operation.equals("-")) sum = sum-plus;
}
}
return sum;
}
}
'알고리즘 문제 풀이 ' 카테고리의 다른 글
깊이우선탐색 / 너비우선탐색 (0) | 2018.09.27 |
---|---|
부등호 (0) | 2018.09.20 |
좋은 수열 찾기 (0) | 2018.09.18 |
이진 트리 순회 (0) | 2018.09.18 |
달팽이 그리기 (0) | 2018.09.17 |
자연수의 합 / Division (0) | 2018.09.17 |
단지번호 붙이기 (0) | 2018.09.17 |
백준 스택 수열 1874번 (0) | 2018.07.03 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- react
- 한글 자동 완성
- Game
- 알고리즘
- Terminal
- webpack
- java #퀵소트 #quicksort #알고리즘 #백준
- java #백준 #알고리즘 #로또 #6603
- 백준 #알고리즘 #전깃줄 #NodeJs #javascript
- 쿼드트리
- java #하노이 #알고리즘 #백준
- javascript #백준 #알고리즘 #LCS
- TypeScript
- 색종이자르기
- Javascript
- java #백준 #알고리즘 #2805 #나무자르기
- 1992번
- 중간거리 #야만나 #약속장소추천 #중간위치 #웹 #리액트 #React #reactjs #kakao지도 #kakaoapi
- webspider
- javascript #백준 #회의실배정 #알고리즘
- java #오르막수 #백준 #알고리즘
- javascript #연속합 #알고리즘 #백준
- npm
- 2630번
- 백준 #java #알고리즘
- java #알고리즘 #백준 #퇴사
- 백준
- java #알고리즘 #백준 #N과M #백트래킹
- java #알고리즘 #백준
- java #알고리즘 #백준 #패션왕신해빈
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함