일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- go middleware
- go 패닉
- git
- go 환경변수
- 골랑 고퍼
- go 맥
- go panic
- go 캐릭터
- go air 환경변수
- air 환경변수
- go 맥 air 환경변수
- gin logger
- go air
- 고루틴 채널
- go clean architecture
- 신입개발자
- gin middleware
- go recover
- 개발자
- 좀비고루틴
- clean architecture middleware
- gopath 환경변수
- gin recovery
- go
- go channel
- golang gopher
- go 대기그룹
- go디자인패턴
- go 맥 air
- go 마스코트
- Today
- Total
뽀미의 개발노트
sw 1940. 가랏! RC카! (자바) 본문
[문제]
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 |