똥그래미 코딩공장
백준 2529번(부등호) 파이썬 본문
https://www.acmicpc.net/problem/2529
2529번: 부등호
여러분은 제시된 부등호 관계를 만족하는 k+1 자리의 최대, 최소 정수를 첫째 줄과 둘째 줄에 각각 출력해야 한다. 단 아래 예(1)과 같이 첫 자리가 0인 경우도 정수에 포함되어야 한다. 모든 입력
www.acmicpc.net
이 문제는 처음에 쉽게 생각했다.
지금까지 풀었던 문제들과 크게 다를게 없구나 하고 막힘없이 풀어 갔다. 그리고 예제들을 돌렸을때 잘 나오길래 오 됐다!!
하고 제출을 했는데... "시간초과" 가 떠버렸다... 그래서 pypy3로 돌려봤는데 여기선 정답이 떴다.
하지만 python3로 정답이 떠야 하기 때문에 다시 풀어보려다 실패하고 결국 다른 사람의 풀이를 참고하게 되었다.
아래는 풀이 코드이다.
import sys
input = sys.stdin.readline
k = int(input())
arr = list(input().split())
visited = [False]*10
ans = []
"""tmp = []
def dfs():
if len(ans) == k+1:
check = [False]*k
for i in range(k):
if arr[i] == '>':
if ans[i]>ans[i+1]:
check[i] = True
continue
else:
break
else:
if ans[i]<ans[i+1]:
check[i] = True
continue
else:
break
if False not in check:
tmp.append(''.join(map(str,ans)))
return
for i in range(10):
if visited[i]:
continue
visited[i]=True
ans.append(i)
dfs()
ans.pop()
visited[i]=False
dfs()
print(max(tmp))
print(min(tmp))"""
def check_up(i, j, k): # True, False를 판단해줄 함수
if k == '<':
return i < j
else:
return i > j
def dfs(iter, temp):
if iter == k + 1: # 문자열의 길이가 k+1의 자리가 될 때
ans.append(temp)
return
for i in range(10):
if not visited[i]:
# 문자열의 길이가 0이거나 부등호의 수식이 True일때
if iter == 0 or check_up(temp[-1], str(i), arr[iter - 1]):
visited[i] = 1
dfs(iter + 1, temp + str(i)) # 다음 수식들을 또 검사해준다
visited[i] = 0
dfs(0, "")
print(ans[-1])
print(ans[0])
주석 처리가 된 부분은 시간초과가 났던 코드이다.
시간 초과가 난 이유는 삽입과 삭제 부분 때문이 아닐까 추측된다..
혹시 제 코드의 시간초과의 이유를 아시는 분은 댓글로 알려주시면 감사하겠습니다!
'Algorithm' 카테고리의 다른 글
| 백준 2573번(빙산) 파이썬 (0) | 2023.05.06 |
|---|---|
| 백준 10819번(차이를 최대로) 파이썬 (1) | 2023.04.30 |
| 백준 1967번(트리의 지름) 파이썬 (0) | 2023.04.13 |
| 백준 3085번(사탕게임) 파이썬 (0) | 2023.04.11 |
| 백준 1182번(부분 수열의 합) 파이썬 (0) | 2023.04.05 |