[BOJ] 4396: 지뢰 찾기 (X같은 하루)

아이엠강욱·2023년 4월 28일
0

코딩테스트

목록 보기
2/23

해당 문제를 확인하시고 싶으면 아래 링크를 통해 확인해주세요!
https://www.acmicpc.net/problem/4396


이번 문제는...... 그냥 설명 안하겠습니다...
일단 제가 최종적으로 작성한 코드를 올려보면..!

"""
백준 4396번: 지뢰 찾기
https://www.acmicpc.net/problem/4396
"""

N = int(input())  # N개의 줄
mine = [list(input().rstrip()) for _ in range(N)]   # 지뢰의 위치
table = [list(input().rstrip()) for _ in range(N)]   # 열린칸에는 주변에 지뢰가 몇개있는지
findMine = False   # 마인을 확인했는지에 대한 변수

def mine_count(mine, x, y):
    # 상하좌우 + 북서/북동/남서/남동
    dx = [-1, 1, 0, 0, -1, -1, 1, 1]
    dy = [0, 0, -1, 1, -1, 1, -1, 1]

    count = 0
    for i in range(8):
        # x,y좌표 이동
        nx = x + dx[i]
        ny = y + dy[i]

        if nx < 0 or nx >= N or ny < 0 or ny >= N:
            continue
        else:
            if mine[nx][ny] == '*':
                count += 1

    return count


for i in range(N):
    for j in range(N):
        if table[i][j] == 'x':   # 해당 칸이 열려있는 상태
            if mine[i][j] == '*':   # 그 칸에 지뢰가 있음
                findMine = True   # 열려있는 상태에서 마인 찾았다고 표시
                continue

            mc = mine_count(mine, i, j)
            table[i][j] = str(mc)
            


# 열린 상태에서 지뢰를 본적이 있음 -> mine을 순회하면서 지뢰인 부분의 좌표를 기억해서 table에 기록
if findMine == True:
    for a in range(N):
        for b in range(N):
            if mine[a][b] == '*':
                table[a][b] = '*'

# 출력하는 부분
for r in range(N):
    print(''.join(table[r]))

난 이번 문제를 풀면서... (삽질의 흔적..)
진짜 자신없었던 알고리즘과 코딩테스트가 오늘따라 생각보다 잘풀리네? 하면서 뭔가 자신감이 붙었는데 아무리 봐도봐도 잘 돌아갈거 같은 내 코드가 계속 틀렸다고 하는 것이다..!

왜 틀렸냐고?????
바로 위의 코드에서 mine_count 함수에서..

if nx < 0 or nx >= N or ny < 0 or ny >= N:
	continue
else:
	if mine[nx][ny] == '*':
		count += 1

저기 보이는 or N 이부분을 내가 N이 아니라 8이라고 하드코딩을 해놨던 것이와요......

결론) 앞으로는 하드코딩 진짜 절대절대절대절대저어어어얼대 하지맙시다.

개같은 하루.

profile
블로그 이전했습니다!! https://dev-iamkanguk.tistory.com/ <<- 여기로 오세용!!

0개의 댓글