BOJ 2505두 번 뒤집기Python

가나다·2023년 8월 11일
0

알고리즘

목록 보기
10/14

문제



링크:https://www.acmicpc.net/problem/2505

접근

문제에서 요구하는 정답인 수열이 1~N이므로 반복문을 통해 입력받은 수열 1~N, N~1을 순회한다
이때 수열 a[i-1]의 값이 1~N을 만족하는 수가 아닐 경우 i의 인덱스를 찾아서 현재 위치에서
부터 찾은 i의 인덱스까지 뒤집어준다
위의 과정을 반복하며 뒤집은 구간 i, j를 저장하고 1~N을 만족하기 위해 2번 이상 뒤집어야 한다면
정답이 아니므로 반복문을 종료한다
위의 과정을 다시 역순으로 순회하여 출력을 하는데
문제 조건이 무조건 2번을 출력해야 한다
입력:
5
1 2 3 4 5
출력:
1 1
1 1
이런 식으로 입력이 되어도 [i, j]의 구간을 두 번 뒤집어 1~5의 수열을 만들어야 한다
문제에서 구간[i, i]를 뒤집어도 된다 했으니 2번 미만의 구간을 뒤집어 1~N의 수열을
만들 수 있으면 두 번 뒤집었을 때 1~N을 만족하는 아무 구간을 출력해 주면 된다

코드

import sys
input = sys.stdin.readline
n = int(input())
list1 = list(map(int,input().split()))
list2 = list(list1)

check1 = []
check2 = []
for x in range(1,n+1):
    idx = list1[x-1]
    if len(check1) > 2:
        break
    if x != idx:
        idx = list1.index(x)
        start,end = x-1,idx+1
        list1[start:end] = reversed(list1[start:end])
        check1.append([x,idx+1])
for x in range(n,0,-1):
    idx = list2[x-1]
    if len(check2)  > 2:
        break
    if x != idx:
        idx = list2.index(x)
        start,end = idx,x
        list2[start:end] = reversed(list2[start:end])
        check2.append([idx+1,x])

if len(check2) == 2  or len(check1) == 2:
    if len(check2) == 2:
        for x in check2:
            print(*x)
    elif len(check1) == 2:
        for x in check1:
            print(*x)

elif len(check2) == 1  or len(check1) == 1:
    print(1,1)
    if len(check2) == 1:
        for x in check2:
            print(*x)
    elif len(check1) == 1:
        for x in check1:
            print(*x)
else:
    print(1,1)
    print(1,1)

결과

이 문제를 해결할 때 문제를 제대로 읽지 않아서
1~N을 만족하는 구간 n 개 출력
1~N을 만족하는 수열이 입력으로 주어지면 공백 출력 등등 어이없는 실수를 여러 번 했다...
문제를 자세히 읽는 습관을 들여야 하는 문제였던 것 같다

파이썬으로 정렬하면 3등으로 나왔다 뒤집는 구간이 적고 수열이 길지 않아서 빠르게 찾는 것 같다

profile
가나다

0개의 댓글