๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐˜š๐˜ญ๐˜ฐ๐˜ธ ๐˜ฃ๐˜ถ๐˜ต ๐˜ด๐˜ต๐˜ฆ๐˜ข๐˜ฅ๐˜บ

[๊ตฌ๋ฆ„] ๋†€์ด๊ณต์› - ํŒŒ์ด์ฌ ๋ณธ๋ฌธ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ค€๋น„

[๊ตฌ๋ฆ„] ๋†€์ด๊ณต์› - ํŒŒ์ด์ฌ

.23 2024. 11. 10. 15:30
๋ฌธ์ œ

๐Ÿ”— : https://level.goorm.io/exam/88520/๋†€์ด๊ณต์›/quiz/1

์–ด๋Š ํ•œ ๋„์‹œ์—์„œ๋Š” ๊ณต์žฅ ๋ถ€์ง€๊ฐ€ ๋ถ€๋„๊ฐ€ ๋‚˜๊ฒŒ ๋˜์–ด ๋„“์€ ๊ณตํ„ฐ๊ฐ€ ๊ฒฝ๋งค์— ์˜ฌ๋ผ์˜ค๊ฒŒ ๋˜์—ˆ๋‹ค.

์ด ๊ณตํ„ฐ๋Š” ๊ฐ€๋กœ์™€ ์„ธ๋กœ ๊ธธ์ด๊ฐ€ ๊ฐ๊ฐ N์ธ ์ •์‚ฌ๊ฐํ˜• ๋ชจ์–‘์ด๋ฉฐ, ๊ฐ€๋กœ์™€ ์„ธ๋กœ ๊ธธ์ด๊ฐ€ 1์ธ ์ •์‚ฌ๊ฐํ˜• ๊ฒฉ์ž ๋ชจ์–‘์œผ๋กœ ์˜์—ญ์„ ๋‚˜๋ˆ„์–ด ๊ฐœ๋ณ„์ ์œผ๋กœ ํŒ๋งคํ•˜๊ณ  ์žˆ๋‹ค.

 

๊ทธ ๋„์‹œ์— ์‚ด๊ณ ์žˆ๋˜ ํ•œ ๋ถ€์ž ๊ฒฝ์˜์ธ์€ ํ‰์†Œ ์ž์‹ ์ด ๊ธฐํšํ•ด์˜ค๋˜ ๋†€์ด๊ณต์› ๊ฑด์„ค ํ”„๋กœ์ ํŠธ๋ฅผ ๋ชฐ๋ž˜๋ชฐ๋ž˜ ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜์˜€๋‹ค. ๋•Œ๋งˆ์นจ ๊ฒฝ๋งค์— ์˜ฌ๋ผ์˜จ ์ด ๊ณตํ„ฐ์— ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ฒŒ ๋œ ๊ฒฝ์˜์ธ์€ ํŒ๋งค ์ค‘์ธ ๋•…๋“ค ์ค‘ ์ผ๋ถ€์— ๊ธฐ์กด์˜ ๊ณต์žฅ์—์„œ ๋ฐฐ์ถœ๋œ ํ๊ธฐ๋ฌผ๋“ค์ด ๋ฐฉ์น˜๋˜์–ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋†€์ด๊ณต์› ๊ฑด์„ค์„ ์œ„ํ•ด์„œ๋Š” ๊ฐ€๋กœ์™€ ์„ธ๋กœ ๊ธธ์ด๊ฐ€ K์ธ ์ •์‚ฌ๊ฐํ˜• ๋ชจ์–‘์˜ ์˜์—ญ์ด ํ•„์š”ํ•œ๋ฐ, ๋‹น์—ฐํžˆ ๋†€์ด๊ณต์› ๊ฑด์„ค์„ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ์˜์—ญ์˜ ํ๊ธฐ๋ฌผ๋“ค์„ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

 

NxN ๊ฒฉ์ž ๋ชจ์–‘์˜ ๊ณตํ„ฐ์—์„œ KxK ํฌ๊ธฐ์˜ ๋•…์„ ๊ตฌ๋งคํ•˜๋ ค๊ณ  ํ•  ๋•Œ, ๊ตฌ๋งคํ•  ๋•…์— ํฌํ•จ๋œ ํ๊ธฐ๋ฌผ์˜ ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ์˜์—ญ์„ ์ฐพ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ผ.

 

์˜ˆ์ œ ์„ค๋ช…

์ฒซ ๋ฒˆ์งธ ์˜ˆ์ œ์—์„œ ๊ณต์›์˜ ์ •๋ณด๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๊ณ , 3x3 ํฌ๊ธฐ์˜ ์˜์—ญ์„ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.

๊ฐ€์šด๋ฐ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํŒŒ๋ž€์ƒ‰ ์˜์—ญ์„ ์„ ํƒํ•˜๋ฉด ์„ธ ๊ฐœ์˜ ํ๊ธฐ๋ฌผ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜์ง€๋งŒ,

์˜ค๋ฅธ์ชฝ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ฃผํ™ฉ์ƒ‰ ์˜์—ญ์„ ์„ ํƒํ•˜๋ฉด ํ•œ ๊ฐœ์˜ ํ๊ธฐ๋ฌผ๋งŒ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋œ๋‹ค.

๋‹ค๋ฅธ ์–ด๋–ค ์˜์—ญ์„ ๊ณจ๋ผ๋„ ์ตœ์†Œ ํ•œ ๊ฐœ ์ด์ƒ์˜ ํ๊ธฐ๋ฌผ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๋‹ต์œผ๋กœ๋Š” 1์„ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์—๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ž…๋ ฅ์€ ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•์‹์„ ๋”ฐ๋ฅธ๋‹ค.

 

์ฒซ์งธ ์ค„์—๋Š” ๊ณตํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” N๊ณผ ๊ตฌ๋งคํ•  ๋•…์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” K๊ฐ€ ๊ณต๋ฐฑ์„ ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค.

๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๊ณตํ„ฐ์˜ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜๊ฐ€ ํ•œ ์ค„์— N๊ฐœ์”ฉ ๊ณต๋ฐฑ์„ ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ์ฃผ์–ด์ง€๋Š” ์ •์ˆ˜๋Š” 0 ๋˜๋Š” 1์ด๋ฉฐ, 0์€ ํ•ด๋‹น ์นธ์ด ๋น„์–ด์žˆ์Œ์„, 1์€ ํ•ด๋‹น ์นธ์— ํ๊ธฐ๋ฌผ์ด ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

 

  • 1 ≤ T ≤ 100
  • 1 ≤ N ≤ 100
  • 1 ≤ K ≤ M
  • ์ž…๋ ฅ์—์„œ ์ฃผ์–ด์ง€๋Š” ์ˆ˜๋Š” ๋ชจ๋‘ ์ •์ˆ˜์ด๋‹ค.

 

์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด, KxK ๋ชจ์–‘์˜ ๋•…์„ ๊ตฌ๋งคํ–ˆ์„ ๋•Œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ตœ์†Œ ํ๊ธฐ๋ฌผ์˜ ์ˆ˜๋ฅผ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ถœ๋ ฅํ•œ๋‹ค.

 

์˜ˆ์‹œ 1

์ž…๋ ฅ

1
5 3
1 0 0 1 0
0 1 0 0 1
0 0 0 1 0
0 0 0 0 0
0 0 1 0 0

์ถœ๋ ฅ

1

 


C++๋กœ๋Š” ๋‹จ์ˆœํžˆ NxN์˜ ๋ฐฐ์—ด ๋‚ด์—์„œ KxK ๋งŒํผ ์œˆ๋„์šฐ ์Šฌ๋ผ์ด๋”ฉ ํ•ด๊ฐ€๋ฉฐ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ์•„๋„ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ์•ˆ๊ฑธ๋ฆฌ์ง€๋งŒ,

ํŒŒ์ด์ฌ์œผ๋กœ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ’€์—ˆ๋‹ค๊ฐ€๋Š” ํ…Œ์ŠคํŠธ์ผ€์ด์Šค์˜ ๋ฐ˜๋„ ๋ชป๋งž์ถ˜๋‹ค.

 

๋ˆ„์ ํ•ฉ์„ ์ด์šฉํ•ด์„œ ํ’€์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ.

๋ˆ„์ ํ•ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๋ช…: https://miiinnn23.tistory.com/106

 

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋ˆ„์  ํ•ฉ(prefix sum)

1. ๋ˆ„์  ํ•ฉ(prefix sum)1.1 ๊ฐœ๋…ํŠน์ • ๋ฐฐ์—ด์—์„œ ์–ด๋– ํ•œ ๊ตฌ๊ฐ„๊นŒ์ง€์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฐฉ์‹. ์–ด๋– ํ•œ 1์ฐจ์› ๋ฐฐ์—ด [ 1, 5, 2, 10, 1, 8 ] ์—์„œ ๊ฐ€์žฅ ํ•ฉ์ด ํฐ ๊ธธ์ด๊ฐ€ 3์ธ ๋ถ€๋ถ„ ๋ฐฐ์—ด์„ ๊ณ ๋ฅผ ๋•Œ, [ 1, 5, 2 ], [ 5, 2, 10 ], ... , [

miiinnn23.tistory.com

 

๋‹จ์ˆœํžˆ ๊ณต์›์— ์žˆ๋Š” ํ๊ธฐ๋ฌผ์˜ ์ˆ˜์˜ ๋ˆ„์ ํ•ฉ์„ ๋ฐฐ์—ด์— ์ €์žฅํ•˜๊ณ ,

์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋Œ์•„์ฃผ๋ฉด์„œ KxK ๊ตฌ์—ญ ๋‚ด ์ตœ์†Œ ํ•ฉ์„ ์ฐพ์œผ๋ฉด ๋œ๋‹ค.

 

C++๋กœ๋„ ๋ˆ„์ ํ•ฉ ์จ์„œ ๋‹ค์‹œ ํ’€์–ด๋ดค๋Š”๋ฐ, CPU ๊ณ„์‚ฐ ์‹œ๊ฐ„์ด๋‚˜ ์‹คํ–‰์‹œ๊ฐ„์„ ํ™•์ธํ•ด๋ณด๋ฉด ํ™•์—ฐํ•˜๊ฒŒ ์‹œ๊ฐ„์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ฝ”๋“œ ์ˆ˜์ • ์ „ -> ์ฝ”๋“œ ์ˆ˜์ • ํ›„

 

์ฝ”๋“œ
# using prefix sum
T = int(input())

for _ in range(T):
    N, K = map(int, input().split())
    board = [list(map(int, input().split())) for _ in range(N)]

    prefix_sum = [[0] * (N + 1) for _ in range(N + 1)]

    for i in range(1, N + 1):
        for j in range(1, N + 1):
            prefix_sum[i][j] = (board[i - 1][j - 1]
                                + prefix_sum[i - 1][j]
                                + prefix_sum[i][j - 1]
                                - prefix_sum[i - 1][j - 1]) # ๊ฒน์น˜๋Š” ๋ถ€๋ถ„ ์ œ์™ธ
    
    answer = N * N
    for y in range(N - K + 1):
        for x in range(N - K + 1):
            total = (prefix_sum[y + K][x + K]
                     - prefix_sum[y][x + K]
                     - prefix_sum[y + K][x]
                     + prefix_sum[y][x])
            
            answer = min(answer, total)
    
    print(answer)

'์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ค€๋น„' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[๊ตฌ๋ฆ„] ๊ตฌ๋ฆ„๊ณต์› - ํŒŒ์ด์ฌ  (0) 2024.11.07
Comments