Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- hilt
- runCatching
- 코루틴 공식문서
- Thread vs Coroutine
- AAC ViewModel
- Kotlin Serialization
- Android Custom View
- BOJ
- 안드로이드 컴포즈
- 코틀린 에러 핸들링
- viewmodel
- Coroutine
- RecyclerView Sticky Header
- android compose orbit
- android orbit
- power menu
- 힐트
- 코루틴 공식 문서
- Sticky Header RecyclerView
- 백준
- 안드로이드 커스텀 뷰
- 코루틴
- 안드로이드 무한 스크롤
- Android Compose Navigation
- Hilt 에러
- power menu 라이브러리
- Android Compose
- 스레드 vs 코루틴
- 백준 2615
- Unsupported metadata version. Check that your Kotlin version is >= 1.0: java.lang.IllegalStateException
Archives
- Today
- Total
Beeeam
[BOJ] 백준 2615 오목 Python 본문
문제
2615번: 오목
오목은 바둑판에 검은 바둑알과 흰 바둑알을 교대로 놓아서 겨루는 게임이다. 바둑판에는 19개의 가로줄과 19개의 세로줄이 그려져 있는데 가로줄은 위에서부터 아래로 1번, 2번, ... ,19번의 번호
www.acmicpc.net
풀이
바둑판에 흑백 돌들이 놓여있고 이를 보고 오목 경기의 승패를 확인하는 문제이다. 한 색의 바둑돌이 같은 방향으로 연속 5개가 이어지면 오목이 된다. 그래서 오목판에 돌이 있으면 그 돌을 타켓으로 삼고 탐색을 시작한다.
탐색의 방향은 총 4 방향으로 우, 하, 우상, 우하 방향으로 탐색을 진행한다. (문제에서 오목이 시작되는 가장 왼쪽에 있는 바둑알(연속된 다섯 개의 바둑알이 세로로 놓인 경우, 그 중 가장 위에 있는 것)을 출력하라고 했기 때문에 왼쪽에서 오른쪽으로 탐색을 진행)
판의 범위를 벗어나지 않고, 이동한 방향에 있는 돌이 타켓과 같다면 카운트를 증가한다. 만약 카운트가 5가 되면 오목이 된 것인데 문제에서 육목은 무효라고 했기 때문에 육목인지 확인을 하고 아니면 타켓을 출력하고, 오목이 시작되는 좌표를 출력한다. 만약 승패가 갈리지 않은 경우에는 0을 출력한다.
코드
def bfs(x, y):
if graph[x][y] != 0:
target = graph[x][y]
for n in range(4):
cnt = 1
nx = x + dx[n]
ny = y + dy[n]
while 0 <= nx < 19 and 0 <= ny < 19 and graph[nx][ny] == target: # 이동할 좌표가 범위를 벗어나지 않고, 이전 바둑알과 같은 색이라면?
cnt += 1
if cnt == 5: # 오목이 된 경우
if 0 <= x - dx[n] < 19 and 0 <= y - dy[n] < 19 and graph[x - dx[n]][y - dy[n]] == target: # 육목인지 확인 (시작 좌표 이전에 같은 색의 바둑알이 있나?)
break
if 0 <= nx + dx[n] < 19 and 0 <= ny + dy[n] < 19 and graph[nx + dx[n]][ny + dy[n]] == target: # 육목인지 확인 (끝 좌표 이후에 같은 색의 바둑알이 있나?)
break
print(target)
print(x + 1, y + 1)
exit(0)
nx += dx[n] # 이전에 이동했던 방향으로 이동
ny += dy[n] # 이전에 이동했던 방향으로 이동
graph = [list(map(int, input().split())) for _ in range(19)]
# →, ↓, ↗, ↘
dx = [0, 1, -1, 1]
dy = [1, 0, 1, 1]
for i in range(19):
for j in range(19):
bfs(i, j)
print(0)
'BOJ' 카테고리의 다른 글
[BOJ] 백준 1026 보물 (0) | 2023.06.29 |
---|---|
[BOJ] 백준 1094 막대기 Kotlin (0) | 2023.02.28 |
[BOJ] 백준 2108 통계학 python (0) | 2023.02.21 |
[BOJ] 백준 3085 사탕게임 python (0) | 2023.02.11 |
[BOJ] 백준 16173 점프왕 쩰리 python (0) | 2023.01.30 |