MUKER_DEV with iOS

[swift] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค -2๊ฐœ ์ดํ•˜๋กœ ๋‹ค๋ฅธ ๋น„ํŠธ ๋ณธ๋ฌธ

๐Ÿค– ์•Œ๊ณ ๋ฆฌ์ฆ˜/programmers

[swift] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค -2๊ฐœ ์ดํ•˜๋กœ ๋‹ค๋ฅธ ๋น„ํŠธ

MUKER 2023. 4. 13. 17:35
 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr


์‹คํŒจ ํ’€์ด

func solution(_ numbers:[Int64]) -> [Int64] {
    return numbers.map {
        var n = $0 + 1
        for i in n... {
            if (i^$0).nonzeroBitCount <= 2 {
                n = i
                break
            }
        }
        return n
    }
}
// ๋น„ํŠธ์—ฐ์‚ฐ์ž ^ ๋Š” ์„œ๋กœ์˜ ๋น„ํŠธ๊ฐ€ ๋‹ค๋ฅผ ๋•Œ 1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
// nonzeroBitCount๋Š” ๋น„ํŠธ๊ฐ€ 1์ผ ๋•Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ผ๋‹ค.

ํ’€์ด ํ‚ค์›Œ๋“œ

๋น„ํŠธ์—ฐ์‚ฐ์ž
์ž…๋ ฅ๊ฐ’์— +1์„ ๋”ํ•ด๊ฐ€๋ฉฐ
์ž…๋ ฅ๊ฐ’๊ณผ ๋”ํ•œ ๊ฐ’์˜ ๋น„ํŠธ๊ฐ€ 2์ด์ƒ ์ฐจ์ด๋‚˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฐ˜ํ™˜

ํ•ด๋‹น ํ’€์ด๋Š” ์‹œ๊ฐ„์ดˆ๊ณผ๋กœ ์‹คํŒจ

 

์„ฑ๊ณต ํ’€์ด

func solution(_ numbers:[Int64]) -> [Int64] {
    return numbers.map {
        let next = ~$0 & ($0+1)
        return ($0 | next) & ~(next >> 1)
    }
}

ํ’€์ด ํ‚ค์›Œ๋“œ

๋น„ํŠธ์—ฐ์‚ฐ์ž
๋น„ํŠธ๊ฐ€ 2๊ฐœ ์ดํ•˜๋กœ ๋‹ค๋ฅธ ์ˆ˜ ์ค‘ ์ œ์ผ ์ž‘์€ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€
๋น„ํŠธ์˜ ์ œ์ผ ์˜ค๋ฅธ์ชฝ 0์ด 1๋กœ ๋ฐ”๋€Œ๊ณ 
0์—์„œ 1๋กœ ๋ฐ”๋€ ์ž๋ฆฌ์˜ ์˜ค๋ฅธ์ชฝ์˜ ์ˆซ์ž๋ฅผ 0์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒ๋‹ˆ๋‹ค.
ex) 0101 -> 0110

๋งŒ์•ฝ ๋งˆ์ง€๋ง‰ ์ž๋ฆฌ์— 0์ด ์žˆ์—ˆ๋‹ค๋ฉด, ๋งˆ์ง€๋ง‰ ์ž๋ฆฌ๋งŒ 1๋กœ ๋ฐ”๊พธ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
๋งˆ์ง€๋ง‰ ์ž๋ฆฌ๊ฐ€ 0์ผ ๋•Œ๋Š” ์ง์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋ฏ€๋กœ
์ง์ˆ˜์ผ ๋•Œ๋Š” 10์ง„์ˆ˜์—์„œ +1๋งŒ ํ•ด๋„
๋น„ํŠธ๊ฐ€ 2๊ฐœ ์ดํ•˜๋กœ ๋‹ค๋ฅธ ์ˆ˜ ์ค‘ ์ œ์ผ ์ž‘์€ ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ex) 1110 -> 1111

๋ชจ๋“  ์ˆ˜๊ฐ€ 1๋กœ ์ฑ„์›Œ์ ธ ์žˆ๋Š” ๋น„ํŠธ๋ผ๋ฉด
์ฒซ์ž๋ฆฌ์— 1์ด ๋ถ™์œผ๋ฉด์„œ, ์›๋ž˜ ์ฒซ์ž๋ฆฌ์˜€๋˜ 1์€ 0์ด ๋˜๊ฒ ์ฃ !
ex) 1111 -> 10111

์˜ˆ์‹œ)
์ž…๋ ฅ: 4 (2์ง„์ˆ˜: 0100)

next = ~0100 & (0100 +1)
next = 1011 & 0101
next = 0001

return (0100 | 0001) & 1111
return 0101 & 1111
return 0101

์ถœ๋ ฅ: 5(2์ง„์ˆ˜: 0101)

์ž…๋ ฅ: 7 (2์ง„์ˆ˜: 111)

next = ~0111 & (0111+1)
next = 1000 & 1000
next = 1000

return (0111 | 1000) & ~(1000 >> 1)
return 1111 & ~(0100)
return 1111 & 1011
return 1011

์ถœ๋ ฅ: 11(2์ง„์ˆ˜: 1011)