PS

[Python] 백준 21133 - N-Queen 2

kkigon 2025. 3. 19. 15:30

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