땅지원
땅지원's Personal blog
땅지원
전체 방문자
오늘
어제
  • 전체 (353)
    • Frontend (2)
      • React (2)
    • Backend (90)
      • Java (16)
      • Python (19)
      • Spring (23)
      • Database (21)
      • Troubleshooting (8)
    • DevOps (27)
      • ELK (13)
    • CS (40)
    • OS (2)
      • Linux (2)
    • Algorithm (95)
      • concept (18)
      • Algorithm Problem (77)
    • 인공지능 (25)
      • 인공지능 (12)
      • 연구노트 (13)
    • 수업정리 (35)
      • 임베디드 시스템 (10)
      • 데이터통신 (17)
      • Linux (8)
    • 한국정보통신학회 (5)
      • 학술대회 (4)
      • 논문지 (1)
    • 수상기록 (8)
      • 수상기록 (6)
      • 특허 (2)
    • 삼성 청년 SW 아카데미 (6)
    • 42seoul (12)
    • Toy project (3)
    • 땅's 낙서장 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 20.11.6 BB21플러스 온라인 학술대회
  • 20.10.30 한국정보통신학회 온라인 학술대회

인기 글

태그

  • 이것이 리눅스다 with Rocky Linux9
  • E
  • ㅗ
  • I
  • D

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
땅지원

땅지원's Personal blog

백준 2072 오목(구현)
Algorithm/Algorithm Problem

백준 2072 오목(구현)

2022. 6. 1. 20:24

https://www.acmicpc.net/problem/2072

 

2072번: 오목

19x19크기의 바둑판에, 돌을 놓을 좌표가 주어지면 이 게임이 몇 수만에 끝나는 지를 알아보려고 한다. 사용하고자 하는 바둑판의 모양은 위의 그림과 같으며, (1, 1)이 가장 왼쪽 위의 좌표이고 (19

www.acmicpc.net

처음엔 간단하게 돌을 놓은 순간 board 전체를 탐색해서 5칸이 이어진 구간이 있으면 그 순간의 i를 출력하는 간단한 문제로 생각했다.

 

하지만 이러한 경우 때문에 생각외로 잘 풀리지 않아 많은 시도를 한 후에 겨우 풀었다.

 

저런 조건때문에 탐색을 시작한 지점(x,y)에 대해 8방향까지 (x+5,y+5) 이렇게 탐색 하는 방법은 올바르지 않은 탐색이다.

 

(x,y)로 부터 8방향을 탐색하는데 (x,y)가 오목 5개의 중앙 지점이라고 생각하고 8방향에 대해 똑같은 돌이 몇개나 있는지 count를 세서 저장하는 것이다.

res = [0] * 8
std = board[x][y]
for k in range(8):
    nx = x + dx[k]
    ny = y + dy[k]
    while board[nx][ny]:
        if board[nx][ny] == std:
            nx += dx[k]
            ny += dy[k]
            res[k] += 1
        else:
            break

dx,dy의 index를 8방향에 대한 반시계방향 순서로 했기 때문에 index 4의 차이는 반대방향을 가르키게 된다.

for i in range(4):
    if res[i] + res[i+4] == 4:
        return True
return False

따라서 res[i] + res[i+4]의 값이 4이면 위의 6개 이상 돌이 놓여저 있는 경우를 제외하고 완벽하게 5개 있는 경우만 check

dx = [0, 1, 1, 1, 0, -1, -1, -1]
dy = [-1, -1, 0, 1, 1, 1, 0, -1]

def check(x,y):
    res = [0] * 8
    std = board[x][y]
    for k in range(8):
        nx = x + dx[k]
        ny = y + dy[k]
        while board[nx][ny]:
            if board[nx][ny] == std:
                nx += dx[k]
                ny += dy[k]
                res[k] += 1
            else:
                break
    for i in range(4):
        if res[i] + res[i+4] == 4:
            return True
    return False

board = [[0] * 21 for _ in range(21)]

n = int(input())
for i in range(1,n+1):
    a,b = list(map(int,input().split()))
    if i % 2 == 1: #홀수(흑)
        board[a][b] = 1
    else: # 짝수(백)
        board[a][b] = 2

    if check(a,b) == True:
        print(i)
        exit()

print(-1)

 

 

 

 

 

'Algorithm > Algorithm Problem' 카테고리의 다른 글

백준 1911 흙길 보수하기(구현,그리디)  (0) 2022.06.03
백준 15729 방탈출(그리디)  (0) 2022.06.03
백준 11000 강의실 배정(Heap, 우선순위 큐)  (0) 2022.05.22
백준 13900 순서쌍의 곱의 합(구현)  (0) 2022.05.20
백준 11571 분수를 소수로(구현)  (0) 2022.05.20
    'Algorithm/Algorithm Problem' 카테고리의 다른 글
    • 백준 1911 흙길 보수하기(구현,그리디)
    • 백준 15729 방탈출(그리디)
    • 백준 11000 강의실 배정(Heap, 우선순위 큐)
    • 백준 13900 순서쌍의 곱의 합(구현)
    땅지원
    땅지원
    신입 개발자의 우당탕탕 기술 블로그

    티스토리툴바