[BAEKJOON] 백준 18311: 왕복 (C#)

2024. 9. 2. 17:41IT/BaekJoon

문제 링크

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

 

 

문제

왕복 달리기 선수는 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일 때, 지나고 있는 코스의 번호를 출력한다.

 

 

 

통과한 답안

namespace _18311
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string[] inputs = Console.ReadLine().Split(' ');
            int N = int.Parse(inputs[0]);
            long K = long.Parse(inputs[1]);
            int[] courses = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();

            long fullcourse = courses.Sum();

            if (K < fullcourse)
            {
                for (int i = 0; i < courses.Length; i++)
                {
                    if (K < courses[i])
                    {
                        Console.WriteLine(i + 1);
                        break;
                    }
                    
                    K -= courses[i];
                }
            }
            else
            {
                K -= fullcourse;
                for (int i = courses.Length - 1; i >= 0; i--)
                {
                    if (K < courses[i])
                    {
                        Console.WriteLine(i + 1);
                        break;
                    }

                    K -= courses[i];
                }
            }
        }
    }
}

 

코스의 개수 N, 현재 이동한 거리 K, 각 코스의 길이가 주어졌을 때,

현재 어떤 코스에 있는지를 찾는 문제이다.

이 문제의 특징은 왕복으로 현재 목표 지점(모든 코스 길이의 합)으로 가는 도중인지,

목표 지점에서 출발점으로 오는 도중인지를 판단하는게 필요한 문제이다.

 

입력값들을 받은 후에 총 코스의 길이를 구하여 현재 이동 방향을 구한다.

목표 지점으로 가는 도중이라면 1번 코스부터 N번 코스까지 중 어느 코스에 있는지를,

돌아오는 도중이라면 N번 코스부터 1번 코스까지 중 어느 코스에 있는지 확인하도록

for 문을 2가지 방식으로 나누어서 구현할 수 있다.