Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 구현
- SSAFY
- 싸피
- DP
- 누적 합
- 13164
- 브루트포스
- 트리
- 에라토스테네스의 체
- Python
- 플로이드-워셜
- JavaScript
- 맵
- 이분 탐색
- 수학
- 정수론
- 슬라이딩 윈도우
- 투 포인터
- 세그먼트 트리
- 문자열
- 2357
- 그래프
- 해시 테이블
- BFS
- 모던 JavaScript 튜토리얼
- boj
- 그리디
- DFS
- 애드 혹
- 정렬
Archives
- Today
- Total
흙금이네 블로그
[BOJ] 10800 - 컬러볼 (Python) 본문
아이디어
현재 공보다 크기가 작은 공들의 크기 합과 크기가 작으면서 색이 같은 공들의 크기 합을 구하여 풀 수 있다.
풀이
공을 저장하는 리스트 balls에 공의 크기, 공의 색, 인덱스를 순서대로 추가하고 공의 크기 오름차순으로 정렬한다.
차례로 현재 공보다 작은 공의 크기를 total에 누적하여 더하고, sum_color 리스트에 공의 색에 따라 누적하여 더한다.
작은 공들의 크기 합에서 작으면서 색이 같은 공들의 크기 합을 뺀 값을 인덱스에 맞게 결과값으로 저장한다.
import sys
input = sys.stdin.readline
N = int(input())
balls = []
for i in range(N):
a, b = map(int, input().split())
balls.append([b, a, i])
balls.sort(key=lambda x: x[0])
sum_color = [0]*(N+1)
res = [0]*N
idx = total = 0
for i in range(N):
while balls[idx][0] < balls[i][0]:
total += balls[idx][0]
sum_color[balls[idx][1]] += balls[idx][0]
idx += 1
res[balls[i][2]] = total-sum_color[balls[i][1]]
for i in range(N):
print(res[i])
입력 받은 값들을 언패킹하는 리스트 컴프리헨션보다 for문에서 append하는 코드가 메모리가 더 적게 사용되고 더 빨랐다.
# 1.
balls = [[i, *map(int, input().split())] for i in range(N)]
# 2. 메모리가 더 적게 사용되고 더 빠른 코드
balls = []
for i in range(N):
a, b = map(int, input().split())
balls.append([b, a, i])
정렬할 때 key에 람다식으로 정렬할 부분을 지정한 코드가 더 빨랐다.
# 1.
balls.sort()
# 2. 더 빠른 코드
balls.sort(key=lambda x: x[0])
리스트를 언패킹하고 개행 문자를 구분자로 하는 코드보다 for문으로 출력하는 코드의 메모리가 더 적게 사용되었다.
# 1.
print(*res, sep='\n')
# 2. 메모리가 더 적게 사용되는 코드
for i in range(N):
print(res[i])
'알고리즘' 카테고리의 다른 글
[BOJ] 2230 - 수 고르기 (Python) (0) | 2023.01.05 |
---|---|
[BOJ] 13164 - 행복 유치원 (Python) (0) | 2023.01.05 |
[BOJ] 10775 - 공항 (Python) (0) | 2023.01.01 |
[BOJ] 1068 - 트리 (Python) (0) | 2022.12.31 |
[BOJ] 1052 - 물병 (Python) (0) | 2022.12.30 |
Comments