[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],)