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 | 31 |
Tags
- 너비 우선 탐색
- 프로그래머스
- 그래프 이론
- 브루트포스
- 데이터베이스
- 깊이우선탐색
- 브루트포스 알고리즘
- 그리디 알고리즘
- 다이나믹 프로그래밍
- Python
- DFS
- 백트래킹
- oracle
- 파이썬
- 스택
- 그래프 탐색
- 문자열
- 구현
- DP
- 오라클
- 다익스트라
- BFS
- 완전탐색
- SWEA
- 자바스크립트
- 백준알고리즘
- 너비우선탐색
- 백준 알고리즘
- SW Expert Academy
- javascript
Archives
- Today
- Total
민규의 흔적
[Python 파이썬] SWEA 11315번 - 오목 판정 본문
2024년 5월 14일
문제 링크 : SWEA 11315번 - 오목 판정
문제 접근
N x N 사이즈의 판이 주어지고, 돌이 놓아진 곳은 o , 아닌 곳은 . 문자를 표기한다.
우리가 아는 오목과 같이 가로, 세로, 대각선 중 하나의 방향으로 다섯 개 이상 연속한 돌이 있는지 판정하면 되는 문제이다.
먼저 가로, 세로, 대각선 방향으로 한 칸씩 전진하며 탐색해야 하기에 다음과 같이 8방향을 탐색하기 위한 두 배열을 선언해주어야 한다.
# 동, 남동, 남, 남서, 서, 북서, 북, 북동
d_row = [0, 1, 1, 1, 0, -1, -1, -1]
d_col = [1, 1, 0, -1, -1, -1, 0, 1]
현재 인덱스가 [1, 1] 이고, 남서 방향으로 한 칸씩 전진하여 탐색하려 한다면
[1 + d_row[3], 1 + d_col[3]] = [1 + 1, 1 - 1] = [2, 0]으로 나타낼 수 있다.
다음과 같이 5 X 5 사이즈의 보드가 주어지고, 파란색 원 위치에 돌을 놓았다고 가정해보자
[0, 1] 위치의 돌을 기준으로 8방향을 확인해보며 연속된 5가지 돌이 있는지 탐색하면 된다.
동쪽으로 한 칸 더 전진해보니 돌이 없으니 다음 방향으로 넘어간다.
남동쪽 방향으로 계속 돌이 있어, 전진해보다 5개가 되기 전에 돌이 끊켰기에 다음 방향으로 넘어간다.
남쪽 방향으로 돌이 있어, 계속 전진해보니 5개의 돌이 연속되어있음을 탐색을 통해 알아냈으므로 YES를 출력하고 이후 추가 탐색은 생략한다.
순서도
1. 8방향 탐색을 제어하기 위한 d_row, d_col 배열을 선언한다.
2. N * N 크기의 board를 입력받는다.
3. 모든 행을 순회하며 만약 돌이 존재한다면 8방향 모두 한 칸씩 전진해보며 5개 연속한 케이스가 존재하는지 완전 탐색을 진행한다.
4. 존재한다면 YES, 아니라면 NO를 출력하고 로직을 종료한다.
입력 예제
1
5
....o
...o.
..o..
.o...
o....
출력 예제
#1 YES
주의할 점
암시적 그래프 탐색의 성격을 띄므로 탐색을 위한 d_row, d_col 배열 선언과 활용이 중요하다.
전체 코드
def isValid(row, col):
if 0 <= row < N and 0 <= col < N and board[row][col] == "o":
return True
return False
def solution():
for row in range(N):
for col in range(N):
if board[row][col] == "o":
for i in range(8):
matched = 1
next_row = row
next_col = col
while matched <= 5:
next_row += d_row[i]
next_col += d_col[i]
if isValid(next_row, next_col):
matched += 1
else:
break
if matched == 5:
return "YES"
return "NO"
T = int(input())
# 동, 남동, 남, 남서, 서, 북서, 북, 북동
d_row = [0, 1, 1, 1, 0, -1, -1, -1]
d_col = [1, 1, 0, -1, -1, -1, 0, 1]
for test_case in range(1, T + 1):
N = int(input())
board = []
for _ in range(N):
board.append(input())
print(f'#{test_case} {solution()}')
'SWEA' 카테고리의 다른 글
[Python 파이썬] SWEA 5607번 - [Professional] 조합 (0) | 2024.05.16 |
---|---|
[Python 파이썬] SWEA 1215번 - [S/W 문제해결 기본] 3일차 - String (0) | 2024.05.14 |
[Python 파이썬] SWEA 1860번 - 진기의 최고급 붕어빵 (0) | 2024.05.10 |
[Python 파이썬] SWEA 1216번 - [S/W 문제해결 기본] 3일차 - 회문2 (0) | 2024.05.10 |
Python 파이썬] SWEA 1220번 - [S/W 문제해결 기본] 5일차 - Magnetic (0) | 2024.05.08 |