2022 KAKAO BLIND RECRUITMENT - Lv3.
๐ต ๋ฌธ์
https://school.programmers.co.kr/learn/courses/30/lessons/92344
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
๐ ํ์ด
์๊ฐ๋ณต์ก๋๋ฅผ ์ดํด๋ณด๋ O(K * N * M)๊น์ง ๋ฐ์ด์ ๋ธ๋ฃจํธ ํฌ์ค๋ ์๋ ๊ฑฐ๋ผ ์๊ฐํ๊ณ , ์ค์ ๋ก ์์ ํ์์ผ๋ก ์ดํด๋ณด๋ฉด ๊ทธ๋ฆฌ ์ด๋ ค์ด ๋ฌธ์ ๋ ์๋๋ผ ๋งคํธ๋ฆญ์ค์์ ๋ฐ๋ณต๋๋ ๋ถ๋ถ์ ํ๋๋ก ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ์์๊น ๊ณ ๋ฏผ์ ํ์ต๋๋ค. ๊ทธ๋์ ํ์ค์นผ ์ผ๊ฐํ์ ํํค์คํฑ ๊ฐ์ด ์ ์ฒด ํฉ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ์์๊น์ ๊ฐ์ ์ฌ๋ฌ ์ฝ์ง์ ํ๋ค๊ฐ...
2022 ์นด์นด์ค ์ ์ ๊ณต์ฑ 1์ฐจ ์จ๋ผ์ธ ์ฝ๋ฉํ ์คํธ for Tech developers ๋ฌธ์ ํด์ค
์ง๋ 2021๋ 9์ 11์ผ ํ ์์ผ ์คํ 2์๋ถํฐ 7์๊น์ง 5์๊ฐ ๋์ 2022 KAKAO BLIND RECRUITMENT 1์ฐจ ์ฝ๋ฉ ํ ์คํธ๊ฐ ์งํ๋์์ต๋๋ค. ํ ์คํธ์๋ ์ด 7๊ฐ์ ๋ฌธ์ ๊ฐ ์ถ์ ๋์์ผ๋ฉฐ, ๊ฐ๋ฐ ์ธ์ด๋ C++, Java, JavaScript, K
tech.kakao.com
๊ฒฐ๊ตญ ์นด์นด์ค ํ ํฌ์ ๋์์๋ ํ์ด๋ฅผ ์ฐธ๊ณ ํ๊ณ , 2์ฐจ์ ๋ฐฐ์ด์ ๋ํ ๊ตฌ๊ฐ์ ๋ณํ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋์ ํฉ์ ์ด์ฉํ์ฌ O(1)๋ก ํด๊ฒฐํ๋ค๋ ์์ด๋์ด๋ฅผ ์ป์ ์ ์์์ต๋๋ค. ์๋ ๋ด์ฉ์ ์นด์นด์ค ํ ํฌ์์ ์ ๊ณตํ ๋์ ํฉ ๊ด๋ จ ์ค๋ช ์ ๋๋ค.
2์ฐจ์ ๋ฐฐ์ด์ ๋ํ ๊ตฌ๊ฐ์ ๋ณํ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ๋๋ฆฌ๊ธฐ ์ ์,
์ฐ์ 1์ฐจ์ ๋ฐฐ์ด์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ค๋ช ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์๋ฅผ ๋ค์ด, [1,2,4,8,9]์ ๋ฐฐ์ด์ด ์๊ณ , 0๋ฒ์งธ๋ถํฐ 3๋ฒ์งธ ์์๊น์ง 2๋งํผ ๋นผ์ผ ํ๋ ์ํฉ์ด๋ผ๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
์ฆ, ๋ฐฐ์ด์ [-1,0,2,6,9]๋ก ๋ง๋ค๊ณ ์ถ์ ์ํฉ์ ๋๋ค.
๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ผ๋ก๋ 0๋ฒ์งธ๋ถํฐ 3๋ฒ์งธ ์์๊น์ง ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํด 2๋งํผ ๋นผ์ฃผ๋ ๋ฐฉ๋ฒ์ด ์์ง๋ง,
์ด ๋ฐฉ๋ฒ์ O(M)์ ์๊ฐ ๋ณต์ก๋๊ฐ ๊ฑธ๋ฆฝ๋๋ค.
O(M)์ ์๊ฐ ๋ณต์ก๋๋ฅผ O(1)๋ก ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ก ๋์ ํฉ์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์์ ์์์ ๊ฒฝ์ฐ [-2,0,0,0,2]๋ฅผ ์ ์ฅํ ์๋ก์ด ๋ฐฐ์ด์ ์์ฑํฉ๋๋ค.
์ด ๋ฐฐ์ด์ ์์์๋ถํฐ ๋์ ํฉํ๋ฉด [-2,-2,-2,-2,0]์ด ๋๊ธฐ ๋๋ฌธ์
์ด๊ธฐ ๋ฐฐ์ด์ธ [1,2,4,8,9]๊ณผ ๋ํด์ฃผ๋ฉด [-1,0,2,6,9]๋ฅผ ์ป์ ์ ์๊ฒ ๋ฉ๋๋ค.
์ฆ, 1์ฐจ์ ๋ฐฐ์ด์ a๋ฒ์งธ ์์๋ถํฐ b๋ฒ์งธ ์์๊น์ง c๋งํผ์ ๋ณํ๋ฅผ ์ฃผ๊ฒ ๋ค๊ณ ํ๋ฉด
์๋ก์ด ๋ฐฐ์ด์ a๋ฒ์งธ ์์์ c๋ฅผ ๋ํ๊ณ b+1๋ฒ์งธ ์์์ c๋ฅผ ๋นผ๋ฉด ๋ฉ๋๋ค.
1์ฐจ์ ๋ฐฐ์ด์ ๋์ ํฉ ๊ณผ์ ์ ๊ฐ๋จํ ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด๋ฅผ ํ์ฅํ์ฌ 2์ฐจ์ ๋ฐฐ์ด์๋ ์ ์ฉํ ์ ์๋๋ฐ, ํ ํฌ ๋ธ๋ก๊ทธ์ ๋์์๋ ์ ์ฉ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค.
์ด๋ฒ์ 2์ฐจ์ ๋ฐฐ์ด์์ (0,0)๋ถํฐ (2,2)๊น์ง n๋งํผ ๋ณํ์ํค๋ ๊ฒฝ์ฐ๋ฅผ ์๋ก ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
๋ฐฐ์ด์ ํ๋ง ๋ฐ๋ก ๋ด์ ์์์ ์ค๋ช ํ ์์ด๋์ด๋ฅผ ํ๋์ ํ์ฉ ์ ์ฉ์ํค๋ฉด,
1์ฐจ์ ๋ฐฐ์ด์ 0๋ฒ์งธ ์์๋ถํฐ 2๋ฒ์งธ ์์๊น์ง n๋งํผ์ ๋ณํ๋ฅผ 3๊ฐ์ ํ์ ์ ์ฉ์ํค๋ ๊ฒ์ด ๋ฉ๋๋ค.
n 0 0 -n
n 0 0 -n
n 0 0 -n
์ ํ๋ ฌ์ ๋ค์ ์ด๋ง ๋ฐ๋ก ๋ณด๋ฉด, ๊ฐ์ฅ ์ผ์ชฝ ์ด์ 0๋ฒ์งธ ์์๋ถํฐ 2๋ฒ์งธ ์์๊น์ง n๋งํผ์ ๋ณํ์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์ด์ 0๋ฒ์งธ ์์๋ถํฐ 2๋ฒ์งธ ์์๊น์ง -n๋งํผ์ ๋ณํ์ ๊ฐ์ต๋๋ค. ๊ฐ ์ด์ ์์ ์์ด๋์ด๋ฅผ ์ ์ฉ์ํค๋ฉด ์๋์ ๊ฐ์ต๋๋ค. ์ด๋ฐ ์์ผ๋ก 2์ฐจ์ ๋ฐฐ์ด์๋ ์ ์ฉ์ํฌ ์๊ฐ ์์ต๋๋ค.
n 0 0 -n
0 0 0 0
0 0 0 0
-n 0 0 n
์ฆ, 2์ฐจ์ ๋ฐฐ์ด์์ (x1,y1)๋ถํฐ (x2,y2)๊น์ง n๋งํผ์ ๋ณํ๋
(x1,y1)์ +n, (x1,y2+1)์ -n, (x2+1,y1)์ -n, (x2+1,y2+1)์ +n์ ํ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
์ ๋ฐฐ์ด์ ์์์ ์๋๋ก ๋์ ํฉํ ๋ค, ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋์ ํฉํ๊ฑฐ๋ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋์ ํฉ ํ ๋ค, ์์์ ์๋๋ก ๋์ ํฉํ๋ฉด ์ฒ์์ ์๋ํ (0,0)๋ถํฐ (2,2)๊น์ง n๋งํผ ๋ณํ์ํค๋ ๋ฐฐ์ด์ด ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
n n n 0
n n n 0
n n n 0
0 0 0 0
์ด๋ฌํ ๋ฐฉ๋ฒ์ผ๋ก skill์ ํ ์์๋ฅผ O(1)๋ง์ ์ฒ๋ฆฌํ ์ ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์์ ๋ฐฉ๋ฒ์ผ๋ก K๊ฐ์ skill์ ๋ชจ๋ ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฐ์ด์ ๋ง๋๋๋ฐ O(K)๊ฐ ๊ฑธ๋ฆฌ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ๋ฐฐ์ด์ ๋์ ํฉ ๋ฐฐ์ด๋ก ๋ฐ๊พธ๋ ๊ณผ์ ์ด ํ์ํ๋ฐ, ํ๊ณผ ์ด์ ๊ฐ๊ฐ ๋์ ํฉ ํด์ค์ผ ํ๊ธฐ ๋๋ฌธ์ O(N * M)๊ฐ ๊ฑธ๋ฆฌ๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ O(K + N * M)์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
์ ์ฉ ๋ฒ์๋ฅผ board์ ํ ๋ฒ์ ๋ํด์ค ์ ์๋ [[n, n, n, 0], [n, n, n, 0], [n, n, n, 0], [0, 0, 0, 0]] ๊ผด์ 2์ฐจ์ ๋ฐฐ์ด์ ๋ง๋๋ ๊ณผ์ ์ธ๋ฐ, ํ๊ณผ ์ด ์ด๋ ๋ฐฉํฅ์ ๋จผ์ ๊ณ์ฐํ๋ ์ง ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ต๋๋ค.
๋ํ ๊ตฌ๊ฐ์ ๋ณํ๊ฐ ์ฌ๋ฌ ๋ฒ ์์ด๋ ์ด ๋ฐฉ๋ฒ์ ์ ์ฉ๋ ์ ์๋ค๊ณ ์๊ฐํ๋๋ฐ ์ธํ์ผ๋ก ๋ค์ด์ค๋ skill ๋ฐฐ์ด์ ๋ ๋ ๊ฐ ๊ตฌ๊ฐ์ ๋ํ ๋ณํ๋ ์ธต์ธต์ด ๋ ์ด์ด๊ฐ ์์ธ๋ค๊ณ ๋ดค๊ณ , ํฉ๊ณผ ์ฐจ๋ ๊ตํ๋ฒ์น์ด ์ฑ๋ฆฝํ๋๊น ๋ค ๋ํด์ ๋์ ํฉ์ ๋ํ๋ ๋์ ํฉ์ ๋ํ๊ณ ๊ฐ๊ฐ์ ๋ํ๋ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์ ๊ฑฐ๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
์์ ์ ์ฉ์ ์๋ ์ ๋์์์ต๋๋ค!
2022 ์นด์นด์ค ์ ์ ๊ณต์ฑ 1์ฐจ ์จ๋ผ์ธ ์ฝ๋ฉํ ์คํธ for Tech developers ๋ฌธ์ ํด์ค
์ง๋ 2021๋ 9์ 11์ผ ํ ์์ผ ์คํ 2์๋ถํฐ 7์๊น์ง 5์๊ฐ ๋์ 2022 KAKAO BLIND RECRUITMENT 1์ฐจ ์ฝ๋ฉ ํ ์คํธ๊ฐ ์งํ๋์์ต๋๋ค. ํ ์คํธ์๋ ์ด 7๊ฐ์ ๋ฌธ์ ๊ฐ ์ถ์ ๋์์ผ๋ฉฐ, ๊ฐ๋ฐ ์ธ์ด๋ C++, Java, JavaScript, K
tech.kakao.com
๐ก ํ์ด ์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค.
def solution(board, skill):
n = len(board)
m = len(board[0])
curr_matrix = [[0] * (m + 1) for _ in range(n + 1)]
# ๋์ ํฉ์ ์ํ ์ด๊ธฐ ๋ฐฐ์ด ๊ตฌํ๊ธฐ
get_curr_matrix(curr_matrix, skill)
# ๋์ ํฉ ๊ตฌํ๊ธฐ
n_ = len(curr_matrix)
m_ = len(curr_matrix[0])
get_row_sum(curr_matrix, m_, n_)
get_col_sum(curr_matrix, m_, n_)
# n * m ์ธ ๋์ ํฉ ํ๋ ฌ ๊ตฌํ๊ณ , ๊ธฐ์กด board ์ ๋ํ๊ธฐ
cumulative_matrix = [[curr_matrix[i][j] for j in range(m)] for i in range(n)]
add_matrix(board, cumulative_matrix, m, n)
return count_buildings(board, m, n)
def add_matrix(board, cumulative_matrix, m, n):
for i in range(n):
for j in range(m):
if board[i][j] > 0:
board[i][j] += cumulative_matrix[i][j]
def get_curr_matrix(curr_matrix, skill):
for step in skill: # O(10^5)
[tp, r1, c1, r2, c2, degree] = step
if tp == 1:
curr_matrix[r1][c1] -= degree
curr_matrix[r1][c2 + 1] += degree
curr_matrix[r2 + 1][c1] += degree
curr_matrix[r2 + 1][c2 + 1] -= degree
elif tp == 2:
curr_matrix[r1][c1] += degree
curr_matrix[r1][c2 + 1] -= degree
curr_matrix[r2 + 1][c1] -= degree
curr_matrix[r2 + 1][c2 + 1] += degree
def count_buildings(board, m, n):
result = 0
for i in range(n):
for j in range(m):
if board[i][j] > 0:
result += 1
return result
def get_col_sum(curr_matrix, m_, n_):
for row in range(0, n_):
for col in range(1, m_):
curr_matrix[row][col] += curr_matrix[row][col - 1]
def get_row_sum(curr_matrix, m_, n_):
for col in range(0, m_):
for row in range(1, n_):
curr_matrix[row][col] += curr_matrix[row - 1][col]