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()
ps/problems/boj/20127.txt · 마지막으로 수정됨: 2023/08/28 08:48 저자 teferi
토론