Tiny Bunny
본문 바로가기
Algorithm/Python

[SWEA #11315] 오목 판정

by nowag 2024. 2. 29.

문제

N X N 크기의 판이 있다. 판의 각 칸에는 돌이 있거나 없을 수 있다. 돌이 가로, 세로, 대각선 중 하나의 방향으로 다섯 개 이상 연속한 부분이 있는지 없는지 판정하는 프로그램을 작성하라.

  

입력

첫 번째 줄에 테스트 케이스의 수 T가 주어진다.

각 테스트 케이스의 첫 번째 줄에는 하나의 정수 N(5 ≤ ≤ 20)이 주어진다.

다음 N개의 줄의 각 줄에는 길이 N인 문자열이 주어진다. 각 문자는 ‘o’또는 ‘.’으로, ‘o’는 돌이 있는 칸을 의미하고, ‘.’는 돌이 없는 칸을 의미한다.

  

출력

각 테스트 케이스 마다 돌이 다섯 개 이상 연속한 부분이 있으면 “YES”를, 아니면 “NO”를 출력한다.

 

내가 쓴 코드1

T = int(input())
for t in range(T):
    N = int(input())
    omok = [input() for _ in range(N)]
    result = 'NO'
    flag = 0
    # 가로 5개
    for i in range(N):
        cnt = 0
        for j in range(N):
            if omok[i][j] == 'o':
                cnt += 1
        if cnt == 5:
            result = 'YES'
            break

    # 세로 5개
    if result == 'NO':
        for i in range(N):
            cnt = 0
            for j in range(N):
                if omok[j][i] == 'o':
                    cnt += 1
            if cnt == 5:
                result = 'YES'
                break

    # 대각선 5개
    # 1. 우하향
    if result == 'NO':
        for i in range(N - 4):
            for j in range(N - 4):
                if omok[i][j] == 'o':
                    if omok[i + 1][j + 1] == 'o' and omok[i + 2][j + 2] == 'o' and omok[i + 3][j + 3] == 'o' and \
                            omok[i + 4][j + 4] == 'o':
                        result = 'YES'
                        flag = 1
                        break
            if flag == 1:
                break

    # 2. 우상향
    if result == 'NO':
        for i in range(N - 4):
            for j in range(4, N):
                if omok[i][j] == 'o':
                    if omok[i + 1][j - 1] == 'o' and omok[i + 2][j - 2] == 'o' and omok[i + 3][j - 3] == 'o' and \
                            omok[i + 4][j - 4] == 'o':
                        result = 'YES'
                        flag = 1
                        break
            if flag == 1:
                break
    print(f'#{t + 1} {result}')

ㅎㅎㅎ 처음 썼던 코드인데, 제공된 테스트케이스는 다 맞는데, 제출하면 틀렸다고 뜬다... 그렇게 오목을 잊어가다가,,, 

 

내가 쓴 코드2

# 하 우하 우 좌하
di = [1, 1, 0, 1]
dj = [0, 1, 1, -1]

T = int(input())
for t in range(T):
    N = int(input())
    arr = [list(input()) for _ in range(N)]
    ans = 'NO'
    for i in range(N):
        for j in range(N):
            if arr[i][j] == 'o':
                for k in range(4):
                    cnt = 1
                    for l in range(1, 5):
                        ni = i + di[k]*l
                        nj = j + dj[k]*l
                        if not(0 <= ni < N and 0 <= nj < N):
                            break
                        if arr[ni][nj] == 'o':
                            cnt += 1
                    if cnt >= 5:
                        ans = 'YES'
                        break
            if ans == 'YES':
                break
        if ans == 'YES':
            break

    print(f'#{t+1} {ans}')

어제 설명 한 번 듣고, 오늘도 듣게 됐다! ㅎㅎ 그리고 드디어 또 도전 ^^ !!! 오늘은 델타를 써서 풀어보았당 ~.~!

풀었는데 완전 누가 봐도 맞는 코든데 자꾸 하나씩 답이 틀리는거다... 그래서 강사님 동원해서 디버깅하고 난리쳤더니....

cnt를 마지막 for문 위에서 1을 할당해줘야 하는데, 그 바깥 for문에다가 한거다.. 그 위치 틀려서 계속 답이 안맞았던 것ㅎ

for문이 4개나 돼서 그냥 유관상으로는 찾기 힘든 실수였다.. 흐그극 ㅠㅠ 

담주월요일에 시험인데 어떡하지,,, 이렇게 작은 실수가 더 찾기 힘들어ㅠ 차라리 그냥 큰 틀을 틀리면 싹다 고쳐버리기라도 하지,,,, 으어 걱정인형 됨....ㅜ.ㅜ

 

출력 결과

# 1 YES
# 2 YES
# 3 YES
# 4 NO

728x90
반응형