https://www.acmicpc.net/problem/7490

 

7490번: 0 만들기

각 테스트 케이스에 대해 ASCII 순서에 따라 결과가 0이 되는 모든 수식을 출력한다. 각 테스트 케이스의 결과는 한 줄을 띄워 구분한다.

www.acmicpc.net

코드설명

완전탐색, 문자열 ( stringtokenizer ) 을 활용하는 문제입니다.

 

문제에서 기억해야할점들

  1. StringTokenizer 사용을 통하여 계산식의 값들을 "+", "-" 로 나눕니다. StringTokenizer를 활용하여 손쉽게 문자열을 나눌 수 있습니다.
//1+2+3+4+56+7
//"1", "+", "2", "+" ... 이렇게 tokenizer true값을 설정하여 delim 값도 포함시킵니다.
StringTokenizer numberAndOperation = new StringTokenizer(calculateOperation, "+|-",true);
while(numberAndOperation.hasMoreTokens()) {
    String a = numberAndOperation.nextToken();
    if( a.equals("+")) {
        int b = Integer.parseInt(numberAndOperation.nextToken()); //처음 숫자는 더하고시작 
        sum += b; 
    }else if( a.equals("-")) {
        int b = Integer.parseInt(numberAndOperation.nextToken()); //처음 숫자는 더하고시작 
        sum -= b; 
    }
}

 

 

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
	public static int T, N;
	public static int[] arr;
	public static int answer = Integer.MAX_VALUE;
    public static void main(String[] args) throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringTokenizer st = new StringTokenizer(br.readLine());
    	
    	T = Integer.parseInt(st.nextToken());
    	for(int t=0;t<T;t++) {
    		st = new StringTokenizer(br.readLine());
    		N = Integer.parseInt(st.nextToken());
    		simulate(2, 1, new StringBuilder("1"));
    		System.out.println();
    	}
  
    }
    
    public static void simulate(int idx, int cnt, StringBuilder sb) {
    	
    	if(cnt == N ) {
    		String calculateOperation = sb.toString().replaceAll(" ", "");
    		
    		//1+2+3+4+56+7
    		//"1", "+", "2", "+" ... 이렇게 tokenizer true값을 설정하여 delim 값도 포함시킵니다.
    		StringTokenizer numberAndOperation = new StringTokenizer(calculateOperation, "+|-",true); 
    		int sum = Integer.parseInt(numberAndOperation.nextToken()); //처음 숫자는 더하고시작
    		while(numberAndOperation.hasMoreTokens()) {
    			String a = numberAndOperation.nextToken();
    			if( a.equals("+")) {
    				int b = Integer.parseInt(numberAndOperation.nextToken()); //처음 숫자는 더하고시작 
    				sum += b; 
    			}else if( a.equals("-")) {
    				int b = Integer.parseInt(numberAndOperation.nextToken()); //처음 숫자는 더하고시작 
    				sum -= b; 
    			}
    		}
    		
    		if( sum == 0) {
    			System.out.println(sb.toString());
    		}
    		return ;
    	}
    	
    	for(int i=idx;i<=N;i++) {
    		// 공백일시 (아스키코드 순서에 따라)
    		simulate(i+1, cnt + 1, new StringBuilder(sb).append(" ").append(i));    	
    		
    		// "+" 일시
    		simulate(i+1, cnt + 1, new StringBuilder(sb).append("+").append(i));
    		
    		// "-" 일시
    		simulate(i+1, cnt + 1, new StringBuilder(sb).append("-").append(i));
    		
    	}
    	
    }

}

+ Recent posts