AC
풀이
문제에서 원하는 바는 다음과 같다.
AC 정수 배열에 연산을 하기 위해 만든 언어
R 뒤집기와 D 버리기 가 있다.
R은 수의 순서를 뒤집음. D는 첫 번째 수를 버림
배열이 비어있는데 D를 사용하면 에러발생
그런데 문제에서 주는 값을 보면 주는 값이 애초에 리스트 형식의 문자열을 주기 때문에 이를 다시 리스트로 바꿔줄 필요가 있다.
그래서 그 과정을 추가하고, 또한 답을 출력할 때도, 리스트를 표방한 문자열을 제공해줘야 한다.
그래서 난 문제에서 원하는 바와 같이 풀기 위해 D함수와 R함수도 만들고 실행을 했다.
아래 코드로 실행을 했고, 시간 초과가 발생했다.
설령 시간 초과가 발생하지 않았더라도 틀렸을 것이다.
이유는 출력하는 값이 문자열이 아닌 리스트 형식으로 출력했기 때문이다.
[1,2,3,5,8]
위와 같은 식으로 출력되어야 하는데
[1, 2, 3, 5, 8]
위와 같은 방식으로 출력했기 때문이다.
import sys
def R(array):
return array[::-1]
def D(array):
if len(array) == 0:
return 'error'
else:
array.pop(0)
return array
def to_list(a):
array = []
a_len = len(a)
tmp = ''
for i in range(a_len):
if a[i] != ',' and a[i] != '[' and a[i] != ']':
tmp += a[i]
else:
if tmp != '':
array.append(int(tmp))
tmp=''
return array
T = int(sys.stdin.readline().strip())
for testcase in range(1, T+1):
p = list(sys.stdin.readline().strip())
n = int(sys.stdin.readline().strip())
# 리스트 이지만 str로 입력받게 되는 중
a = sys.stdin.readline().strip()
# 리스트화 해주기
a_list = to_list(a)
for func in p:
if func == 'R':
result = R(a_list)
elif func == 'D':
result = D(a_list)
if result == 'error':
break
else:
a_list = result
print(result)
그래서 우선 시간을 줄이는 방법과 답을 출력하는 방법 2가지를 모두 고쳤다.
난 여기서 R함수와 D함수를 제거하고 p를 순회하는 for문에서 작동하도록 했다.
R 시간을 줄이기 위해 리스트를 직접 뒤집지 않음
D 역행 여부로 pop(0), pop()을 실행
또한 출력에서는
if is_revers:
a_list.reverse()
print('[' + ','.join(map(str, a_list)) + ']')
이러한 방식을 이용해서 원하는 출력값으로 출력되도록 만들었다.
그렇게 만들어진 코드가 아래 코드이다.
import sys
def to_list(a):
array = []
a_len = len(a)
tmp = ''
for i in range(a_len):
if a[i] != ',' and a[i] != '[' and a[i] != ']':
tmp += a[i]
else:
if tmp != '':
array.append(int(tmp))
tmp=''
return array
T = int(sys.stdin.readline().strip())
for testcase in range(1, T+1):
p = list(sys.stdin.readline().strip())
n = int(sys.stdin.readline().strip())
# 리스트 이지만 str로 입력받게 되는 중
a = sys.stdin.readline().strip()
# 리스트화 해주기
a_list = to_list(a)
# 역행과 에러 확인
is_revers = False
error_occurred = False
for func in p:
# 역행시키기
if func == 'R':
is_revers = not is_revers
# 제외시키기
elif func == 'D':
if len(a_list) == 0:
error_occurred = True
break
else:
# 역행하면 제일 뒤에 값 제거
if is_revers:
a_list.pop()
# 순행하면 제일 앞에 값 제거
else:
a_list.pop(0)
pass
# 에러가 있으면
if error_occurred:
print('error')
# 에러가 없으면
else:
if is_revers:
a_list.reverse()
print('[' + ','.join(map(str, a_list)) + ']')
여기서 더 원한다면 시간을 더 줄일 수 있도록 front와 rear를 사용하면 되는데 그렇게 하진 않았다.
그리고 deque를 사용해 봤는데 deque를 사용하니 시간 속도가 확실히 빨라진 게 보였다.
import sys
from collections import deque
def to_list(a):
array = deque()
a_len = len(a)
tmp = ''
for i in range(a_len):
if a[i] != ',' and a[i] != '[' and a[i] != ']':
tmp += a[i]
else:
if tmp != '':
array.append(int(tmp))
tmp=''
return array
T = int(sys.stdin.readline().strip())
for testcase in range(1, T+1):
p = list(sys.stdin.readline().strip())
n = int(sys.stdin.readline().strip())
a = sys.stdin.readline().strip()
a_list = to_list(a)
is_reversed = False
error_occurred = False
for func in p:
if func == 'R':
is_reversed = not is_reversed
elif func == 'D':
if len(a_list) == 0:
error_occurred = True
break
else:
if is_reversed:
a_list.pop()
else:
a_list.popleft()
if error_occurred:
print('error')
else:
if is_reversed:
a_list.reverse()
print('[' + ','.join(map(str, a_list)) + ']')
역행시키는 게 반드시 직접 리스트를 모두 역행할 필요 없이 역행하는 것처럼 눈속임만 해줘도 됨을 다시 깨닫는 문제였다.
'알고리즘 > 백준' 카테고리의 다른 글
백준 실버2 1541. 잃어버린 괄호 (python) (0) | 2024.03.03 |
---|---|
백준 실버3 9375. 패션왕 신해빈 (python) (0) | 2024.03.03 |
백준 실버2 1260. DFS와 BFS (python) (0) | 2024.03.03 |
백준 실버1 1074. Z (python) (0) | 2024.03.02 |
백준 실버4 1620. 나는야 포켓몬 마스터 이다솜 (python) (0) | 2024.03.02 |