일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 1789번
- QueryDSL 기초
- 거울 설치
- 빛의 경로 사이클
- 12865번
- 1038번
- 감소하는 수
- 어른 상어
- 19238번
- 16234번
- 보석 쇼핑
- 15686번
- 2020 카카오 인턴십
- 수식 최대화
- HTML 기초
- 미세먼지 안녕!
- python
- 파이썬
- 프로그래머스
- 베스트엘범
- SW Expert Academy
- 17144번
- 경주로 건설
- SW ExpertAcademy
- 12869번
- 스타트 택시
- 키패드 누르기
- 백준 알고리즘
- 9095번
- 14499번
Archives
- Today
- Total
보물창고 블로그
SW Expert Academy 1868. 파핑파핑 지뢰찾기 본문
728x90
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
최소 몇 번의 클릭을 해야 지뢰가 없는 모든 칸에 숫자가 표시될 것인지 출력하는 것이 목표였다. 처음에 브루트 포스로 하려고 하니 시간이 너무 걸릴 것 같아서 잠시 생각을 하였다. 내가 생각해낸 방법은 일단 먼저 주위의 8방향에 지뢰가 없는 지점부터 클릭하여 최대한 최소로 많은 점을 숫자 표시하고, 그다음에 나머지 점들을 전체 맵의 격자 개수에서 지뢰와 최소의 클릭으로 드러낸 점을 빼낸 점을 더하는 것으로 최소 클릭 횟수를 구하는 생각을 하게 되었다. 중간에 구현하는데 효율성을 따지려고 하니 생각이 꼬여서 일단 비효율적으로 코딩하고 제출을 했는데 통과하여 조금 당황했다.
나의 풀이는 아래와 같다.
def click(x, y, map1, test):
global visit
global count
visit[x][y] = test
n = len(map1)
dx = [-1, -1, 0, 1, 1, 1, 0, -1]
dy = [0, -1, -1, -1, 0, 1, 1, 1]
if check(x, y, map1):
for i in range(8):
nx = x + dx[i]
ny = y + dy[i]
if -1 < nx < n and -1 < ny < n and visit[nx][ny] != test:
count += 1
visit[nx][ny] = test
if check(nx, ny, map1):
click(nx, ny, map1, test)
else:
visit[x][y] = test
count += 1
def check(x, y, map1):
cnt = 0
dx = [-1, -1, 0, 1, 1, 1, 0, -1]
dy = [0, -1, -1, -1, 0, 1, 1, 1]
for i in range(8):
nx = x + dx[i]
ny = y + dy[i]
if -1 < nx < n and -1 < ny < n and map1[nx][ny] == '*':
cnt += 1
if cnt == 0:
result = True
else:
result = False
return result
t = int(input())
visit = [[0 for _ in range(300)] for _ in range(300)]
for test in range(1, t + 1):
push = 0
count = 0
mine = 0
n = int(input())
map1 = []
for _ in range(n):
map1.append(input())
for i in range(n):
for j in range(n):
if map1[i][j] == '*':
mine += 1
if check(i, j, map1) and visit[i][j] != test and map1[i][j] != '*':
push += 1
count += 1
click(i, j, map1, test)
extra = n * n - count - mine
push += extra
print('#{} {}'.format(test, push))
'알고리즘 풀이 > SW Expert Academy' 카테고리의 다른 글
SW Expert Academy 4130. [모의 SW 역량테스트] 특이한 자석 (0) | 2020.01.23 |
---|---|
SW Expert Academy 4014. [모의 SW 역량테스트] 활주로 건설 (0) | 2020.01.17 |
SW Expert Academy 2819 격자판의 숫자 이어 붙이기 (0) | 2020.01.16 |
SW Expert Academy 1961 숫자 배열 회전 (0) | 2020.01.03 |
SW Expert Academy 4613 러시아 국기 같은 깃발 (0) | 2020.01.03 |
Comments