STUDY/Algorithm

[백준] 2615 오목

sinawi95 2021. 2. 9. 19:32
728x90

www.acmicpc.net/problem/2615

 

2615번: 오목

오목은 바둑판에 검은 바둑알과 흰 바둑알을 교대로 놓아서 겨루는 게임이다. 바둑판에는 19개의 가로줄과 19개의 세로줄이 그려져 있는데 가로줄은 위에서부터 아래로 1번, 2번, ... ,19번의 번호

www.acmicpc.net

더보기
badukpan = list()
max_width = 19
plus_width = 5
for _ in range(plus_width):
    tmp = [0]*(max_width+2*plus_width)
    badukpan.append(tmp)

for _ in range(max_width):
    tmp=[0] * plus_width
    tmp.extend(list(map(int, input().split())))
    tmp.extend([0]*plus_width)
    badukpan.append(tmp)

for _ in range(plus_width):
    tmp = [0]*(max_width+2*plus_width)
    badukpan.append(tmp)

# for baduk in badukpan:
#     print(baduk)
result = 0
for i in range(plus_width,plus_width+max_width):
    for j in range(plus_width,plus_width+max_width):
        tmp = badukpan[i][j]
        # 방향마다 총 6개씩 확인, 총 네 방향 확인

        if tmp: # tmp가 0인 아닌경우에만 확인
            # 1 우향
            if tmp != badukpan[i][j - 1]:
                for k in range(1,5):
                    if tmp != badukpan[i][j+k]:
                        break
                else:
                    if tmp != badukpan[i][j+5]:
                        result = (tmp, i, j)

            #2 우하향
            if tmp != badukpan[i - 1][j - 1]:
                for k in range(1,5):
                    if tmp != badukpan[i+k][j+k]:
                        break
                else:
                    if tmp != badukpan[i+5][j+5]:
                        result = (tmp, i,j)

            #3 하향
            if tmp != badukpan[i - 1][j]:
                for k in range(1,5):
                    if tmp != badukpan[i+k][j]:
                        break
                else:
                    if tmp != badukpan[i+5][j]:
                        result = (tmp, i, j)

            #4 좌하향
            if tmp != badukpan[i - 1][j + 1]:
                for k in range(1,5):
                    if tmp != badukpan[i+k][j-k]:
                        break
                else:
                    if tmp != badukpan[i+5][j-5]: #0,5 => 4,1
                        result = (tmp, i+4,j-4)

if result != 0:
    print("{}\n{} {}".format(result[0],result[1]-plus_width+1,result[2]- plus_width+1))
else:
    print(0)

브루트 포스라길래 구현은 쉽게했는데 계속 틀려서 어이없었던 문제다.

다 확인하려면 여덟 방향 모두 확인해야했는데 어차피 순차적으로 확인하므로 네 방향만 확인하면 되었다.(우측, 우하측, 하측, 좌하측)

확인할 때는 오목인지 판단하고, 육목인지도 판단해야했다.

i,j 의 바둑알을 한 방향이 되는지 판단할때, 오목의 판단은 쉬웠다.

육목이 조금 까다로웠는데 먼저 방향의 반대로 한 칸 간 곳이 같지 않은 경우에만 진행했고, 오목이라고 판단되었을때 같은 방향으로 한칸을 더 비교했다.

 

계속 틀린 것은 두가지 이유이었다.

첫번째는 try:except:에 대한 문제인데 try except를 사용해서 index에러에 대해서 무시하려고했지만 계속 틀려서 이게 문제인지 생각이 들었다.

그래서 테두리를 5개씩 더 줘서 인덱스 오류는 꿈에도 못꾸게 만들었다.

두번째는 문제에 대한 이해 부족이다.

답으로 내놓아야하는 것은 가장 좌측 바둑알의 위치이고, 위로 일렬로 있을 때만 제일 상위 위치를 반환하는것이었다.(이걸 캐치하는데 두시간 걸렸다)

 

브루트포스 참 어렵다

 

'STUDY > Algorithm' 카테고리의 다른 글

[백준] 2628 종이자르기  (0) 2021.02.10
[백준] 2578 빙고  (0) 2021.02.10
[백준] 1011 Fly me to the Alpha Centauri  (0) 2021.02.07
[백준] 2839 설탕배달  (0) 2021.02.07
[백준] 2775 부녀회장이 될테야  (0) 2021.02.07