SW Expert #15612

도연·2023년 5월 17일
0

코테준비

목록 보기
1/3

문제 코드

#15612

문제

8 x 8 크기의 체스판 위의 몇 개의 칸에 룩(rook)이 놓여 있다. 각 칸에는 최대 1개의 룩을 놓을 수 있으므로, 체스판 위에는 0개 이상 64개 이하의 룩이 놓여 있는 것이다.
이때, 현재 체스판의 배치가 다음 조건을 모두 만족하는지를 판별하는 프로그램을 작성하라.
- 정확히 8개의 룩이 있어야 한다.
- 모든 룩은 서로 공격할 수 없어야 한다. 즉, 서로 다른 두 룩은 같은 열에 있거나 같은 행에 있으면 안 된다.

[입력]
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스는 여덟 개의 줄로 이루어지며, 각 줄에는 길이가 8인 ‘O’ 또는 ‘.’로 구성된 문자열이 주어진다. i번째 줄의 j번째 글자는, 체스판의 i행 j열에 룩이 하나 놓여 있다면 ‘O’, 아무것도 놓여 있지 않다면 ‘.’이다.

[출력]
각 테스트 케이스마다, 주어진 체스판의 배치가 주어진 모든 조건을 만족한다면 ‘yes’를, 하나라도 만족하지 않는다면 ‘no’를 출력한다.

작성한 정답

T=int(input())
for t in range(1, T+1):
    chList = []
    passcnt = 0
    for i in range(0,8):
        chList.append(list(str(input())))
    for b in range(0,8):
        hcnt = 0
        wcnt = 0
        for a in range(0,8):
            if chList[a][b] == "." :
                hcnt +=1
            if chList[b][a] == "." :
                wcnt +=1
        if hcnt <7 or wcnt <7 or (wcnt or hcnt)==8 :
            print("#{0} no".format(t))
            break
        elif hcnt == 7 and wcnt ==7 :
            passcnt +=1
    if passcnt == 8 :
        print("#{0} yes".format(t))

다른 구현 문제는 풀만한데 이상하게 체스판 , 좌표 같은 문제는 풀기가 어렵다 ..
이것도 다른 분들 풀이를 보니까 보통 2차원 배열을 만들고 하나씩 방문해서 푸는 경우가 많은데 나는 조건을 다르게 해석했다.

  1. "."이 새로 줄에도 7개 "."이 가로 줄에도 7개 있어야한다는 조건 (hcnt와 wcnt에 저장)
  2. 같은 열에 0이 1개 이상이면 안되는 조건 (hcnt시 같은 열에 0이 1개 이상 있다면 hcnt 개수가 모자라게 된다 이 경우에는 no가 출력되게 함)

아마 이 문제 말고 비슷한 체스 문제에 조건이 많아지면 이 방법은 사용하기 어려울 거 같다 ..
다른 방법으로도 풀어봐야지 ..
좋은 방법이나 정석이라 할 수 있는 방법이 있으면 댓글로 알려주세요 !

profile
모연

0개의 댓글