본문 바로가기
코드포스 - Codeforces

코드포스 (Hello 2022) A. Stable Arrangement of Rooks

by 청원뿔세포 2022. 1. 5.

[문제설명]

 N개의 정수가 주어진다.  N x N의 체스판이 생성된다. 체스말 중에서 룩(rook)이 체스판 k개 만큼 체스판 위에 올라가있다. 룩은 같은 열 또는 행에있는 다른 룩을 죽일 수 있다.

룩이 서로 죽이지 못하는 상태를 "좋은배열"이라고 부른다. "좋은배열"에서 만약 룩이 인접한 칸으로 움직였을 때에도 "좋은배열"상태이면 "안정적인 상태"라고 부르고, 서로를 죽이는 상황이 나오면 "불안정한 상태"라고 부른다.

(인접한 칸은 상하좌우에 있는 칸을 말한다)

k개의 룩이 주어졌을 때 N x N체스판에서 "안정적인 상태"를 아무거나 찾아내거나 찾아낼 수 없다면 -1을 출력하여라.

 

 

"안정적인 상태"를 아무거나 찾아내서 보여주면 됨으로 모든 경우의 수를 다 생각하지 않아도 된다.

k값이 2부터 점점 늘어날 때 n의 최소값을 생각하면서 엑셀에 그림을 그려보니 k=2, n=3 / k=3, n=5 / k=4, n=7 인 예제를 구해볼 수 있었다. 이 규칙을 보면 2k-1 = n 이라는 수식을 생각해 낼 수 있다. 그리고 아무런 경우의 수나 출력을 해서 보여줘도 되니 간단하게 위에 표현된 상황면 출력 되도록 코드를 짜봤다.

# Python 
# 테스트 케이스 개수
t= int(input())

for i in range(t):
	# n, k 입력
    n,k=map(int, input().split())
    
    # "불안정적인 상태" 검출
    if 2*k-1>n:
        print(-1)
        
    else:
    	# 룩 개수 초기화
        rook = 0
        # (x,y)값 중 y값 초기화
        y=1
        for j in range(n):
        
        	 # (x,y)값 중 y값 초기화
            x=1
            # (x,y)값이 홀수이고 서로 같은 경우 R을 출력하게 함
            for p in range(n):
                if rook<k and x==y and x%2==1:
                    print('R',end='')
                    rook+=1
                else:
                    print('.', end='')
                x+=1
            print('')
            y+=1

댓글