https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWQmA4uK8ygDFAXj
1. 해결방법
쉬웠다면 쉽고 조금 어려웠다면 조금 어렵다. 말 그대로 아이디어만 떠오르면 쉽게 풀 수 있는 문제다. 다른 풀이 아이디어의 도움을 받아서 나머지는 알아서 코드를 작성했다. 디버깅 포함 2시간 걸림;
1. 기본적으로 오셀로판을 초기세팅으로 맞추어 놓아야 한다.
2. 1번과 2번 유저가 번갈아가면서 인덱스 위치를 입력받으면 for문을 돌아서 8방향 전부 탐색을 시작한다.
3. 뒤집어야할 리스트를 두고 dy, dx를 더하고 while문을 이용해서 한 방향의 탐색이 끝날때까지 진행한다.
4. 탐색이 끝나는 경우는 탐색하는 인덱스 값이 0이거나 플레이어 돌 색깔과 같은 경우이다. 그게 아니라면 reverse 리스트에 append한다.
5. 한 방향을 끝냈으면 reverse 리스트에서 뒤집어야할 돌을 뒤집는다. (색을 바꾼다)
2. 정답코드
T = int(input())
# T = 10
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
N, M = map(int, input().split())
# 오셀로 초기 세팅
maps = [[0] * N for _ in range(N)]
flag = 0
for i in range(N // 2 - 1, N // 2 + 1):
for j in range(N // 2 - 1, N // 2 + 1):
if flag == 0:
maps[i][j] = 2
flag = 1
elif flag == 1:
maps[i][j] = 1
flag = 0
else:
flag = 1
# 더 간단하게 세팅하는 방법
# mid 법 N // 2
# maps[mid][mid] = 2
# maps[mid - 1][mid - 1] = 2
# maps[mid - 1][mid] = 1
# maps[mid][mid - 1] = 1
# 상 하 좌 우 대각선 방향
direct = ((0, 1), (1, 0), (-1, 0), (0, -1), (1, 1), (-1, 1), (-1, -1), (1, -1))
for i in range(M):
x, y, p = map(int, input().split())
y -= 1
x -= 1
maps[y][x] = p
# 8방향 탐색
for j in range(8):
dy, dx = direct[j]
ny, nx = y + dy, x + dx
# 뒤집어야 하는 돌 리스트
reverse = []
while True:
if 0 <= ny < N and 0 <= nx < N:
if maps[ny][nx] == 0:
reverse = []
break
if maps[ny][nx] == p:
break
else:
reverse.append((ny, nx))
nx, ny = nx + dx, ny + dy
else:
reverse = []
break
for r, c in reverse:
if p == 1:
maps[r][c] = 1
else:
maps[r][c] = 2
b, w = 0, 0
for i in range(N):
for j in range(N):
if maps[i][j] == 1:
b += 1
elif maps[i][j] == 2:
w += 1
print(f"#{test_case} {b} {w}")
'Algorithm > SWEA' 카테고리의 다른 글
[SWEA] D3. 오목 판정 (0) | 2022.11.17 |
---|---|
[SWEA] D3. 최장 증가 부분 수열 (0) | 2022.11.17 |
[SWEA] D3. 상호의 배틀필드 (1) | 2022.11.14 |
[SWEA] D3. 회문2 (0) | 2022.11.11 |
[SWEA] D3. N-Queen (0) | 2022.11.11 |