사용자 도구

사이트 도구


ps:problems:boj:20127

Y-수열

ps
링크acmicpc.net/…
출처BOJ
문제 번호20127
문제명Y-수열
레벨골드 5
분류

애드혹

시간복잡도O(n)
인풋사이즈n<=1,000,000
사용한 언어Python 3.11
제출기록41148KB / 84ms
최고기록84ms
해결날짜2023/08/28

풀이

  • 풀이를 떠올리는 것은 간단하다.
  • 수열에서 감소하는 부분과 증가하는 부분이 모두 2곳 이상이라면 아무리 돌려도 증가수열이나 감소수열을 만들 수 없다.
  • 1군데에서만 감소하고 나머지는 모두 증가하거나 같다면, 감소하는 부분에서 수열을 나눠서 앞부분을 뒤로 이동시켜서 수열을 만들고, 그 수열이 증가수열이 되는지 확인하면 된다. 반대경우도 마찬가지.
  • 이것을 O(n)에 처리하는 풀이를 떠올리는 것은 간단하지만, 구현 방법에 따라서 엣지케이스 처리가 쉽지 않을수 있을것 같은 느낌이 들었다. 그래서 루프 한번에 처리하는것이 효율적이겠지만, 실수 방지를 위해서 증가수열을 만드는 방법과 감소수열을 만드는 방법을 따로 나누어서 계산하도록 구현했다

코드

"""Solution code for "BOJ 20127. Y-수열".

- Problem link: https://www.acmicpc.net/problem/20127
- Solution link: http://www.teferi.net/ps/problems/boj/20127

Tags: [ad hoc]
"""

INF = float('inf')


def main():
    N = int(input())
    a = [int(x) for x in input().split()]

    dec_inds = [i for i, x, y in zip(range(N), a, a[1:]) if x > y]
    if not dec_inds:
        print('0')
        return
    answer_to_nondec = (
        dec_inds[0] if len(dec_inds) == 1 and a[0] >= a[-1] else INF
    )

    inc_inds = [i for i, x, y in zip(range(N), a, a[1:]) if x < y]
    if not inc_inds:
        print('0')
        return
    answer_to_noninc = (
        inc_inds[0] if len(inc_inds) == 1 and a[0] <= a[-1] else INF
    )
    answer = min(answer_to_nondec, answer_to_noninc)

    print('-1' if answer == INF else answer + 1)


if __name__ == '__main__':
    main()

토론

댓글을 입력하세요:
E U D I O
 
ps/problems/boj/20127.txt · 마지막으로 수정됨: 2023/08/28 08:48 저자 teferi