Problem_Solving

백준(BOJ) 16561 : 3의 배수 (자바, JAVA)

CONCAT 2023. 12. 24. 12:22
728x90
 

16561번: 3의 배수

윤영이는 3의 배수 마니아이다. 그는 모든 자연수를 3개의 3의 배수의 자연수로 분해하는 것을 취미로 가지고 있다. 문득 그는 자신에게 주어진 수를 3개의 3의 배수로 분리하는 경우의 수가 몇

www.acmicpc.net

설계

  • 3의 배수인 자연수를 3개의 3의 배수로 나누는 문제
  • 주어진 자연수를 n, 3개의 수를 각각 i, j, k라고 할 때,
    • i와 j가 정해지면 k는 따라서 정해짐, 고로 k는 n-i-j
    • 3의 배수 3개로 나눠진다면...
      • i는 최소 3부터 최대 n-6의 범위를 갖게 됨 (j와 k의 최소치인 3씩을 남겨둬야 함)
      • j는 최소 3부터 최대 n-3-i의 범위를 갖게 됨 (i를 제외하고도 k의 최소치인 3을 남겨둬야 함)
    • i와 j가 for문의 조건을 충족시킨다면 3의 배수로 구성된 3개의 숫자로 n이 존재한다고 할 수 있음

구현

코드

// package boj16561; // Java 17 이후 실행 시 package 필수

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt(); // 입력으로 정수 n을 받습니다.
        int cnt = 0; // 가능한 조합의 수를 저장할 변수입니다.

        // 3으로 시작해서 n - 6까지 3씩 증가하는 i 루프입니다.
        for (int i = 3; i <= n - 6; i += 3) {
            // 3으로 시작해서 n - 3 - i까지 3씩 증가하는 j 루프입니다.
            for (int j = 3; j <= n - 3 - i; j += 3) {
                // i, j, n - i - j가 3의 배수이면 조합으로 카운트합니다.
                cnt++;
            }
        }

        // 가능한 조합의 수를 출력합니다.
        System.out.println(cnt);
        scanner.close(); // 스캐너를 닫습니다.
    }
}