일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- 백준1463
- 9095
- tensorflow
- 반복문
- precision
- 백준1026
- 혁펜하임AI
- 혁펜하임강의후기
- 1로만들기
- cuDNN
- 혁펜하임강의
- pytorch
- CUDA
- AIDEEPDIVE
- 조건문
- C++
- C++ 공백 입력
- C++ 함수
- 비교연산자
- 백준9095
- AI강의
- 백준C++
- 패스트캠퍼스혁펜하임
- c++ 기초
- for문
- 백준
- 1463
- 패스트캠퍼스
- 혁펜하임
- C++ 백준
- Today
- Total
코딩하는 덕구 🐶
144. [삼성기출40]Python 백준 21610 마법사 상어와 비바라기 시간초과 관련 본문
안녕하세요 코딩하는 덕구입니다.
파이썬 백준 21610 마법사 상어와 비바라기 입니다.
https://www.acmicpc.net/problem/21610
21610번: 마법사 상어와 비바라기
마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그 마법을 할 수 있다. 오늘 새로 배운 마법은 비바라기이다. 비바라기를 시전하면 하늘에 비구름을 만들 수 있다. 오늘은 비바라기
www.acmicpc.net
저 밑에 AC는 남이 제출한 코드고 위의 AC는 제가 수정해서 제출한 코드입니다.
먼저 문제 접근 풀이 다 같았지만 차이가 딱 하나 있었는데
전
#5. 구름 생성
for i in range(N):
for j in range(N):
if board[i][j] >= 2:
if [i, j] not in tmp:
cloud.append([i, j])
board[i][j] -= 2
후
for i in range(N):
for j in range(N):
if board[i][j] >= 2:
if (i, j) not in tmp:
cloud.append([i, j])
board[i][j] -= 2
위의 코드를 밑의 코드로 바꾸니 통과가 됐습니다.
찾아보니 튜플, 리스트를 생성할 때 튜플이 거의 두배정도 속도가 빠르더군요.
또한 indexing 속도도 튜플이 근소하게 빠릅니다. 앞으로 굳이 수정할 데이터가 아니라면 tuple을 사용해야겠습니다.
배운점
1. 튜플 리스트의 생성 속도는 튜플이 압도적으로 빠르다.
2. indexing 속도는 튜플이 조금 빠르다.
3. for문에서 바로 변수 선언 가능 (알고는 있었지만 그동안 잘 안씀)
문제 접근
단순한 구현문제 입니다.
격자의 연결은 아래와 같이 구현할 수 있습니다.
nx, ny = (x + dx[d] * s) % N, (y + dy[d] * s) % N
Python 정답 코드
백준 21610 마법사 상어와 비바라기 코드입니다. 설명은 아래에 있습니다.
N, M = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(N)]
move = [tuple(map(int, input().split())) for _ in range(M)]
cloud = [[N - 1, 0], [N - 1, 1], [N - 2, 0], [N - 2, 1]]
dx = [0, 0, -1, -1, -1, 0, 1, 1, 1]
dy = [0, -1, -1, 0, 1, 1, 1, 0, -1]
di_x = [-1, -1, 1, 1]
di_y = [-1, 1, -1, 1]
def solve():
global cloud
for d, s in move:
tmp = []
for x, y in cloud:
nx, ny = (x + dx[d] * s) % N, (y + dy[d] * s) % N
tmp.append((nx, ny)) #1. 구름 이동
board[nx][ny] += 1 #2. 비내리기
#3. 구름 사라짐
cloud = []
#4. 물복사 버그
for x, y in tmp:
for d in range(4):
nx, ny = di_x[d] + x, di_y[d] + y
if 0 <= nx < N and 0 <= ny < N:
if board[nx][ny] >= 1:
board[x][y] += 1
#5. 구름 생성
for i in range(N):
for j in range(N):
if board[i][j] >= 2:
if (i, j) not in tmp:
cloud.append([i, j])
board[i][j] -= 2
ans = 0
for i in range(N):
for j in range(N):
ans += board[i][j]
return ans
print(solve())
Python 코드 설명
먼저 이동 조건에 맞게 구름을 이동시키고 물을 뿌립니다.
def solve():
global cloud
for d, s in move:
tmp = []
for x, y in cloud:
nx, ny = (x + dx[d] * s) % N, (y + dy[d] * s) % N
tmp.append((nx, ny)) #1. 구름 이동
board[nx][ny] += 1 #2. 비내리기
#3. 구름 사라짐
cloud = []
이후 물이 증가한 곳의 대각에 물이 있다면 물을 늘려주고
#4. 물복사 버그
for x, y in tmp:
for d in range(4):
nx, ny = di_x[d] + x, di_y[d] + y
if 0 <= nx < N and 0 <= ny < N:
if board[nx][ny] >= 1:
board[x][y] += 1
구름을 생성시켜 1~5를 반복합니다.
#5. 구름 생성
for i in range(N):
for j in range(N):
if board[i][j] >= 2:
if (i, j) not in tmp:
cloud.append([i, j])
board[i][j] -= 2
m번 이동 후 답을 구해 출력합니다.
ans = 0
for i in range(N):
for j in range(N):
ans += board[i][j]
return ans
print(solve())
백준 21610 마법사 상어와 비바라기 Python 코드였습니다.
감사합니다.
'알고리즘 문제 풀이' 카테고리의 다른 글
146. [삼성기출42]Python 백준 23288 주사위 굴리기 2 (1) | 2023.09.08 |
---|---|
145. [삼성기출41]Python 백준 21611 마법사 상어와 블리자드 (0) | 2023.09.08 |
143. [삼성기출39]Python 백준 21609 상어 중학교 (0) | 2023.09.06 |
142. [삼성기출38]Python 백준 21608 상어 초등학교 (0) | 2023.09.05 |
141. [삼성기출37]Python 백준 20058 마법사 상어와 파이어스톰 (1) | 2023.09.02 |