문제 정보
핵심
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
함수를 사용하여 lcur
과 rcur
(두 지점을 포함) 사용하여 최종 결과를 구해줄 수 있었다
배열이 R(뒤집기) 상태일 수도 있기 때문에 isReverse
변수를 검사하여 뒤집기 상태인 경우 거꾸로 출력해 주었다
고찰
골드5 문제였는데 생각보다 쉽게 풀이할 수 있었던 것 같다
비슷한 유형의 문제들을 여럿 풀어 보니, 풀이법이 쉽게 생각나는 것 같다
마지막 출력부분이 좀 불필요하게 긴 감이 있는것 같아 찾아보니
numList = numList[start:end]
if isReverse: numList.reverse()
print("[" + ','.join(numList) + "]")
다음과 같이 내 풀이처럼 list[start:end]
를 사용하여 아예 배열의 구간을 지정해주고, reverse
인 경우 배열 자체를 .reverse
() 해준 후
join
함수를 사용하여 이를 간결하게 표현해 주었다
참고
댓글