728x90

백준 18311 - 왕복

시간 제한 1초, 메모리 제한 256MB

# 조건

  • 왕복 달리기 선수는 N개의 이어진 일직선상의 코스들을 모두 지나 끝까지 도달한 뒤에, 다시 출발 지점으로 돌아와야 한다.
  • 전체 코스들을 지나고 있는 상황에서 이동 거리가 K일 때, 현재 지나고 있는 코스의 번호를 출력하는 프로그램을 작성하시오.
    • 단, 이동 거리가 K가 두 코스 사이에 위치한 경우에는 ‘지나야 할’ 코스의 번호를 출력한다.
  • 예를 들어 N=5일 때, 각 코스의 길이가 차례대로 7, 4, 2, 4, 5라고 가정하자.
    • 출발 지점을 0이라고 하면, 전체 코스가 구성된 형태를 다음과 같이 그릴 수 있다.

  1. K=0일 때, 1번 코스를 지나고 있으므로 1을 출력한다.
  2. K=7일 때, 2번 코스를 지나고 있으므로 2를 출력한다.
  3. K=9일 때, 2번 코스를 지나고 있으므로 2를 출력한다.
  4. K=12일 때, 3번 코스를 지나고 있으므로 3을 출력한다.
  5. K=28일 때, 이는 끝까지 도달한 뒤에 시작 위치로 돌아오는 과정으로 볼 수 있다. 4번 코스를 지나고 있으므로 4를 출력한다.
    • 또한 K는 항상 왕복 거리보다 작은 양의 정수 혹은 0으로 주어진다.
      • 예를 들어 위와 같이 전체 코스들의 길이 합을 22라고 하면, 0≤K≤43이다.

입력

  • 첫째 줄에 정수 N, K가 공백을 기준으로 구분되어 주어진다. (1≤N≤100,000)
  • 단, K는 항상 왕복 거리보다 작은 양의 정수 혹은 0으로 주어진다.
  • 둘째 줄에 1번부터 N번까지 각 코스의 길이가 공백을 기준으로 구분되어 차례대로 주어진다.
  • 각 코스의 길이는 50,000보다 작거나 같은 자연수다.

출력

  • 첫째 줄에 이동 거리가 K일 때, 지나고 있는 코스의 번호를 출력한다.

# 접근 방법

  • 주어진 K가 전체 코스 길이의 합보다 작다면 앞에서부터 각 코스를 지나면서 - 코스 길이를 해준다.
    • 이 때 최초로 K가 음수가 되는 지점이 지나고 있는 코스이다.
  • 만약 크거나 같다면, 전체 코스 길이만큼 빼준 후 뒤에서부터 위의 로직을 실행해준다.
  • 주의할 점은, 0이 되는 순간 => 두 코스 사이에 존재한다면 지나야 할 코스를 출력해야 하므로 K가 0이하가 아닌 음수가 되는 곳이 지나고 있는 코스이다.
import sys  
sys.stdin = open('input.txt')  
input = sys.stdin.readline  

N, K = map(int, input().split())  
nums = [*map(int, input().split())]  
total = sum(nums)  
flag = True  
if K >= total:  
    K -= total  
    flag = False  
if flag:  
    for i in range(N):  
        K -= nums[i]  
        if K < 0:  
            print(i+1)  
            break  
else:  
    for i in range(N-1, -1, -1):  
        K -= nums[i]  
        if K < 0:  
            print(i+1)  
            break
728x90