[Silver III] 뭔가 이미 있을 것 같은 순열 문제 - 34099
성능 요약
메모리: 116656 KB, 시간: 164 ms
분류
해 구성하기
제출 일자
2026년 04월 25일 22:04:59
문제 설명
$1$부터 $N$까지의 정수를 한 번씩만 사용하여 다음 조건을 만족하는 수열 $A_1$, $A_2$, $\cdots$, $A_N$을 출력하시오.
- 인접한 두 원소의 차가 $K$가 아니다.
입력
총 $T$개의 테스트 케이스가 입력으로 주어지며, 첫 번째 줄에 $T$가 주어진다. $(1 \le T \le 50\,000)$
그다음 줄부터 각 테스트 케이스마다 하나의 줄에 양의 정수 $N$, $K$가 공백으로 구분되어 주어진다. $(2 \le N \le 100\,000$; $1 \le K \le 100\,000)$
모든 테스트 케이스의 $N$의 합은 $100\,000$을 넘지 않는다.
출력
각 테스트 케이스마다 주어진 순서대로 한 개의 줄에,
- 만약 조건을 만족하는 수열이 있다면 수열 $A_1$, $A_2$, $\cdots$, $A_N$을 공백으로 구분하여 출력한다. 가능한 답이 여러 개라면 그중 아무 것이나 출력한다.
- 만약 조건을 만족하는 수열이 없다면
-1을 출력한다.
💡 해결 방법
💻 코드
# 만약 조건을 만족하는 수열이 있다면 수열 $A_1$, $A_2$, $\cdots$, $A_N$을 공백으로 구분하여 출력한다. 가능한 답이 여러 개라면 그중 아무 것이나 출력한다.
# 만약 조건을 만족하는 수열이 없다면 -1을 출력한다.
import sys
input = sys.stdin.readline
t = int(input())
for i in range(t):
n, k = map(int, input().split())
canuse = list(range(1, n + 1))
if k != 1:
print(*canuse, sep = ' ')
else:
if n == 2 or n == 3:
print(-1)
else:#k == 1, n >= 5
print(*canuse[1 : : 2], *canuse[0 : : 2],)