링크 : https://www.acmicpc.net/problem/4396
4396번: 지뢰 찾기
지뢰찾기는 n × n 격자 위에서 이루어진다. m개의 지뢰가 각각 서로 다른 격자 위에 숨겨져 있다. 플레이어는 격자판의 어느 지점을 건드리기를 계속한다. 지뢰가 있는 지점을 건드리면 플레이어
www.acmicpc.net
- 문제
- 소요시간: 30분 실패
- 설계하기(접근방법)
1. n, mine_list, check_list 을 입력받는다
2. 한 점 내에서 움직일 8방향의 좌표리스트를 생성한다
0 0 0
0 * 0 이것을 리스트로 표현하면 (0,0)을 제외한
0 0 0
dx = [-1, -1, -1, 0, 0, 1, 1, 1]
dy = [-1, 0, 1, -1, 1, -1, 0, 1] 으로 표현된다
3. mine_list를 순회하며 8방위에 있는 지뢰의 개수만큼 숫자를 더해준다.
but 제약조건, 리스트의 끝 부의 경우 8방위를 순회하면 범위를 벗어나면서 에러가 발생하기 때문에 이를 조건화한다.
즉 i에 x좌표를 더한 값이 0 ~ n 사이 and 즉 j에 y좌표를 더한 값이 0 ~ n 사이, 그리고 그 값이 '*'(지뢰) 인 경우 +1을 해준다
4. 지뢰가 발견되었을 시
flag = False를 선언하고, check_list의 'x'을 순회했을 때 , 그 좌표가 mine_list의 '*'(지뢰)와 일치한다면
flag = True가 된다.
그 후 마지막에 check_list에 mine_list의 지뢰의 위치를 모두 표시해준다
5. join() 메서드를 통해 문자열을 한줄씩 출력해준다.
- 코드(출력)
import sys
input = sys.stdin.readline
n = int(input())
mine_list = [list(input().rstrip()) for _ in range(n)] # ...**..*
check_list = [list(input().rstrip()) for _ in range(n)] # xxx.....
dx = [-1, -1, -1, 0, 0, 1, 1, 1]
dy = [-1, 0, 1, -1, 1, -1, 0, 1]
flag = False
for i in range(n):
for j in range(n):
if check_list[i][j] == 'x':
if mine_list[i][j] == '*':
flag = True
continue
cnt = 0
for k in range(8):
if 0 <= i + dx[k] < n and 0 <= j + dy[k] < n and mine_list[i+dx[k]][j+dy[k]] == '*':
cnt += 1
check_list[i][j] = str(cnt)
if flag:
for i in range(n):
for j in range(n):
if mine_list[i][j] == '*':
check_list[i][j] = '*'
for i in check_list:
print(''.join(i))
- 얻어갈 부분
1. 문제 구현에 좌표를 이용해야 할 경우, 좌표 리스트를 따로 설정하여 순회하면 구현하기 쉽다
2. 문제 중간에 확인해야 하는 사항이 있는 경우, flag = False를 통해 손쉽게 제어할 수 있다
'알고리즘(백준) > 구현' 카테고리의 다른 글
[알고리즘/구현] 20436번 : ZOAC 3 - python (1) | 2023.04.14 |
---|---|
[알고리즘/구현] 1244번 : 스위치 켜고 끄기 - python (0) | 2023.03.21 |
[알고리즘/구현] 2578번 : 빙고 - python (0) | 2023.02.28 |
[알고리즘/구현] 1924 번 : 2007년 - python (0) | 2023.02.27 |
[알고리즘/구현] 10870번 : 피보나치 수열 - python (0) | 2023.02.27 |