728x90
시간 제한 1초, 메모리 제한 256MB
# 조건
- 왕복 달리기 선수는 N개의 이어진 일직선상의 코스들을 모두 지나 끝까지 도달한 뒤에, 다시 출발 지점으로 돌아와야 한다.
- 전체 코스들을 지나고 있는 상황에서 이동 거리가 K일 때, 현재 지나고 있는 코스의 번호를 출력하는 프로그램을 작성하시오.
- 단, 이동 거리가 K가 두 코스 사이에 위치한 경우에는 ‘지나야 할’ 코스의 번호를 출력한다.
- 예를 들어 N=5일 때, 각 코스의 길이가 차례대로 7, 4, 2, 4, 5라고 가정하자.
- 출발 지점을 0이라고 하면, 전체 코스가 구성된 형태를 다음과 같이 그릴 수 있다.
- K=0일 때, 1번 코스를 지나고 있으므로 1을 출력한다.
- K=7일 때, 2번 코스를 지나고 있으므로 2를 출력한다.
- K=9일 때, 2번 코스를 지나고 있으므로 2를 출력한다.
- K=12일 때, 3번 코스를 지나고 있으므로 3을 출력한다.
- K=28일 때, 이는 끝까지 도달한 뒤에 시작 위치로 돌아오는 과정으로 볼 수 있다. 4번 코스를 지나고 있으므로 4를 출력한다.
- 또한 K는 항상 왕복 거리보다 작은 양의 정수 혹은 0으로 주어진다.
- 예를 들어 위와 같이 전체 코스들의 길이 합을 22라고 하면, 0≤K≤43이다.
- 또한 K는 항상 왕복 거리보다 작은 양의 정수 혹은 0으로 주어진다.
입력
- 첫째 줄에 정수 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
'ALGORITHM > 정렬, 탐색,구현' 카테고리의 다른 글
[백준 9342번] 파이썬 - 염색체 (0) | 2023.09.15 |
---|---|
[백준 19236번] 파이썬 - 청소년 상어 (0) | 2023.09.13 |
[백준 16926번] 파이썬 - 배열 돌리기1 (0) | 2023.09.08 |
[백준 22862번] 파이썬 - 가장 긴 짝수 연속한 부분 수열(Large) (0) | 2023.09.07 |
[백준 1254번] 파이썬 - 팰린드롬 만들기 (2) | 2023.09.06 |