본문 바로가기
개발/SWEA (D2) 문제 풀이

SW Expert Academy - 1940. 가랏! RC카!(D2)

by v너굴이v 2022. 11. 13.

출처 - https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5PjMgaALgDFAUq&categoryId=AV5PjMgaALgDFAUq&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=2&pageSize=10&pageIndex=3

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

<나의 풀이>

물리적인 접근을 해야 하는 문제인지 의문이 들었다.

우선 입출력을 세팅하는 것이 국룰이다.

T = int(input())
for i in range(1,T+1):
    N = int(input())

T는 테스트 케이스의 수를 의미하고

N은 입력으로 주어지는 command의 수를 의미한다.

또한 1초에 1개의 command를 실행하기 때문에 총시간을 의미하기도 한다.

이때 0은 현재 속도 유지, 1은 가속, 2는 감속을 의미하고 모두 양의 정수로 주어진다고 한다.

초기 속도는 0으로 설정하는 것도 잊지말자.

따라서 초기속도와 위치를 나타내는 변수를 선언할 필요가 있다.

T = int(input())
for i in range(1,T+1):
    N = int(input())
    v = 0
    l = 0

문제에서 제시한 예제를 대입하면서 풀어보자.

N = 2이고 1 2 / 2 1 이 입력된다면 어떻게 될까?

먼저 2초 동안 진행이 되는데, 

1초 때 1(가속) 2(속도) 이므로 v=2가 되고 l도 2가 된다.

2초 때 2(감속) 1(속도) 이르모 v=1이 되고 l은 3이 된다.

 

다음 예제도 대입해보자

N = 3이고 1 1 / 0 / 1 1 이 입력되었다.

3초 동안 진행되는데, 시작점이 0이라고 하면

1초 때 1(가속) 1(속도) 이므로 v=1 , l=1

2초 때 0(현재 속도 유지)이므로 v=1, l=2

3초 때 1(가속) 1(속도) 이므로 v=2 , l=4

이런 식으로 풀이를 하면 되겠다.

 

우선 N 다음에 들어오는 입력값들을 조건으로 하여 연산할 수 있는 구조가 필요하다.

for j in range(N):
    command = input().split()

이러면 command라는 리스트[0]에 커맨드를, 리스트[1]에 변화되는 속도를 저장할 수 있다.

이제 커맨드가 0일 때, 1일 때, 2일 때로 나눠보자.

먼저 커맨드가 0일 경우 현재 속도를 유지하기 때문에 v = v가 되고,

거리의 경우 현재 속도 v만큼 더해주기 때문에 이렇게 작성할 수 있다.

if command[0] == '0':
    v = v
    l += v

다음으로 커맨드가 1일 경우 커맨드에 입력된 수만큼 가속(+)해줘야 하고,

거리는 마찬가지로 속도(v)만큼 증가한다.

elif command[0] == '1':
    v += int(command[1])
    l += v

마지막으로 커맨드가 2일 경우(else) 커맨드에 입력된 수만큼 감속(-)해줘야 하는데,

이때 현재 속도보다 감속할 속도가 더 클 경우에는 속도는 0으로 고정해준다.

따라서 거리(l)는 변화가 없다.

그 외 현재 속도보다 감속할 속도가 작을 경우(else) 속도에서 커맨드에 입력된 수만큼 감속을 해준다.

따라서 속도는 감소하고 거리는 마찬가지로 속도(v)만큼 증가한다.

else:
    if int(command[1]) > v:
       v = 0
       l = l
    else:
        v -= int(command[1])
        l += v

이를 정리하여 최종적으로 작성하면 다음과 같다.

T = int(input())
for i in range(1,T+1):
    N = int(input())
    v = 0
    l = 0
    for j in range(N):
        command = input().split()
        if command[0] == '0':
            v = v
            l += v
        elif command[0] == '1':
            v += int(command[1])
            l += v
        else:
            if int(command[1]) > v:
                v = 0
                l = l
        else:
            v -= int(command[1])
            l += v
    print('#{} {}'.format(i,l))

문제가 상당히 복잡해 보였지만 예제를 대입해서 방법을 찾아보니 비교적 쉽게 풀 수 있었다.

확실히 D1보다 문제 수준이 높아졌음을 많이 느낀다...

더 힘 내보자!

댓글