Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- node
- 백준
- 알고리즘
- 개발자
- 런타임에러
- Django
- boostcamp
- python
- 코테
- 배포
- js
- 자바스크립트
- 삼각형
- Git
- 부스트캠프
- 코딩테스트
- Object
- 네이버커넥트재단
- array
- Express
- 5기
- vscode
- react
- 사이트
- 실기
- 정보처리기사
- Mac
- CSS
- javascript
- 지속가능한개발자
Archives
- Today
- Total
개발 공부 기록
[python] 백준 1406 런타임 에러, 시간 초과 해결 본문
python 으로 백준 1406번 문제를 풀었으나 런타임 오류가 났다. (list의 insert와 pop기능을 통해 처음에 구현했었다.) 테스트 케이스가 잘 돌아가 오류를 못찾겠던 도중 아래의 글을 발견했다.
https://www.acmicpc.net/board/view/54572
python의 list라는 자료구조의 특성상 시간복잡도가 O(n)이 걸린다고 한다.
insert와 pop부분에서 많은 시간이 걸려 시간초과가 남을 알 수 있었다.
본 문제를 풀기 위해서는
1) list 의 맨 뒤에서만 삽입/삭제 연산을 할 수 있도록 알고리즘을 구현하기
2) 한가운데의 원소를 삽입하거나 삭제했을 때 바로 앞뒤의 원소 이외의 원소를 건드릴 필요가 없는 자료구조를 사용하기
둘 중 한가지 방법을 선택해야 하는 것이 좋다는 것을 알게 되었다.
1번의 방법으로 해결하려고 했으나 코드가 너무 길어지고 복잡해질 것 같았다.
2번의 방법으로 해결하기 위해서 어떻게 해야할 지 고민하던 도중 stack 2개를 활용해서 풀 수 있음을 알게 되었다.
import sys
if __name__ == '__main__':
stackLeft = list(sys.stdin.readline().rstrip())
stackRight = list()
n = int(sys.stdin.readline().rstrip())
for i in range(0, n):
command = list(sys.stdin.readline().split())
if command[0] == 'L' and stackLeft:
stackRight.append(stackLeft.pop())
elif command[0] == 'D' and stackRight:
stackLeft.append(stackRight.pop())
elif command[0] == 'B' and stackLeft:
stackLeft.pop()
elif command[0] == 'P':
stackLeft.append(command[1])
print(''.join(stackLeft) + ''.join(list(reversed(stackRight))))
'공부 > 코딩테스트' 카테고리의 다른 글
[python] 주요 연산자 시간복잡도 (0) | 2020.09.13 |
---|---|
[python] heapq (0) | 2020.09.13 |
[python] 재귀 호출 오류, 최대 재귀 깊이 늘려주기 (0) | 2020.09.03 |
[코테준비] Python int형 리스트 join하기 (0) | 2020.08.31 |
[코테준비] python으로 입력받기 (0) | 2020.08.31 |
Comments