[파이썬] 백준 10836 : 여왕벌 (골드4)
10836번: 여왕벌
입력의 첫 줄에는 격자칸의 가로와 세로 크기 M(2 ≤ M ≤ 700)과 날짜 수 N(1 ≤ N ≤ 1,000,000)이 자연수로 주어진다. 첫날 아침의 애벌레 크기는 모두 1이므로 입력에 주어지지 않는다. 다음 N개의
www.acmicpc.net
문제
풀이
방향성 생각
- 스위핑. 계속 배열에 더해주면 시간효율 매우구림. 서브태스크 4 통과 못할확률 높다.
전체코드
from collections import defaultdict
import sys
input = lambda : sys.stdin.readline().rstrip()
n,m = map(int,input().split())
info = defaultdict(int)
for _ in range(m):
a,b,c = list(map(int,input().split()))
info[a] += 1
info[a+b] += 1
arr = [1]
for i in range(2*n+1):
if i in info: arr.append(arr[-1]+info[i])
else: arr.append(arr[-1])
arr.pop(0)
for i in range(n):
for j in range(n):
if j == 0: print(arr[n-(i+1)], end=' ')
else: print(arr[n+j-1], end=' ')
print()
- 0이 a개, 1이 b개면 a,a+b에서 성장해야할 수가 1씩 늘어난다. 스위핑으로 풀기
- arr = [1]로 초기화 시키고 배열 추가하기. 추가한 후에 맨 앞 초기값 1 필요없으므로 삭제.
- 규칙같은 경우에는 왼,대각,위 중에서 항상 위쪽이 제일 큰 값을 가지게 된다.
- 왼쪽, 위 테두리를 제외한 값들은 항상 맨 위쪽 행과 값이 같다.
이전 코드
import sys
input = lambda : sys.stdin.readline().rstrip()
n,m = map(int,input().split())
arr = [1]*(2*n+1)
for _ in range(m):
a,b,c = list(map(int,input().split()))
info = [0]*a + [1]*b + [2]*c
for i in range(a,a+b): arr[i] += 1
for i in range(a+b,2*n-1): arr[i] += 2
for i in range(n):
for j in range(n):
if j == 0: print(arr[n-(i+1)], end=' ')
else: print(arr[n+j-1], end=' ')
print()
코멘트
2차원 배열 -> 1차원배열까지 풀어보고나서 생각해보다가 스위핑 생각.
시간 1/5배 좋아짐. 메모리 1/2배
'Algorithm > etc' 카테고리의 다른 글
[파이썬] 프로그래머스 : 불량 사용자 (Lv.3) (0) | 2023.10.13 |
---|---|
[파이썬] 백준 1749 : 점수따먹기 (골드4) (0) | 2023.09.11 |
[파이썬] 백준 18428 : 감시피하기 (골드5) (0) | 2023.08.31 |
[파이썬] 프로그래머스 : 추석 트래픽 (Lv.3) (0) | 2023.08.28 |
[파이썬] 백준 15683 : 감시 (골드4) (0) | 2023.08.27 |
[파이썬] 백준 15686 : 치킨배달 (골드5) (0) | 2023.08.27 |
[파이썬] 백준 23295 : 스터디 시간 정하기1 (골드3) (0) | 2023.08.14 |
댓글