일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 추석맞이 코딩챌린지
- 수학
- Re
- 정렬
- Combinations
- java
- python
- lambda
- 이분탐색
- 재귀함수
- programmers
- Set
- 카카오
- Zip
- 자바
- backjoon
- DateTime
- 위클리 챌린지
- BFS
- 정규식
- heapq
- 백준
- 다익스트라
- KAKAO BLIND RECRUITMENT
- 파이썬
- dfs
- 프로그래머스
- 그리디
- divmod
- 동적 계획법
Archives
- Today
- Total
상상쓰
[프로그래머스] 파괴되지 않은 건물 본문
https://programmers.co.kr/learn/courses/30/lessons/92344
문제를 풀었을 때, 누적 합을 생각했으나 시간초과가 났다.
당시에 풀었던 방법은
예를 들어, skill이 [1, 0, 0, 3, 4, 4] 라고 한다면,
-4 0 0 0 0 4
-4 0 0 0 0 4
-4 0 0 0 0 4
로 행마다 값을 주어 누적 합을 계산하였다.
더 빠른 방법을 생각해보니 밑에 행을 추가하여,
-4 0 0 0 0 4
0 0 0 0 0 0
0 0 0 0 0 0
4 0 0 0 0 -4
로 값을 주고 열 방향으로 누적 합을 한 뒤, 행 방향으로 누적 합을 계산하면 위의 결과과 같고 더 빠르게 구할 수 있어 이처럼 진행하여 풀었다.
def solution(board, skill):
answer = 0
m = [[0] * (len(board[0]) + 1) for i in range(len(board) + 1)]
for ty, i1, j1, i2, j2, da in skill:
if ty == 1: da = -1 * da
m[i1][j1] += da
m[i1][j2+1] += -1 * da
m[i2+1][j1] += -1 * da
m[i2+1][j2+1] += da
for i in range(len(board)):
for j in range(len(board[0])):
m[i][j+1] += m[i][j]
if i > 0:
m[i][j] += m[i-1][j]
if board[i][j] + m[i][j] > 0: answer += 1
return answer
print(solution([[5, 5, 5, 5, 5], [5, 5, 5, 5, 5], [5, 5, 5, 5, 5], [5, 5, 5, 5, 5]], [[1, 0, 0, 3, 4, 4], [1, 2, 0, 2, 3, 2], [2, 1, 0, 3, 1, 2], [1, 0, 1, 3, 3, 1]])) # 10
'Coding Test' 카테고리의 다른 글
[백준] 감소하는 수 (0) | 2022.04.03 |
---|---|
[백준] 동전 0 (0) | 2022.03.29 |
[백준] 카드 섞기 (0) | 2022.03.05 |
[백준] 숫자고르기 (0) | 2022.02.27 |
[프로그래머스] 양궁대회 (0) | 2022.02.20 |
Comments