알고리즘/PS - SWEA

[SWEA 4008 - Java] 숫자 만들기

excited-hyun 2021. 10. 22. 21:15
반응형
 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

풀이

완전 탐색을 통해서 전부 확인하여 풀이가능한 문제입니다. 저는 재귀를 이용해서 완전탐색을 구현했습니다.

 

  1. 연산자를 차례로 하나씩 추가하면서 재귀를 호출합니다
  2. N-1개 모두 추가한 후엔 해당 수식을 통해 나오는 값을 계산합니다.
  3. 계산한 값을 가지고 최대 최소를 업데이트합니다.
  4. 최댓값과 최솟값의 차를 출력합니다.

 

import java.util.Scanner;

public class Solution {

	static int N;
	static int answer, minN, maxN;
	static int[] operator, numbers, makeSik;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int T = sc.nextInt();
		for(int tc = 1; tc<=T; tc++) {
			minN = 100000000;
			maxN = -100000000;

			N = sc.nextInt();
			operator = new int[4];
			numbers = new int[N];
			makeSik = new int[N-1];

			for(int i=0; i<4; i++) {
				operator[i] = sc.nextInt();
			}

			for(int i=0; i<N; i++) {
				numbers[i] = sc.nextInt();
			}

			checkAll(0);

			answer = maxN-minN;
			System.out.println("#"+tc+" "+answer);
		}

	}
	static void checkAll(int idx) {
		
		// 연산자 추가 완료!
		if(idx == N-1) {
			calcNum();
		}

		for(int i=0; i<4; i++) {
			// 해당 연산자 이미 다 사용함 
			if(operator[i] == 0)
				continue;

			operator[i]--;
			makeSik[idx] = i;
			checkAll(idx+1);
			operator[i]++;
		}
		
		
	}

	static void calcNum() {
		int num = numbers[0];
		for(int i=0; i<N-1; i++) {
			// +
			if(makeSik[i] == 0) {
				num+=numbers[i+1];
			}
			// -
			else if(makeSik[i] == 1) {
				num-=numbers[i+1];
			}
			// *
			else if(makeSik[i] == 2) {
				num*=numbers[i+1];
			}
			// /
			else if(makeSik[i] == 3) {
				num/=numbers[i+1];
			}
		}
		if(num > maxN)
			maxN = num;
		if (num < minN)
			minN = num;
		
	}

}
728x90
반응형

'알고리즘 > PS - SWEA' 카테고리의 다른 글

[SWEA 2105 - Java] 디저트카페  (0) 2021.10.22
[SWEA 5656 - Java] 벽돌 깨기  (0) 2021.10.19
[SWEA 5658 - Java] 보물상자 비밀번호  (0) 2021.10.19
[SWEA 5644 - Java] 무선 충전  (0) 2021.10.18
[SWEA 4012 - Java] 요리사  (0) 2021.10.15