Algorithm

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฑด๋ฌผ (2022 KAKAO BLIND RECRUITMENT) - Python

lerrybe 2023. 3. 6. 02:51

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์ฐจ์› ๋ฐฐ์—ด์˜ ๋ˆ„์ ํ•ฉ ๊ณผ์ •์„ ๊ฐ„๋‹จํžˆ ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

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)์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2์ฐจ์› ๋ฐฐ์—ด ๋ˆ„์ ํ•ฉ, ๊ฒฐ๊ตญ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ๋ฐฐ์—ด์€ ์˜ค๋ฅธ์ชฝ๊ณผ ๊ฐ™๋‹ค.

์ ์šฉ ๋ฒ”์œ„๋ฅผ 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]