๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“– Problem Solution/Programmers

[Swift] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์›”๊ฐ„ ์ฝ”๋“œ ์ฑŒ๋ฆฐ์ง€ 3 ๊ณต ์ด๋™ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

by Fomagran ๐Ÿ’ป 2021. 11. 15.
728x90
๋ฐ˜์‘ํ˜•

 

 

Problem

 

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๊ณต ์ด๋™ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

nํ–‰ m์—ด์˜ ๊ฒฉ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฉ์ž์˜ ๊ฐ ํ–‰์€ 0, 1, ..., n-1๋ฒˆ์˜ ๋ฒˆํ˜ธ, ๊ทธ๋ฆฌ๊ณ  ๊ฐ ์—ด์€ 0, 1, ..., m-1๋ฒˆ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ๋งค๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ด ๊ฒฉ์ž์— ๊ณต์„ ํ•˜๋‚˜ ๋‘๊ณ , ๊ทธ ๊ณต์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ

programmers.co.kr


Solution

 

ํ•ด๋‹น ๋ฌธ์ œ๋Š” ํšจ์œจ์„ฑ์ด ํ•ต์‹ฌ์ธ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค.

 

์ตœ๋Œ€ ํ–‰๊ณผ ์—ด์ด ๊ฐ 10^9, ์ตœ๋Œ€ ์ฟผ๋ฆฌ ๊ฐฏ์ˆ˜๊ฐ€ 20๋งŒ์œผ๋กœ ์–ด๋งˆ์–ด๋งˆํ•œ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ๋งŒ์•ฝ ๋ชจ๋“  ์œ„์น˜์—์„œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ๋Œ๋ฆด ๊ฒฝ์šฐ

 

์ตœ๋Œ€ 10^9 * 10^9 * 200000 ์ด ๋ฉ๋‹ˆ๋‹ค. 

 

์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„  ๋ชฉ์ ์ง€์—์„œ๋ถ€ํ„ฐ ์ฟผ๋ฆฌ์˜ ์—ญ์ˆœ์œผ๋กœ ๋˜๋Œ์•„๊ฐ€๋ฉด์„œ ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„๊ฐ€ ์–ด๋””๊นŒ์ง€์ธ์ง€๋ฅผ

 

์ฒดํฌํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋ก  ์„ค๋ช…

 

์•„๋ž˜์™€ ๊ฐ™์ด ๋ชฉ์ ์ง€์™€ ์ฟผ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.( ๋ฌธ์ œ ์˜ˆ์‹œ 2๋ฒˆ์ž…๋‹ˆ๋‹ค.)

 

๊ฐ€์žฅ ๋จผ์ € ์‹œ์ž‘ํ•  ๋• ๋ชฉ์ ์ง€ ๊ทธ ์ž์ฒด์˜ ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค. (1,0)

 

 

 

์—ฌ๊ธฐ์„œ ์—ญ์ˆœ์œผ๋กœ ์‹คํ–‰์‹œ์ผœ๋ณด๋ฉด ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์ฟผ๋ฆฌ๊ฐ€ ์œ„๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด์˜€๊ณ  ํ˜„์žฌ ๋ณ„์˜ ์œ„์น˜์˜ y๊ฐ€ 0์ด๋ฏ€๋กœ

 

์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „ ์œ„์น˜๋Š” ํ˜„์žฌ์œ„์น˜ ๋˜๋Š” ๋ฐ”๋กœ ์•„๋ž˜ ์œ„์น˜์˜€์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด ๋ชฉ์ ์ง€์— ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฒ”์œ„๊ฐ€ ์•„๋ž˜๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค.

 

๊ทธ ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ–ˆ์„ ๋•Œ ๋ชฉ์ ์ง€์˜ ์œ„์น˜๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด์„  (2,0)์—์„œ ์ด๋™ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ๋ณ„์˜ ์œ„์น˜๋ฅผ

 

2,0์œผ๋กœ ์ด๋™ํ•ด์ค๋‹ˆ๋‹ค.

 

 

๊ทธ ๋‹ค์Œ ์ฟผ๋ฆฌ๋Š” ์œ„์ชฝ์œผ๋กœ ์„ธ ๋ฒˆ ์ด๋™ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๋ณ„์˜ y์œ„์น˜๊ฐ€ 0์ด๋ฏ€๋กœ ํ–‰์„ 3์ค„ ๋” ํ™•์žฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์˜ˆ์‹œ์—์„œ ์ตœ๋Œ€ ํ–‰์˜ ๊ธธ์ด๊ฐ€ 2์ด๋ฏ€๋กœ 

 

ํ™•์žฅ์‹œํ‚ฌ ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

 

...

 

์ด๋Ÿฐ ์‹์œผ๋กœ ์ฃผ์–ด์ง„ ๊ฒฉ์ž ๋ฒ”์œ„ ๋ฐ”๊นฅ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„๋ฅผ ํ™•์žฅ์‹œ์ผœ์ฃผ๊ณ 

 

์•ˆ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ชฉ์ ์ง€๋ฅผ ์ด๋™์‹œ์ผœ์ค๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๊ฒŒ ๋ชฉ์ ์ง€๊นŒ์ง€ ๋„์ฐฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๋ฅผ ๊ตฌํ•ด์„œ ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.

 

์ฝ”๋“œ ์„ค๋ช…

 

1. ์ฟผ๋ฆฌ๋ฅผ ์—ญ์ˆœ์œผ๋กœ ์‹คํ–‰์‹œํ‚จ๋‹ค.

 

for query in queries.reversed() {
        if !isEdge(query: query) {
            if !checkRightQuery(query: query) { return 0 }
            moveStart(query: query)
        }
        extendEnd(query: query)
    }

 

2. ๊ฐ€์žฅ์ž๋ฆฌ์ธ์ง€ ์•„๋‹Œ์ง€ ํ™•์ธํ•œ๋‹ค.

 

func isEdge(query:[Int]) -> Bool {
    return (query[0] == 0 && range.startX == 0) || (query[0] == 1 && range.endX == range.M) || (query[0] == 2 && range.startY == 0) || (query[0] == 3 && range.endY == range.N)
}

 

3. ๊ฐ€์žฅ์ž๋ฆฌ๋ผ๋ฉด ๋ฒ”์œ„๋ฅผ ํ™•์žฅ์‹œ์ผœ์ค€๋‹ค.

 

func extendEnd(query:[Int]) {
    switch query[0] {
    case 0:
        range.endX = min(range.M,range.endX+query[1])
    case 1:
        range.startX = max(0,range.startX-query[1])
    case 2:
        range.endY = min(range.N,range.endY+query[1])
    default:
        range.startY = max(0,range.startY-query[1])
    }
}

 

4. ๊ฐ€์žฅ์ž๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์ด๋™์‹œ์ผœ์ค€๋‹ค.

 

์ด๋™์‹œ์ผœ์ฃผ๋Š” ๋ฐฉ๋ฒ•์€ ์‹œ์ž‘๊ณผ ๋์„ ๋™์‹œ์— ๋Š˜๋ ค์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

func moveStart(query:[Int]){
    switch query[0] {
    case 0:
        range.startX = min(range.M,range.startX+query[1])
    case 1:
        range.endX =  max(0,range.endX-query[1])
    case 2:
        range.startY = min(range.N,range.startY+query[1])
    default:
        range.endY = max(0,range.endY-query[1])
    }
}

 

5. ์˜ฌ๋ฐ”๋ฅธ ์ฟผ๋ฆฌ์ธ์ง€ ํ™•์ธํ•ด์ค€๋‹ค.

 

๋ชฉ์ ์ง€๋ฅผ ์ด๋™ํ•ด์ค˜์•ผ ํ•˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ๋‚˜์™”์„ ๋•Œ ์ฃผ์–ด์ง„ ๊ฒฉ์ž๋ณด๋‹ค ๋” ํฌ๋‹ค๋ฉด ์ž˜๋ชป๋œ ์ฟผ๋ฆฌ์ด๋ฏ€๋กœ 0์„ ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.

 

(ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค 33๋ฒˆ 34๋ฒˆ์„ ์œ„ํ•œ ์ฝ”๋“œ)

 

func checkRightQuery(query:[Int]) -> Bool {
    switch query[0] {
    case 0:
        if range.startX+query[1] > range.M { return false }
    case 1:
        if range.endX-query[1] < 0 { return false }
    case 2:
        if range.startY+query[1] > range.N { return false }
    default:
        if range.endY-query[1] < 0 { return false }
    }
    return true
}

 

6. ์˜ฌ๋ฐ”๋ฅธ ์ฟผ๋ฆฌ๋ผ๋ฉด ๋ฒ”์œ„๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

return Int64(range.getArea)

Source Code

 


P.S

 

๋ฌธ์ œ์˜ ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ๋ณด๊ณ  ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ํ•จ์ •์ด์—ˆ๋‹ค.

 

์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ๋ณด๋ฉด ๋‹น์—ฐํžˆ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์งœ์•ผํ•  ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ธ๋ฐ ์˜คํžˆ๋ ค ๋ฐ˜๋Œ€๋กœ ์ƒ๊ฐํ•ด์•ผ ํ–ˆ๋‹ค.

 

๋˜ํ•œ 33๋ฒˆ,34๋ฒˆ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ๋ชฉ์ ์ง€์— ๋„๋‹ฌํ•˜์ง€ ์•Š๋Š” ์ž˜๋ชป๋œ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

 

์ด๊ฑด ์ข€ ์–ต์ง€๋กœ ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.

 

์•„๋ฌดํŠผ ์ด ๋ฌธ์ œ๋ฅผ ๋์œผ๋กœ ์ด๋ฒˆ ๋…„๋„ ๋ชฉํ‘œ์˜€๋˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค 3๋‹จ๊ณ„ ๋ฌธ์ œ๋ฅผ ๋ชจ๋‘ ํ’€์—ˆ๋‹ค!

 

์ผ์ฃผ์ผ์— ํ•œ ๋ฌธ์ œ์”ฉ๋งŒ ๊พธ์ค€ํžˆ ํ’€์ž๋Š” ์ƒ๊ฐ์œผ๋กœ ์กฐ๊ธˆ ์˜ค๋ž˜ ๊ฑธ๋ ธ์ง€๋งŒ ๋ฟŒ๋“ฏํ•˜๋‹ค..

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ˆœ์œ„๋„ 257๋“ฑ์„ ๋‹ฌ์„ฑํ–ˆ๊ณ  ๋‹ค์Œ ๋…„๋„์—” 4๋‹จ๊ณ„,5๋‹จ๊ณ„๋ฅผ ๋ชจ๋‘ ํ‘ธ๋Š” ๋ชฉํ‘œ๋กœ ๋‹ฌ๋ ค๊ฐ€์•ผ๊ฒ ๋‹ค.

 

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€