Algorithm_Test

sw 1940. 가랏! RC카! (자바)

산타는 뽀미 2023. 8. 6. 13:03

[문제]

RC (Radio Control) 카의 이동거리를 계산하려고 한다.
입력으로 매 초마다 아래와 같은 command 가 정수로 주어진다.

0 : 현재 속도 유지.
1 : 가속
2 : 감속

위 command 중, 가속(1) 또는 감속(2) 의 경우 가속도의 값이 추가로 주어진다.
가속도의 단위는, m/s2 이며, 모두 양의 정수로 주어진다.
입력으로 주어진 N 개의 command 를 모두 수행했을 때, N 초 동안 이동한 거리를 계산하는 프로그램을 작성하라.
RC 카의 초기 속도는 0 m/s 이다.

[예제]

아래 예제 입력에서 정답은 3 이 된다.
입력         시간     RC 카의 속도 RC     카의 이동거리
1 2          1 sec          2 m/s                    2 m
2 1          2 sec          1 m/s                    3 m


[제약사항]

1. N은 2이상 30이하의 정수이다. (2 ≤ N ≤ 30)
2. 가속도의 값은 1 m/s2 혹은 2 m/s2 이다.
3. 현재 속도보다 감속할 속도가 더 클 경우, 속도는 0 m/s 가 된다.


[입력]

입력은 첫 줄에 총 테스트 케이스의 개수 T, 다음 줄부터 각 테스트 케이스가 주어진다.
테스트 케이스 첫 줄에는 Command 의 수 N이 주어지고, 둘째 줄부터, 매 줄마다 각각의 Command가 주어진다.


[출력]

테스트 케이스 t에 대한 결과는 “#t”을 찍고, 한 칸 띄고, 정답을 출력한다.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)



[문제 푸는 과정]

문제가 이해가 잘 안 되는데...?
아하! command 는 0 또는 1(가속) 또는 2(감속)로 시작하고 그 오른쪽에는 그래서 얼마나 가속할건지 얼마나 감속할건지가 적히는구나!!
초기 속도가 0이고
1 2 이렇게 입력된건 2만큼 가속 하라는 뜻이니까 그럼 속도 2로 1초동안 가라는 소리
2 1 이렇게 입력된건 1만큼 감속 하라는 뜻이니까 그럼 속도 1로 1초동안 가라는 소리구나! 그래서 총 3m 가는 거구나!!

1 1 -> 속도 1로 1초동안 : 총 1m
0   -> 속도 1로 1초동안 : 1m -> 총 2m
1 1 -> 속도 2로 1초동안 : 2m -> 총 4m!!

1 2 -> 속도 2로 : 총 2m
1 2 -> 속도 4로 : 총 6m
2 1 -> 속도 3으로 : 총 9m
0   -> 속도 3으로 : 총 12m
0   -> 속도 3으로 : 총 15m

이렇게 계산하라는 소리!!!
이렇게 계산하고, 각 테스트 케이스가 몇번째 인지와 총 이동거리가 몇인지 출력하면 된다.
그럼 
#1 3
#2 4
#3 15...
이런 식으로 출력하면 된다!!

1. 일단 가장 첫번째 정수 T를 받아들여 걔만큼 반복하면 된다. ex) 10이라고 입력되면 테스트 케이스 10개인 것.
2. 테스트 케이스 첫 줄에 Command 의 수 N을 받아들이고 또 걔만큼 거리 계산을 반복한다 ex) 2라고 입력되면 거리 계산을 2번 한다.
3. 그 밑에 있는 command 수를 받아들인다. sc.nextInt()로 한줄에 두개 적힌 숫자를 띄어쓰기로 구분해서 받아들인다.
4. 초기 속도 speed 는 0이라고 놓고, command의 왼쪽 숫자가 1이면 오른쪽 숫자만큼 speed에 더해주고
command의 왼쪽 숫자가 2이면 오른쪽 숫자만큼 speed에서 빼준다. 그러면 현재 속도가 구해지고,
그 상태로 1초동안 이동할 것이므로 그 속도와 이동거리는 똑같다.
5. 초기 이동거리도 0이라고 놓고 이동거리 계산되면 계속 그만큼 더해주면 된다.
6. N번 반복하고 남은 마지막 이동거리가 그 테스트 케이스의 총 이동거리이다.
7. 몇번째 테스트 케이스인지, 그리고 총 이동거리가 뭔지 출력한다.

18분 58초 걸림.


[코드로 옮기기]

첫번째 제출 결과 : fail
왜일까??? 제약사항에 있는 '현재 속도보다 감속할 속도가 더 클 경우, 속도는 0 m/s 가 된다.' 이 조건을 고려를 안 했네??
즉 속도가 음수가 되는 경우를 제거하라는 거니까
그렇게 계산한 속도가 0보다 작을경우에는 그냥 속도를 0으로 하겠다고 코드를 짜줬다.

[첫번째로 패스한 코드]

import java.util.Scanner;

public class Solution {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		// 테스트 케이스는 총 T개 일 것이다.
		
		for(int i = 0; i < T; i++) {
			int N = sc.nextInt();
			// Command 갯수는 총 N개이다.
			
			int speed = 0;
			// 초기 속도는 0이다.
			
			int distance = 0;
			// 초기 이동거리도 0이다.
			
			for(int j = 0; j< N; j++) {
				
				int p_or_m = sc.nextInt();
				// 가속인지 감속인지 구분
				
				if(p_or_m != 0) {
					// 0이면 다음 숫자 없음. 가속/감속이면 얼만큼 할건지 뒤에 숫자 있음
					int how_much = sc.nextInt();
					
					if(p_or_m == 1) {
						speed = speed + how_much;
						// 가속이면 뒤 숫자만큼 속도 커짐
					} else if(p_or_m == 2) {
						speed = speed - how_much;
						// 감속이면 뒤 숫자만큼 속도 작아짐
						if(speed < 0) {
							// 그렇게 계산을 했는데 속도가 마이너스가 될 경우
							// 그냥 속도 0으로 계산
							speed = 0;
						}
					}
				}
				distance = distance + speed;
				// 이전 command까지 이동했던 거리에 새롭게 이동한 거리 추가해주기
				// 1초동안 이동하는 거라 speed가 곧 이동거리를 의미
			}
			System.out.printf("#%d %d\n", i+1, distance);
		}
	}
}


오오오오오!!!!! 성공했다!!

패스하는데 40분 걸림!!!


[문제 풀고 난 후]

다른 사람들은 어떻게 풀었나 봤는데 내 풀이랑 별반 다를 바 없었다. 초반에 문제 해석하는 어려움만 넘기면 딱히 어려운 점 없는 문제같다. 코드 조금 수정한 건 speed = speed - how_much 이렇게 안 하고 speed -= how_much 이런 식으로 연산 조금 줄여준 것밖에 없다!!

암튼 머 재밌는 문제였당