Algorithm/CodingTest

[Baekjoon] 1173번 운동 (Java)

누구세연 2023. 11. 12. 20:57

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

 

1173번: 운동

첫째 줄에 다섯 정수 N, m, M, T, R이 주어진다.

www.acmicpc.net

 

운동이라는 문제를 Java로 풀이하겠습니다.

이 문제는 영식이가 운동을 하는데 걸리는 최소 시간을 계산하는 문제입니다.

각 분에 대해서 영식이가 운동을 선택하는 경우와 휴식을 선택하는 경우를 고려하여 최소 시간을 계산합니다.

 

문제에서 주어진 입력 값은 아래와 같습니다.

  • N :  운동하려는 총 시간
  • m : 초기 맥박
  • M : 최대 맥박
  • T : 운동으로 증가하는 맥박
  • R : 휴식으로 감소하는 맥박

초기에 영식의 맥박은 m이며, 매 분마다 운동을 선택하면 T만큼 맥박이 증가하고, 휴식을 선택하면 R만큼 맥박이 감소합니다.

단, 맥박은 m 이상이어야 하며 최대 맥박 M을 넘어가면 안 됩니다.

 

저는 다음과 같이 풀이하였습니다.

import java.util.Scanner;

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

        int N = scanner.nextInt();  // 운동을 하는 총 시간
        int m = scanner.nextInt();  // 초기 맥박
        int M = scanner.nextInt();  // 최대 맥박
        int T = scanner.nextInt();  // 운동으로 증가하는 맥박
        int R = scanner.nextInt();  // 휴식으로 감소하는 맥박

        int time = 0;  // 운동에 필요한 총 시간
        int currentHeartRate = m;  // 현재 맥박 초기화

        while (N > 0) {
            // 운동을 할 수 있는 경우
            if (currentHeartRate + T <= M) {
                currentHeartRate += T;  // 맥박 증가
                N--;  // 운동 시간 감소
                time++;  // 총 시간 증가
            } else {
                // 휴식으로 맥박 감소
                currentHeartRate = Math.max(currentHeartRate - R, m);
                time++;  // 총 시간 증가

                // 운동을 할 수 없는 경우
                if (currentHeartRate == m && currentHeartRate + T > M) {
                    time = -1;
                    break;
                }
            }
        }

        System.out.println(time);
    }
}

제 풀이에서는 각 분에 대해서 다음과 같은 로직을 반복하였습니다.

  1.  현재 맥박에 운동을 선택하는 경우 맥박이 T만큼 증가하고, 운동 시간 N과 총시간을 나타내는 변수 time 감소합니다.
  2.  만약 운동으로 증가한 맥박이 최대 맥박 M을 넘어가면, 휴식으로 맥박을 R만큼 감소시킵니다.
    단, 맥박은 초기 맥박 m 보다 낮아지면 안 되므로 Math.max 함수를 사용합니다.
  3.  운동을 할 수 없는 경우(N분 동안 운동을 할 수 없는 경우)에는 time을 -1로 설정하고 반복문을 종료합니다.

이러한 과정을 통해 최종적으로 time에는 운동을 하는데 필요한 최소 시간이 저장됩니다.

 

 

 

이견이 있으시다면 자유롭게 댓글 남겨주세요.