BruteForce_16_오목(22615)

Eugenius1st·2022년 6월 1일
0

Algorithm_Baekjoon

목록 보기
126/158

BruteForce16오목(22615)

문제

입력

19줄에 각 줄마다 19개의 숫자로 표현되는데, 검은 바둑알은 1, 흰 바둑알은 2, 알이 놓이지 않는 자리는 0으로 표시되며, 숫자는 한 칸씩 띄어서 표시된다.

출력

첫줄에 검은색이 이겼을 경우에는 1을, 흰색이 이겼을 경우에는 2를, 아직 승부가 결정되지 않았을 경우에는 0을 출력한다. 검은색 또는 흰색이 이겼을 경우에는 둘째 줄에 연속된 다섯 개의 바둑알 중에서 가장 왼쪽에 있는 바둑알(연속된 다섯 개의 바둑알이 세로로 놓인 경우, 그 중 가장 위에 있는 것)의 가로줄 번호와, 세로줄 번호를 순서대로 출력한다.

풀이

  • 육목 체크까지 해야한다 . 여섯 알 이상이 연속적으로 놓인 경우에는 이긴 것이 아니다.
  • 아직 승부가 결정되지 않았을 경우에는 0을 출력한다.
  • 승부가 결정되었을 경우에는 연속된 다섯 개의 바둑알 중 가장 왼쪽에 있는 바둑알의 좌표를 출력한다. → 방향을 (→ ↓ ↘ ↗)로 설정해야 하는 이유!
  • (0, 0)부터 (18, 18)까지 모든 좌표에서 방향 갯수만큼 for문을 4번 돌려 → ↓ ↘ ↗ 방향으로 쭉쭉 5칸씩을 체크 (바둑돌이 놓여있는 경우에만=즉 좌표에 저장된 값이 0이 아닌 경우에만)
    x, y는 현재 좌표
  • nx, ny는 현재 좌표에서 해당 방향으로 1만큼 이동시킨 좌표
  • 5칸 연속으로 1 or 2가 놓여있었을 경우 육목인 케이스를 걸러줘야 한다.
  • 첫번째 바둑돌보다 한 칸 이전의 바둑돌 체크
  • 마지막 바둑돌보다 한 칸 이후의 바둑돌 체크

코드

import sys
sys.stdin = open("input.txt", "rt")
input = sys.stdin.readline
# 가로줄 번호와 세로줄 번호 순서대로 출력

board = []
for i in range(19):
    board.append(list(map(int,input().split())))

dx = [0,1,1,-1]
dy = [1,0,1,1]
stdN = 19
for x in range(stdN):
    for y in range(stdN):
        if board[x][y] != 0:
            # 0아닌 경우 즉, 2이거나 1인경우 for 문을 돌려 위, 아래, 대각선 위, 대각선 아래 확인
            focus = board[x][y]

            for i in range(4):
                cnt = 1
                nx = x+dx[i]
                ny = y+dy[i]

                while 0 <= nx < 19 and 0 <=ny < 19 and board[nx][ny] == focus:
                    cnt += 1
                    if cnt == 5:
                        if 0 <=x - dx[i] <19 and 0 <= y - dy[i] < 19 and board[x-dx[i]][y - dy[i]] == focus:
                            break
                        if 0<= nx + dx[i] < 19 and 0 <= ny + dy[i] < 19 and board[nx+dx[i]][ny + dy[i]] == focus:
                            break
                        # 육목이 아니면 성공한거니 종료
                        print(focus)
                        print(x+1, y+1)
                        sys.exit(0)
                    nx += dx[i]
                    ny += dy[i]
print(0)

배운 것

  • dx 와 dy에 방향 좌표 담아서 for 문을 돌려 완전탐색
  • focus 라는 기준 점에 대입하여 모두 같은지 확인
profile
최강 프론트엔드 개발자가 되고싶은 안유진 입니다

0개의 댓글