일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Advanced Engineering Mathematics
- 미방
- 영어회화
- Nonhomogeneous ODEs
- 삼성SW역량테스트
- Python
- vocabulary
- 미분방정식
- English
- 공수
- Problem set 1.5
- kreyszig
- Conversation
- Problem Set 1.4
- 스피치 연습
- Ode
- 공수 문제풀이
- 공수1
- 백준
- 코딩테스트
- 공업수학
- SW역량테스트
- ODEs
- Homogeneous ODEs
- homogeneous
- 문제풀이
- speech
- Problem set 2.7
- 비제차 상미분 방정식
- 공학수학
- Today
- Total
한걸음
백준 2636 : 치즈 본문
https://www.acmicpc.net/problem/2636
2636번: 치즈
아래 <그림 1>과 같이 정사각형 칸들로 이루어진 사각형 모양의 판이 있고, 그 위에 얇은 치즈(회색으로 표시된 부분)가 놓여 있다. 판의 가장자리(<그림 1>에서 네모 칸에 X친 부분)에는 치즈가 놓
www.acmicpc.net
https://github.com/HPYoo/swcodingtest/commit/dc688ac924d0d29d25c84cea3a47487ff67d4364
sw coding 2636 update(Baekjoon) · HPYoo/swcodingtest@dc688ac
Showing 1 changed file with 48 additions and 0 deletions.
github.com
치즈 먹다 체할뻔
1. 오잉 조건 하나가 없네?
2638 치즈 문제를 먼저 풀고나서 바로 2636을 풀어보니 훨씬 쉬웠고, 풀면서 다른 방식으로 접근해서 풀어봐야겠다라는 생각에 치즈의 외부 판단과 치즈 가장자리 판단을 방문처리함수를 통해 적용시켰다. 이 때 방문 처리 함수는 3차원 배열로 0번째 N X M 크기의 배열에는 외부임을 알리는 배열, 1번째 배열은 치즈의 가장자리임을 알리는 배열로 사용하였다.
큐를 돌리면서 반복적으로 시행을 시키니 불필요하게 코드가 길어지는 일 없이 간단하게 해결할 수 있었다.
내일은 2638 : 치즈에 다시 적용해봐야겠다. 생각 충분히 하니 금방 또 잘 풀리네
2. 전체 코드
메모리 : 117168 KB 시간 : 168 ms 풀이시간 : 약 20 ~ 30분? 시간 안재고 풀어서 잘 모르겠음.
여기에서 117 MB 정도의 메모리가 사용되었는데 조건하나 추가했다고 50MB 가 추가 되었다는 건 내가 메모리 활용을 잘 못하고 있다는 반증이겠지? 으쌰으쌰 열공합시다
from collections import deque
N, M = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(N)]
cheese = []
for i in range(N):
for j in range(M):
if board[i][j] == 1 : cheese.append([i, j])
visited = [[[False for _ in range(M)] for _ in range(N)] for _ in range(2)]
# 상, 하, 좌, 우
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
# 외부 / 치즈
def solve():
q = deque([[0, 0]])
visited[0][0][0] = True
num = len(cheese)
it = 0
last_cnt = 0
while num > 0 :
temp = []
cnt = 0
while q :
x, y = q.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < N and 0 <= ny < M :
if board[nx][ny] == 0 and not visited[0][nx][ny]:
visited[0][nx][ny] = True
q.append([nx, ny])
if board[nx][ny] == 1 and not visited[1][nx][ny] :
temp.append([nx, ny])
visited[1][nx][ny] = True
for x, y in temp :
board[x][y] = 0
visited[0][x][y] = True
cnt += 1
q.append([x, y])
last_cnt = num
num -= cnt
it += 1
return [it, last_cnt]
result = solve()
for i in range(2):
print(result[i])
'Coding Test' 카테고리의 다른 글
백준 2589 : 보물섬 (2) | 2023.11.24 |
---|---|
백준 2784 : 가로 세로 퍼즐 (1) | 2023.11.23 |
백준 2536 : 버스 갈아타기 (4) | 2023.11.21 |
백준 4963 : 섬의 개수 (2) | 2023.11.20 |
백준 23290 : 마법사 상어와 복제 (2) | 2023.11.19 |