티스토리 뷰
반응형
📎 간략한 문제 정리
- 새로운 언어에는 두가지 함수 R(뒤집기), D(버리기)가 있습니다. R은 숫자의 순서를 뒤집는 함수이고 D는 첫번째 숫자를 버리는 함수입니다. 배열이 비어있을 때 D를 사용하면 에러가 발생합니다. 배열의 초기값과 수행할 함수가 주어졌을 때, 최종 결과를 구하는 프로그램을 작성하는 문제입니다.
📈 문제 분석
- 함수 명령문을 순회하며 해당 함수를 적용할 수 있습니다. 문제는 R함수는 O(N)인데 이렇게 되면 O(N^2)로 100,000의 범위에서 100억으로 속도 이슈가 발생합니다. 단순히 반복문을 사용하면 문제가 발생합니다.
🙋♂️ 내가 처음 생각한 해결 방법
- 우선 명령문에 RR이 연속으로 존재한다면 제거해줄 수 있습니다. 그리고 D의 개수가 전체 숫자의 개수보다 많다면 error가 발생하므로 연산할 필요가 없습니다. 이것을 제거해주고 연산을 해볼 수 있습니다.
💻 풀이한 코드
from sys import stdin
from collections import deque
input = stdin.readline
T = int(input())
result = []
for _ in range(T):
reversed = False
function = input().strip()
n = int(input())
array = deque(list(input().lstrip('[').rstrip(']\n').split(',')))
if len(array) < function.count('D') or (array[0] == '' and function.count('D') > 0):
result.append("error")
continue
function = function.replace("RR", "")
for one_function in function:
if one_function == "R":
reversed = False if reversed else True
elif one_function == "D":
if reversed:
array.pop()
else:
array.popleft()
if reversed:
array.reverse()
result.append(f"[{','.join(array)}]")
print('\n'.join(result))
📝 해결 과정에서 만난 문제, 고민들
RR을 제거하는 것 만으로 시간 절약이 충분하지 못했습니다. 테스트 케이스 자체도 O(N)이기 때문에 연산자를 검색하는 순회 for문, for문 안에서 reverse함수까지 구현하면 최대 O(N^3)까지 나오므로 속도가 최악이 됩니다. 포인트는 reverse함수를 구현하지 않는 것입니다.
[1, 2, 3, 4, 5]의 배열을 stack처럼 마지막 요소만 빼는 구조라고 생각했을 때 요소를 제거하고 전환한 뒤 다시 요소를 제거하는 과정을 보면
[1, 2, 3, 4] -> [4, 3, 2, 1] -> [4, 3, 2]
가 됩니다. 이를 다르게 생각해보면 reverse 한 이후 요소 제거는 오른쪽이 아니라 왼쪽에서 제거하면 되는 개념이고, 결과물만 마지막으로 한 번 뒤집어줄지만 결정하면 결과물이 같습니다.
[1, 2, 3, 4] -> [2, 3, 4] -> [4, 3, 2]
즉, 각 시점에 reverse가 된 상태인지에 따라 pop(), popleft()를 결정하고 마지막에만 결과물을 reverse할 지 결정하면 됩니다.
배열을 직접적으로 편집하는 로직의 경우 꼭 그 로직을 실행해야하는지, 개념적으로 더 빠르게 수정할 방법이 있는지 고민해보는 습관이 필요한 것을 배웠습니다.
반응형
'알고리즘 학습 > 백준 알고리즘' 카테고리의 다른 글
[백준 알고리즘] - 숫자 카드 2 (10816번) with Python (0) | 2021.04.15 |
---|---|
[백준 알고리즘] - 행렬 곱셈 (2740번) with Python (0) | 2021.04.14 |
[백준 알고리즘] - 주유소 (13305번) with Python (0) | 2021.04.10 |
[백준 알고리즘] - 전깃줄 (2565번) with Python (0) | 2021.04.09 |
[백준 알고리즘] - 신나는 함수 실행 (9184번) with Python (0) | 2021.04.06 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 토마토#백준알고리즘#Python
- 암호코드#dp#BOJ#Python
- 텀 프로젝트#백준알고리즘#Python
- API#lazy#
- Triangle#Sorting#Codility#Python
- 공유기 설치#BOJ#이분탐색#Python
- PassingCars#Codility#Python
- 종이자르기#분할정복#BOJ#Python
- 순열사이클#BOJ#Python
- 파이썬알고리즘인터뷰#4장
- Distinct#Codility#Python
- 터틀비치#리콘#xbox#controller
- django#slicing
- N으로 표현#DP#Programmers#Python
- Brackets#Stacks and Queues#Codility#Python
- 쿼드트리#BOJ#분할정복#Python
- Swift#Tuples#Range
- 날짜 계산#BOJ#완전탐색#Python
- django
- 배열합치기#분할정복#BOJ#Python
- 미로 탐색#백준알고리즘#Python
- NumberofDiscIntersections#Codility#Sort#Python
- 반복수열#백준알고리즘#Python
- 백준 알고리즘#BackTracking
- 나무자르기#BOJ#이분탐색#Python
- 병든 나이트#BOJ#탐욕법#Python
- 리모컨#완전탐색#BOJ#Python
- 섬의개수#백준알고리즘#Python
- filter#isalnum#lower
- 랜선자르기#이분탐색#BOJ#Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함