https://www.acmicpc.net/problem/21133
문제
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.
N이 주어졌을 때, 퀸을 놓는 방법 한 가지를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. (4 ≤ N ≤ 10,000)
출력
N개의 줄을 출력해야 한다. i번째 줄에는 하나의 정수를 출력해야 하고, 이 정수는 i번째 행에 있는 퀸이 있는 열의 번호이다.
풀이
예전에 N-Queen(3344)번에서 썼던 코드를 참고해보자.
N = int(input())
if N%2 == 0: #8, 26, 2012
if N%3 == 2:
for i in range(1, N, 2):
print(i+1)
print(3)
print(1)
for i in range(6, N, 2):
print(i+1)
print(5)
else:
for i in range(1, N, 2):
print(i+1)
for i in range(0, N, 2):
print(i+1)
else:
if N%3 == 0: #213, 99999
print(3)
print(1)
for i in range(N-1, 3, -2):
print(i+1)
print(2)
for i in range(N-2, 2, -2):
print(i+1)
else: #99991:
for i in range(0, N, 2):
print(i+1)
for i in range(1, N, 2):
print(i+1)
될 줄 알았는데 시간초과가 난다!
N = 10000인데 10000줄을 0.1초(추가시간 없음) 안에 파이썬으로 출력하니 문제가 생기는 것이다.
오늘의 교훈은, 파이썬에서 print문은 생각보다 느리다는 것이다.
그래서, 미리 리스트 등에 정답을 쭉 저장해놓고 딱 한 번의 sys.stdout.write 문만 써서 출력하는 것이 좋을 것이다(print보다 빠름)
import sys
N = int(input())
ans = []
if N%2 == 0: #8, 26, 2012
if N%3 == 2:
for i in range(1, N, 2):
ans.append(str(i+1))
ans.append('3')
ans.append('1')
for i in range(6, N, 2):
ans.append(str(i+1))
ans.append('5')
else:
for i in range(1, N, 2):
ans.append(str(i+1))
for i in range(0, N, 2):
ans.append(str(i+1))
else:
if N%3 == 0: #213, 99999
ans.append('3')
ans.append('1')
for i in range(N-1, 3, -2):
ans.append(str(i+1))
ans.append('2')
for i in range(N-2, 2, -2):
ans.append(str(i+1))
else: #99991:
for i in range(0, N, 2):
ans.append(str(i+1))
for i in range(1, N, 2):
ans.append(str(i+1))
sys.stdout.write('\n'.join(ans))
'PS' 카테고리의 다른 글
[Python] 백준 11758 - CCW (0) | 2025.03.22 |
---|---|
[Python] 백준 1695 - 팰린드롬 만들기 (0) | 2025.03.21 |
[Python] 백준 3344 - N-Queen (0) | 2025.03.19 |
[Python] 백준 1509 - 팰린드롬 분할 (0) | 2025.03.18 |
[Python] 백준 1182 - 부분수열의 합 (0) | 2025.03.13 |