알고리즘/Python

백준 알고리즘 5430번: AC (Python)

두넌 2023. 6. 13.

문제 정보


 

 

5430번: AC

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

www.acmicpc.net

 

 

핵심


R(뒤집기) 와 D(버리기) 함수를 사용자가 입력한 순서대로 수행 후 배열의 결과 출력하기

여기서 R 작업을 수행할 때 배열을 직접 reverse 하는 건 절대 안된다고 생각,, (엄청나게 비효율적임)

나는 cur 변수를 사용하여 현재 커서의 위치를 표현하고, lcur(left cur), rcur(right cur) 을 사용하여 뒤집지 않은 상태에서의 D(버리기) 작업과 뒤집은 상태에서의 D 작업을 다음과 같이 수행하였다

if isReverse:
	rcur -= 1
else:
	lcur += 1

R(뒤집기) 작업은 단지 isReverse 변수를 True/False로 전환해 주며 수행할 수 있었다

 

풀이


import sys
T = int(sys.stdin.readline().strip())
for _ in range(T):
    p = sys.stdin.readline().strip()
    n = int(sys.stdin.readline())
    c = sys.stdin.readline()[1:-2]
    x = c.split(',') if c else ''
    lcur = 0
    rcur = len(x)-1
    isReverse = False
    isError = False
    cur = 0
    for com in p:
        if com == 'R':
            isReverse = not isReverse
        elif com == 'D':
            if lcur > rcur:
                isError = True
                break
            else:
                if isReverse:
                    rcur -= 1
                else:
                    lcur += 1
    if isError:
        print('error')
    else:
        if not isReverse:
            print('[', end='')
            print(','.join(x[i] for i in range(lcur, rcur+1, 1)), end='')
            print(']')
        else:
            print('[', end='')
            print(','.join(x[i] for i in range(rcur, lcur-1, -1)), end='')
            print(']')

 

코드가 좀 긴데, 사실 별거 없었던 것 같다

D(버리기) 작업에서 배열이 비어있을 때에는 error 을 출력해 주어야 했기 때문에 적절한 isError 변수를 활용하여 출력해줄 수 있었다.

출력 부분에서는 join 함수를 사용하여 lcurrcur(두 지점을 포함) 사용하여 최종 결과를 구해줄 수 있었다

배열이 R(뒤집기) 상태일 수도 있기 때문에 isReverse 변수를 검사하여 뒤집기 상태인 경우 거꾸로 출력해 주었다

 

고찰


골드5 문제였는데 생각보다 쉽게 풀이할 수 있었던 것 같다

비슷한 유형의 문제들을 여럿 풀어 보니, 풀이법이 쉽게 생각나는 것 같다

마지막 출력부분이 좀 불필요하게 긴 감이 있는것 같아 찾아보니

    numList = numList[start:end]
    if isReverse: numList.reverse()
    print("[" + ','.join(numList) + "]")

다음과 같이 내 풀이처럼 list[start:end] 를 사용하여 아예 배열의 구간을 지정해주고, reverse인 경우 배열 자체를 .reverse() 해준 후

join 함수를 사용하여 이를 간결하게 표현해 주었다

 

참고


 

 

GitHub - dduneon/CodingTestPy

Contribute to dduneon/CodingTestPy development by creating an account on GitHub.

github.com

 

댓글