코딩테스트/Programmers

[Programmers] 입문) 공 던지기

HONGGG 2023. 7. 5. 19:36

 

이번 문제는 가장 먼저 순환 링크드 리스트가 생각났다.

순차적으로 이동하며 중간 수를 띄어넘는 문제이기에 굳이 자료형을 만들지 않고 한칸씩 넘기기만 해도 되는 것으로 생각하기도 했다.

 

그런데 배열과 k의 연관성을 보다보니 뭔가 규칙성이 눈에 보였다.

바로 배열의 크기와 건너뛰는 횟수 사이에 상관관계가 있는 것이다.

 

  1. 건너뛰는 횟수는 총 횟수의 2배만큼 거리를 이동한다.
    • 크기가 4인 배열에서 3번을 건너뛰게 되면 2, 0, 2순으로 뛰게된다.
    • 이때 뛰어넘는 값은 배열이 아닌 단일 이동거리로 보면 2, 4, 6이된다.
      • 이로써 이동거리는 2가 된다.
    • 최종 이동거리는 (3 * 2) = 6이된다.
  2. 우리가 찾는 값은 마지막 이동거리 직전 값이기에 최종 증가값에서  제외한다.
  3. 이제 정답의 이동거리를 확보하였으니 배열의 만큼 나머지 연산을한다.
  4. 나머지연산으로 나온 값이 정답 위치가 된다.

 

using System;

public class Solution {
    public int solution(int[] numbers, int k) => numbers[(k * 2 - 2) % numbers.Length];
}

 

난이도는 쉽지만 생각하는 방법에 따라 속도차이와 코드의 퀄리티가 많이 달라질 것 같은 문제였다.

역시 반복되는 규칙이 있고 이를 거스르는 예외사항이 없다면 그에 대한 방정식이 존재하는 것 같다.

 

덤으로 문제 난이도가 쉬워서인지 테스트가 47번까지 있는 것도 신기하긴 했다.