알고리즘/백준

백준 18429 - 근손실

2024. 4. 16. 21:28
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 256 MB 5060 3209 2691 63.065%

문제

웨이트 트레이닝을 좋아하는 어떤 대학원생은, 현재 3대 운동 중량 500의 괴력을 소유하고 있다. 다만, 하루가 지날 때마다 중량이 K만큼 감소한다. 예를 들어 K=4일 때, 3일이 지나면 중량이 488로 감소하게 된다. 따라서 운동을 하지 않고, 가만히 있다면 매일매일 중량이 감소할 뿐이다.

다행히도 이 대학원생은 N개의 서로 다른 운동 키트를 가지고 있다. 이 대학원생은 하루에 1개씩의 키트를 사용하며, 매일 어떤 키트를 사용할 지는 마음대로 결정할 수 있다. 운동 키트들은 각각의 중량 증가량을 가지고 있으며, 사용할 때마다 즉시 중량이 증가하게 된다. 이 때 몇몇 운동 키트들의 중량 증가량이 같을 수 있으나, 서로 다른 운동 키트로 간주한다. 각각의 운동 키트는 N일 동안 한 번씩만 사용할 수 있다.

대학원생은 운동 기간동안 항상 중량이 500 이상으로 유지가 되도록 N일간의 운동 플랜을 세우고자 한다. 1일차부터 N일차까지의 모든 기간동안, 어떤 시점에서라도 중량이 500보다 작아지지 않도록 해야 한다.

예를 들어 N=3, K=4일 때, 각 운동 키트의 중량 증가량이 다음과 같다고 가정하자.

 

이 때 1번, 3번, 2번 순서대로 운동 키트를 적용한다고 해보자. 이 경우 운동 1일차에 대학원생은 중량이 3만큼 증가하지만 그와 동시에 하루에 중량이 4만큼 감소하기 때문에, 1일이 지난 이후에 중량은 499가 된다. 따라서 조건을 만족하지 못한다.

반면에 3번, 1번, 2번 순서대로 운동 키트를 적용한다고 해보자. 그러면 1일차부터 운동을 모두 마친 날까지의 모든 시점에 대하여 항상 중량이 500이상이 된다.

N개의 운동 키트에 대한 정보가 주어졌을 때, N일간 하루에 1개씩의 운동 키트를 사용하는 모든 경우 중에서, 운동 기간동안 항상 중량이 500 이상이 되도록 하는 경우의 수를 출력하는 프로그램을 작성하시오.

위 예시에서는 모든 경우 중에서 총 4가지 경우가 조건을 만족한다.

 

입력

첫째 줄에 자연수 N과 K가 공백을 기준으로 구분되어 주어진다. (1 ≤ N ≤ 8, 1 ≤ K ≤ 50) 둘째 줄에 각 운동 키트의 중량 증가량 A가 공백을 기준으로 구분되어 주어진다. (1 ≤ A ≤ 50)

출력

N일 동안 N개의 운동 키트를 사용하는 모든 경우 중에서, 운동 기간동안 항상 중량이 500 이상이 되도록 하는 경우의 수를 출력한다.

예제 입력 1 복사

3 4
3 7 5

예제 출력 1 복사

4

 

풀이

1. 순열로 어떤 운동 키트를 몇번째 순서에 사용할 건지 배열로 뽑는다.

2. N만큼 반복하는 반복문에 배열을 활용해서 500 아래로 떨어지면 그냥 return, 안떨어진다면 반복문이 끝까지 동작한다.

3. 반복문 끝까지 도달하면 cnt++로 해당 경우는 근손실이 없는 루틴으로 간주한다.

package BOJ;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class BJ_18429_근손실 {
    static int N;
    static int K;
    static int[] arr;
    static int[] result;
    static boolean[] visited;
    static int cnt;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());
        arr = new int[N];
        result = new int[N];
        visited = new boolean[N];
        st = new StringTokenizer(br.readLine());
        for(int i=0; i<N; i++)
        {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        perm(0);
        System.out.println(cnt);
    }

    public static void perm(int index)
    {
        if (index == N) {
            int weight = 500;
            for(int i=0; i<N; i++)
            {
                weight += result[i]-K;
                if(weight<500)
                {
                    return;
                }
            }
            cnt++;
            return;
        }
        // 순열
        for (int i = 0; i < N; i++) {
            if (!visited[i]) {
                result[index] = arr[i];
                visited[i] = true;
                perm(index+1);
                visited[i] = false;
            }
        }
    }
}
저작자표시 비영리 변경금지 (새창열림)

'알고리즘 > 백준' 카테고리의 다른 글

백준 11501 - 주식 (Java)  (1) 2024.04.22
백준 2607 - 비슷한 단어 (Java)  (1) 2024.04.21
백준 14940 - 쉬운 최단거리 Java  (0) 2024.04.15
백준 17484 - 진우의 달 여행 (Small)  (0) 2024.04.14
백준 9251 - LCS Java  (0) 2023.07.11
'알고리즘/백준' 카테고리의 다른 글
  • 백준 11501 - 주식 (Java)
  • 백준 2607 - 비슷한 단어 (Java)
  • 백준 14940 - 쉬운 최단거리 Java
  • 백준 17484 - 진우의 달 여행 (Small)
D_Helloper
D_Helloper
안녕_개발
D_Helloper
Hello_Develop
D_Helloper
전체
오늘
어제
  • 분류 전체보기 (116)
    • CS (23)
      • 네트워크 (16)
      • 운영체제 (6)
    • 알고리즘 (48)
      • 백준 (39)
      • 프로그래머스 (7)
      • SWEA (1)
    • DB (6)
      • SQLD (2)
      • DataBase (4)
    • JAVA (13)
    • ETC (16)
    • 일상 (5)
    • Develop (4)
      • Docker (1)
      • TIL (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Contact

인기 글

태그

  • Internet 5계층
  • TCP/IP 5계층
  • restful
  • REST
  • http method
  • REST API
  • OSI 계층
  • HTTP 메소드
  • 네트워크 계층
  • CRUD
  • HTTP 상태코드
  • OSI 7계층
  • HTTP

최근 댓글

최근 글

hELLO · Designed By 정상우.
D_Helloper
백준 18429 - 근손실
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.