Doby's Lab

백준 13268번: 셔틀런 (Python) 본문

PS/BOJ

백준 13268번: 셔틀런 (Python)

도비(Doby) 2022. 7. 3. 19:51

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

 

13268번: 셔틀런

지훈이가 쓰러진 구간을 하나의 숫자로 출력한다. 시작점을 구간 0, 시작점부터 (시작점 미포함) 첫 번째 콘까지 (첫 번째 콘 포함) 구간을 1, 첫 번째 콘 (미포함) 부터 두 번째 콘까지 (포함) 구간

www.acmicpc.net


Solved By: Implementation

 

이번 문제는 여러모로 뿌듯하네요.

  1. 구현 문제이다 보니 생각할 부분들이 많아서 풀어낸 뒤 성취감
  2. Python으로 어려운 문제 풀어보기 성공

암튼 솔루션으로 넘어가 보겠습니다.

 

우선 자연수의 의미가 애매모호해서 0은 Exception으로 처리했습니다.

 

5m마다 콘이 있고, 20m까지 있어서 이동을 5m씩 해주는 게 좋지 않을까라는 생각을 했습니다. 1로 하면 시간문제에서 오래 걸릴까 염두가 났습니다.(물론 10000까지라서 크게 영향은 없을 듯합니다.)

 

1번째 콘으로 갔다가 오면 2번째 콘을 갔다 와야 하고, 이를 4번째 콘까지 반복하다가 끝나면 다시 1번째 콘부터 시작합니다.

이 점을 이용해서 while문에서 몇 번째 콘을 가야 하는지 알기 위해 t라는 변수에 모듈러 연산을 하여 알려주었습니다.

 

1) t번째 콘으로 갈 때

우선 갈 때의 경우를 보겠습니다.

5m씩 가면서(5를 빼주면서) n이 0보다 작거나 같으면 멈추고, 현재 구간이 어딘지 알기 위해 i + 1을 출력해주었습니다.

n이 0보다 작은 경우는 i + 1의 구간 사이에서 멈춘 것이고, 0과 같은 경우는 i + 1 구간의 끝점에서 멈춘 것과 같습니다.

 

그리고, 갈 때 멈출 수 있는 경우가 있기 때문에 flag 변수를 선언하여 갈 때 멈췄다고 알려주고, while문을 정지시킬 수 있게 해줍니다.

 

2) t번째 콘에서 돌아올 때

마찬가지로 5m씩 돌아오면서 0보다 작거나 같아지는 경우를 고려합니다.

+돌아올 때이므로 for문의 시작점과 끝점을 유의해야 합니다.

n이 0보다 작아지는 경우는 i + 1구간에서 멈췄다는 것으로 i + 1을 출력하고 멈춥니다.

n이 0과 같아지는 경우는 i + 1구간을 지나 i구간의 끝점에서 멈췄다는 것을 알고 있어야 합니다.

 

+

즉, 몇 번째 콘인지를 어떻게 아느냐와 갈 때와 돌아올 때의 케이스들에서 언제 멈추는지를 고려할 수 있다면 문제를 풀 수 있습니다.

확실히 구현 문제를 푸니 성취감이 꽤 있고, 코드에서 디테일한 부분을 요구하네요. 탑다운 기법에서 밑바닥까지 디테일을 볼 수 있는 능력을 키워야겠습니다.

n = int(input())
cnt = 0
flag = 1

if n == 0:
    print(0)

while n > 0:
    # t번째 콘
    t = cnt % 4 + 1
    
    # 갈 때
    for i in range(0, t):
        n -= 5
        if n <= 0:
            print(i + 1)
            flag = 0
            break
        
    # 갈 때 멈출 수 있기 때문에 돌아오는 case 제외
    if flag == 0:
        break
    
    # 돌아올 때
    for i in range(t - 1, -1, -1):    
        n -= 5
        if n < 0:
            print(i + 1)
            break
        elif n == 0:
            print(i)
            break
    
    cnt += 1

 

728x90