뽀미의 개발노트

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

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 이런 식으로 연산 조금 줄여준 것밖에 없다!!

암튼 머 재밌는 문제였당

'Algorithm_Test' 카테고리의 다른 글

sw 2005. 파스칼의 삼각형 (자바)  (0) 2023.08.11
sw 1961. 숫자 배열 회전 (자바)  (1) 2023.08.11
sw 1989. 초심자의 회문검사 (자바)  (0) 2023.08.04
백준 10250 ACM 호텔  (1) 2023.03.15
백준 2292 벌집  (1) 2023.03.15