🗒️파이썬 코드 풀이
T = int(input())
for tc in range(1,T+1) :
N,M = map(int,input().split())
lst = [list(map(int,input().split())) for _ in range(M)]
# 오셀로 기본 세팅
othello = [[0] * (N+1) for _ in range(N+1)]
center = N//2
othello[center][center] = othello[center+1][center+1] = 2
othello[center+1][center] = othello[center][center+1] = 1
# 8방향 설정
di,dj = [0,-1,-1,-1,0,1,1,1] ,[1,1,0,-1,-1,-1,0,1]
for ls in lst :
i,j,c = ls[0],ls[1],ls[2] # i,j는 배열 인덱싱/ c는 현재 색깔
othello[i][j]= c # 오셀로 판에 현재 색상 배치
for k in range(8) : # 8 방향 검증
r = []
for mul in range(1,N+1) :
ni = i + di[k] * mul
nj = j + dj[k] * mul
if 1<=nj<N+1 and 1<=ni<N+1 :
if othello[ni][nj] == 0 : # 0 일때
break
elif othello[ni][nj] == c: # 같은 색상일때
while r :
ti,tj = r.pop()
othello[ti][tj] = c
break
else : # 다른 색상일때
r.append((ni,nj))
bcnt = wcnt = 0
for i in range(0,N+1) :
bcnt += othello[i].count(1)
wcnt += othello[i].count(2)
print(f"#{tc} {bcnt} {wcnt}")
1. 기본적으로 입력 받아야 할 것들 코드 작성
2. 오셀로 판을 작성해주는데, 문제에서 (1,1)에서 시작하기 때문에 N+1 x N+1 0배열을 만들어준다.
(1행과 1열은 쓰지 않음)
3. 판을 만들었으니, 기본 세팅(가운데에 흑백 놓아주기)을 해준다.
4. 입력받은 인덱스 위치에 해당 차례의 색상을 배치
5. 여덟 방향을 N+1배만큼 순차 검증을 한다. (ni,nj에서 범위 초과는 if문을 통해 제어해주니 크게 신경쓰지 않는다.)
6. 세가지 종류의 상황이 있다. 현재 진행하고 있는 방향에 ni,nj가 0/1/2 인 경우
- 0 인 경우 :
그 방향은 더 이상 볼 필요가 없기 때문에 break
- 현재 차례인 색상과 같은 색상인 경우:
r 리스트(다른 색상들 인덱스를 저장해둠)에서 pop을 하여 하나 하나 색상을 바꿔준다.
- 현재 차례와 다른 색상인 경우 :
계속 append를 통해 r에 넣어주고, 현재 색상과 같은 색상이 나올때 pop으로 하나하나 채워주던가, 아니면 0을 만나 break 된다.
📌 문제 코멘트
5번까지는 어찌저찌 잘 해나갔는데, 세가지 상황으로 나누는 것에 실패를 했다.
그 중 특히 다른 색상에 대해 리스트를 만들어서 줄 생각을 못했다.
📚문제
오셀로라는 게임은 흑돌과 백돌을 가진 사람이 번갈아가며 보드에 돌을 놓아서 최종적으로 보드에 자신의 돌이 많은 사람이 이기는 게임이다.
보드는 4x4, 6x6, 8x8(가로, 세로 길이) 크기를 사용한다. 6x6 보드에서 게임을 할 때, 처음에 플레이어는 다음과 같이 돌을 놓고 시작한다(B : 흑돌, W : 백돌).
4x4, 8x8 보드에서도 동일하게 정가운데에 아래와 같이 배치하고 시작한다.
그리고 흑, 백이 번갈아가며 돌을 놓는다.
처음엔 흑부터 시작하는데 이 때 흑이 돌을 놓을 수 있는 곳은 다음과 같이 4군데이다.
플레이어는 빈공간에 돌을 놓을 수 있다.
단, 자신이 놓을 돌과 자신의 돌 사이에 상대편의 돌이 있을 경우에만 그 곳에 돌을 놓을 수 있고, 그 때의 상대편의 돌은 자신의 돌로 만들 수 있다.
(여기에서 "사이"란 가로/세로/대각선을 의미한다.)
(2, 3) 위치에 흑돌을 놓은 후의 보드는 다음과 같다.
이런 식으로 번갈아가며 흑, 백 플레이어가 돌을 놓는다.
만약 돌을 놓을 곳이 없다면 상대편 플레이어가 다시 돌을 놓는다.
보드에 빈 곳이 없거나 양 플레이어 모두 돌을 놓을 곳이 없으면 게임이 끝나고 그 때 보드에 있는 돌의 개수가 많은 플레이어가 승리하게 된다.
[입력]
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스의 첫 번째 줄에는 보드의 한 변의 길이 N과 플레이어가 돌을 놓는 횟수 M이 주어진다. N은 4, 6, 8 중 하나이다.
그 다음 M줄에는 돌을 놓을 위치와 돌의 색이 주어진다.
돌의 색이 1이면 흑돌, 2이면 백돌이다.
만약 3 2 1이 입력된다면 (3, 2) 위치에 흑돌을 놓는 것을 의미한다.
돌을 놓을 수 없는 곳은 입력으로 주어지지 않는다.
[출력]
각 테스트 케이스마다 게임이 끝난 후 보드 위의 흑돌, 백돌의 개수를 출력한다.
흑돌이 30개, 백돌이 34인 경우 30 34를 출력한다.
'알고리즘 > 알고리즘_swea' 카테고리의 다른 글
[Python][SWEA] 1493. 수의 새로운 연산 D3 (0) | 2024.05.06 |
---|---|
[Python][SWEA] 1946. 간단한 압축 풀기 D2 (0) | 2024.05.05 |
[Python][SWEA] S/W 문제해결 기본 3일차 - 회문2 D3 (0) | 2024.05.05 |
[Python][SWEA] 1860. 진기의 최고급 붕어빵 D3 (0) | 2024.05.05 |
[Python][SWEA] 1249. [S/W 문제해결 응용] 4일차 - 보급로 D4 (0) | 2024.05.05 |