[알고리즘] __**주사위 놀이하는 함수**__

package org.example.알고리즘.주사위놀이하는함수;

import java.io.*;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * packageName    : org.example.알고리즘.주사위놀이하는함수
 * fileName       : Main
 * author         : ipeac
 * date           : 2023-09-22
 * description    :
 * ===========================================================
 * DATE              AUTHOR             NOTE
 * -----------------------------------------------------------
 * 2023-09-22        ipeac       최초 생성
 */
public class Main {
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static int n;
    public static void main(String[] args) {
        try (
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        ) {
            n = Integer.parseInt(br.readLine());
            Number[] numbers = new Number[n];
            backTracking(n, 1,numbers);
            bw.flush();
            bw.close();
        } catch (Exception e) {
            e.printStackTrace();
            
        } finally {
        
        }
    }
    
    public static void backTracking(int cnt, int start,Number[] numbers) {
        Objects.requireNonNull(numbers, "numbers must not be null");
        try {
            if (cnt == 0) {
                String joined = joined(numbers);
                bw.write(joined);
                bw.newLine();   // 줄바꿈
                return;
            }
            
            for (int i = start; i <= 6; i++) {
                numbers[n - cnt] = new Number(i);
                backTracking(cnt - 1, i,numbers);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        
    }
    
    private static String joined(Number[] numbers) {
        return Arrays.stream(numbers)
            .map(number -> String.valueOf(number.value))
            .collect(Collectors.joining("-"));
    }
    
    public static class Number {
        int value;
        
        public Number(int value) {
            if (!(value >= 1 && value <= 6)) {
                String errMsg = MessageFormat.format("주사위의 값은 1~6 사이의 값이어야 합니다. 입력값: {0}", value);
                throw new IllegalArgumentException(errMsg);
            }
            this.value = value;
        }
        
        @Override
        public String toString() {
            return String.valueOf(value);
        }
    }
    
}
  • 기본적인 백트래킹 문제이다.
  1. Number 클래스는
    • 단순히 주사위의 숫자값을 제한하기 위한 용도
  1. backTracking 함수
    • 주사위를 굴리는 모든 가능한 조합을 탐색
  1. joined
    • Number 배열의 값을 “-” delimeter 로 출력하기 위함

  • 주사위를 n 번 굴리는 경우
    • 만약 주사위를 굴렸다면 cnt == 0
      • 해당 조합의 경우를 출력
    • cnt==0 이 아니라면, 주사위를 시작점부터 6까지 숫자의 모든 값을 설정
    • 나머지 주사위 조합을 재귀적으로 탐색


Uploaded by N2T

'자바 > 알고리즘' 카테고리의 다른 글

[알고리즘] 두 스티커  (0) 2023.09.24
[알고리즘] 생태학  (0) 2023.09.24
[알고리즘] 회전하는큐  (0) 2023.09.12
[알고리즘] four squares  (0) 2023.09.10
[알고리즘]병사 배치하기  (0) 2023.09.01