보물창고 블로그

삼성 SW Expert Academy 4615 재밌는 오셀로 게임 본문

알고리즘 풀이/SW Expert Academy

삼성 SW Expert Academy 4615 재밌는 오셀로 게임

홋 메 2020. 1. 2. 14:13
728x90

문제 링크: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWQmA4uK8ygDFAXj

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

문제는 위에 링크에 가면 잘 나와있다.

내가 해결한 코드는 다음과 같다. 

# 테스트 케이스 수를 t로 받는다.
t=int(input())
# 테스트 케이스 수만큼 반복
for test in range(1,t+1):
	# 마지막에 총 흰돌과 검은돌의 수를 w,b에 입력하기위해 선언
    w,b=0,0
    # n은 오셀로 판의 크기 m은 돌을 둔 횟수
    n,m=map(int,input().split())
    # 판 중앙의 4개의 돌을 먼저 깔아두기
    n1=n//2
    map1=[[0 for i in range(n)] for i in range(n)]
    map1[n1-1][n1-1]=2
    map1[n1-1][n1]=1
    map1[n1][n1-1]=1
    map1[n1][n1]=2
    # 돌을 둘 때마다 8방향을 탐색하기위해 변화량을 선언
    dx=[-1,-1,0,1,1,1,0,-1]
    dy=[0,-1,-1,-1,0,1,1,1]
    #돌을 두면 돌을 중심으로 8방향을 체크하기위한 함수 check를 선언
    def check(x,y,c):
        for i in range(8):
            flag=0
            k=1
            try:
                while(1):
                	# 인덱스가 마이너스가 되면 안되므로 체크 인덱스크기를 벗어나는 것은 try문으로 해결
                    if (x-1+k*dx[i])>-1 and (y-1+k*dy[i])>-1:
                        if map1[x-1+k*dx[i]][y-1+k*dy[i]]!=0 and map1[x-1+k*dx[i]][y-1+k*dy[i]]!=c:
                            k+=1
                        # flag를 설정하는 이유는 같은 색의 돌을 만났을 경우에만 사이의 돌을 변경하기 위함이다.
                        elif map1[x-1+k*dx[i]][y-1+k*dy[i]]==c:
                            flag=1
                            break
                        else:
                            break
                    else:
                        break
            except:
                continue
            # 탐색하다 같은 색의 돌을 발견하였을 경우에만 중간의 돌의 색을 변경
            if flag==1:        
                for j in range(1,k):
                    map1[x-1+j*dx[i]][y-1+j*dy[i]]=c
    #돌을 둘 때마다 check함수를 통해 돌들의 색을 변경해준다.        
    for s in range(m):
        x1,y1,c1=map(int,input().split())
        map1[x1-1][y1-1]=c1
        check(x1,y1,c1)
    # 돌을 다 두고 나서 검은색돌과 흰색돌의 개수를 센다.
    for p in range(n):
        for q in range(n):
            if map1[p][q]==1:
                b+=1
            elif map1[p][q]==2:
                w+=1
    print('#{0} {1} {2} '.format(test,b,w))

내가 가장 헤매었던 부분은 check함수에서 인덱스가 음수가 되어도 try문이 해결할 줄 알았지만, 파이썬에는 인덱스가 음수가 되어도 문제가 없다는 것을 간과하였다. 예를 들면 인덱스가 -1이 되어서 list 1 [-1]를 호출하여도 list 1의 가장 마지막 원소를 호출한다는 것을 간과하였다. 다음부터는 이 점을 명심해야겠다.

Comments