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

코드설명

브루트포스(BruteForce, 완전탐색) 알고리즘입니다.

 

문제풀면서 생각났던점들은, 

아래의 재귀들은 모두 For문으로 처리가 가능합니다.

그래도 재귀형식으로 푸는 것이 더 깔끔하고, 코드가 더 줄어들기에 재귀형식으로 풀었습니다.

코드

package Main;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.StringTokenizer;

public class Main {
    private static int N, T, M;
    private static int answer = 0;
    private static int[] arr;
    private static int standard = 0;
    public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		//평균값을 구하고, 그 값과 가장 가까운값.
		arr = new int[4];
		for(int i=0;i<4;i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}

		standard = clockNumber(new ArrayList<Integer>(), arr, 0, 0);;
		
		ArrayList<Integer> tempArr = new ArrayList<Integer>();
		for(int i=1;i<4; i++) {
			tempArr.clear();
			standard = Math.min(standard, clockNumber(tempArr, arr, 0, i));
		}
		
		comb(0);
		System.out.println(answer + 1);
		
	}
    
    private static HashSet<Integer> hashset = new HashSet<Integer>();
    private static int[] comb = new int[4];
    private static void comb(int level) {
    	if(level == 4) {
    		int standardClock = clockNumber(new ArrayList<Integer>(), comb, 0, 0);
    		for(int i=1; i<4; i++) {
    			standardClock = Math.min(standardClock, clockNumber(new ArrayList<Integer>(), comb, 0, i));	
    		}
    		
    		if(hashset.contains(standardClock) == false && standardClock < standard) {
    			answer += 1;
    			hashset.add(standardClock);
    		}
    		
    		return ;
    	}
    	for(int i=1; i<=9; i++) {
    		comb[level] = i;
    		comb(level + 1);
    	}
    }
    
    public static int clockNumber(ArrayList<Integer> target, int[] num, int level, int idx) {
    	if(level == 4) {
    		return convertToInt(target);
    	}
    	
    	target.add(num[idx++]);
    	if(idx == 4) {
    		idx = 0;
    	}
    	return clockNumber(target, num, level + 1, idx);
    }
    
    private static int convertToInt(ArrayList<Integer> target) {
    	int digit = 3;
		int num = 0;
		for(int v : target) {
			num += v * Math.pow(10, digit--);
		}
		return num;
    }
    
}

 

+ Recent posts