๐Ÿง‘๐Ÿป‍๐Ÿ’ป Coding Test/โŒจ๏ธ Programmers

[ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ] n^2 ๋ฐฐ์—ด ์ž๋ฅด๊ธฐ

EarthSea 2024. 4. 16. 10:06

 

 

 

 

 

 

๐Ÿ„ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋ฌธ์ œ ํ’€์ด

 

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

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

programmers.co.kr

โœ๐Ÿป ๋ฌธ์ œ ํ’€์ด github ๋งํฌ

 

-Swift-CodingTest/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/2/87390.โ€…n๏ผพ2โ€…๋ฐฐ์—ดโ€…์ž๋ฅด๊ธฐ at main · BaeJihae/-Swift-CodingTest

Swift๋กœ ํ‘ผ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ๋ฌธ์ œ๋“ค์„ ์ •๋ฆฌํ•˜๊ณ  ๊ณต๋ถ€ํ•˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค. Contribute to BaeJihae/-Swift-CodingTest development by creating an account on GitHub.

github.com

 

 

๋ฌธ์ œ ์„ค๋ช…

์ •์ˆ˜ n, left, right๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ณผ์ •์„ ๊ฑฐ์ณ์„œ 1์ฐจ์› ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

  1. nํ–‰ n์—ด ํฌ๊ธฐ์˜ ๋น„์–ด์žˆ๋Š” 2์ฐจ์› ๋ฐฐ์—ด์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  2. i = 1, 2, 3, ..., n์— ๋Œ€ํ•ด์„œ, ๋‹ค์Œ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
    • 1ํ–‰ 1์—ด๋ถ€ํ„ฐ iํ–‰ i์—ด๊นŒ์ง€์˜ ์˜์—ญ ๋‚ด์˜ ๋ชจ๋“  ๋นˆ ์นธ์„ ์ˆซ์ž i๋กœ ์ฑ„์›๋‹ˆ๋‹ค.
  3. 1ํ–‰, 2ํ–‰, ..., nํ–‰์„ ์ž˜๋ผ๋‚ด์–ด ๋ชจ๋‘ ์ด์–ด๋ถ™์ธ ์ƒˆ๋กœ์šด 1์ฐจ์› ๋ฐฐ์—ด์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  4. ์ƒˆ๋กœ์šด 1์ฐจ์› ๋ฐฐ์—ด์„ arr์ด๋ผ ํ•  ๋•Œ, arr[left], arr[left+1], ..., arr[right]๋งŒ ๋‚จ๊ธฐ๊ณ  ๋‚˜๋จธ์ง€๋Š” ์ง€์›๋‹ˆ๋‹ค.

์ •์ˆ˜ n, left, right๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๊ณผ์ •๋Œ€๋กœ ๋งŒ๋“ค์–ด์ง„ 1์ฐจ์› ๋ฐฐ์—ด์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

 

 

์ œํ•œ์‚ฌํ•ญ

  • 1 ≤ n ≤ 10^7
  • 0 ≤ left ≤ right < n^2
  • right - left < 10^5

 

 

์ž…์ถœ๋ ฅ ์˜ˆ

n left right result
3 2 5 [3,2,2,3]
4 7 14 [4,3,3,3,4,4,4,4]

 

 

๋ฌธ์ œ ํ’€์ด

๋‚˜์˜ ํ’€์ด

 

[ ์‹คํŒจ ]

import Foundation

func solution(_ n:Int, _ left:Int64, _ right:Int64) -> [Int] {
    
    var arr = [Int]()
    
    for i in 1...n {
        if i > 1 {
            arr += [Int](repeating:i, count:i-1)
        }
        arr += (i...n).map{ $0 }
    }

    return Array(arr[Int(left)...Int(right)])
}
๋”๋ณด๊ธฐ
ํ…Œ์ŠคํŠธ 1 ใ€‰	ํ†ต๊ณผ (15.73ms, 33.4MB)
ํ…Œ์ŠคํŠธ 2 ใ€‰	์‹คํŒจ (์‹œ๊ฐ„ ์ดˆ๊ณผ)
ํ…Œ์ŠคํŠธ 3 ใ€‰	์‹คํŒจ (์‹œ๊ฐ„ ์ดˆ๊ณผ)
ํ…Œ์ŠคํŠธ 4 ใ€‰	ํ†ต๊ณผ (1.54ms, 16.6MB)
ํ…Œ์ŠคํŠธ 5 ใ€‰	ํ†ต๊ณผ (1.38ms, 16.6MB)
ํ…Œ์ŠคํŠธ 6 ใ€‰	ํ†ต๊ณผ (147.63ms, 34.4MB)
ํ…Œ์ŠคํŠธ 7 ใ€‰	ํ†ต๊ณผ (175.22ms, 35.6MB)
ํ…Œ์ŠคํŠธ 8 ใ€‰	ํ†ต๊ณผ (143.03ms, 34.1MB)
ํ…Œ์ŠคํŠธ 9 ใ€‰	์‹คํŒจ (์‹œ๊ฐ„ ์ดˆ๊ณผ)
ํ…Œ์ŠคํŠธ 10 ใ€‰	์‹คํŒจ (์‹œ๊ฐ„ ์ดˆ๊ณผ)
ํ…Œ์ŠคํŠธ 11 ใ€‰	์‹คํŒจ (์‹œ๊ฐ„ ์ดˆ๊ณผ)
ํ…Œ์ŠคํŠธ 12 ใ€‰	์‹คํŒจ (์‹œ๊ฐ„ ์ดˆ๊ณผ)
ํ…Œ์ŠคํŠธ 13 ใ€‰	์‹คํŒจ (์‹œ๊ฐ„ ์ดˆ๊ณผ)
ํ…Œ์ŠคํŠธ 14 ใ€‰	์‹คํŒจ (์‹œ๊ฐ„ ์ดˆ๊ณผ)
ํ…Œ์ŠคํŠธ 15 ใ€‰	์‹คํŒจ (์‹œ๊ฐ„ ์ดˆ๊ณผ)
ํ…Œ์ŠคํŠธ 16 ใ€‰	์‹คํŒจ (์‹œ๊ฐ„ ์ดˆ๊ณผ)
ํ…Œ์ŠคํŠธ 17 ใ€‰	์‹คํŒจ (์‹œ๊ฐ„ ์ดˆ๊ณผ)
ํ…Œ์ŠคํŠธ 18 ใ€‰	์‹คํŒจ (์‹œ๊ฐ„ ์ดˆ๊ณผ)
ํ…Œ์ŠคํŠธ 19 ใ€‰	์‹คํŒจ (์‹œ๊ฐ„ ์ดˆ๊ณผ)
ํ…Œ์ŠคํŠธ 20 ใ€‰	์‹คํŒจ (์‹œ๊ฐ„ ์ดˆ๊ณผ)

 

๊ทธ๋Ÿผ ๊ทธ๋ ‡์ง€ ์ด๋ ‡๊ฒŒ ํ•ด์„œ ํ’€๋ฆฌ๊ฒ ๋ƒ?! ๋„ˆ๊ฐ€ ๋ ˆ๋ฒจ 1๋„ ์•„๋‹ˆ๊ณ  2์ธ๋ฐ ๊ทธ์น˜.. ( 5๋ถ„๋งŒ์— ํ’€๋ฆด๋ฆฌ๊ฐ€ ์—†์–ด.. )

 

20๊ฐœ์˜ ํ…Œ์ŠคํŠธ๋ฆฌ์ŠคํŠธ ์ค‘ 14๊ฐœ์˜ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ๋ณด๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ „์ฒด ๋ฐฐ์—ด์„ ๋‹ค ๋งŒ๋“ค์–ด์„œ ์ž๋ฅด๋ฉด ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์„..

 

[ ์‹คํŒจ ]

import Foundation

func solution(_ n:Int, _ left:Int64, _ right:Int64) -> [Int] {

    let left = Int(left)
    let right = Int(right)
    
    var answer = [Int]()
    
    for i in left/n...right/n {
        if i == left/n {
            for j in left%n..<n {
                i >= j ? answer.append(i+1) : answer.append(j+1)
            }
        }else if i == right/n {
            for j in 0...right%n {
                i >= j ? answer.append(i+1) : answer.append(j+1)
            }
        }else {
            for j in 0..<n {
                i >= j ? answer.append(i+1) : answer.append(j+1)
            }
        }
    }
    
    return answer
}
๋”๋ณด๊ธฐ
ํ…Œ์ŠคํŠธ 1 ใ€‰	ํ†ต๊ณผ (1.88ms, 33.3MB)
ํ…Œ์ŠคํŠธ 2 ใ€‰	์‹คํŒจ (์‹œ๊ฐ„ ์ดˆ๊ณผ)
ํ…Œ์ŠคํŠธ 3 ใ€‰	ํ†ต๊ณผ (2.17ms, 35MB)
ํ…Œ์ŠคํŠธ 4 ใ€‰	ํ†ต๊ณผ (0.03ms, 16.3MB)
ํ…Œ์ŠคํŠธ 5 ใ€‰	ํ†ต๊ณผ (0.04ms, 16.5MB)
ํ…Œ์ŠคํŠธ 6 ใ€‰	ํ†ต๊ณผ (2.01ms, 33.7MB)
ํ…Œ์ŠคํŠธ 7 ใ€‰	ํ†ต๊ณผ (3.55ms, 34.9MB)
ํ…Œ์ŠคํŠธ 8 ใ€‰	ํ†ต๊ณผ (1.89ms, 33.5MB)
ํ…Œ์ŠคํŠธ 9 ใ€‰	ํ†ต๊ณผ (3.40ms, 34.4MB)
ํ…Œ์ŠคํŠธ 10 ใ€‰	ํ†ต๊ณผ (2.00ms, 34.2MB)
ํ…Œ์ŠคํŠธ 11 ใ€‰	ํ†ต๊ณผ (2.02ms, 33.9MB)
ํ…Œ์ŠคํŠธ 12 ใ€‰	ํ†ต๊ณผ (1.78ms, 31.7MB)
ํ…Œ์ŠคํŠธ 13 ใ€‰	ํ†ต๊ณผ (3.39ms, 33.5MB)
ํ…Œ์ŠคํŠธ 14 ใ€‰	ํ†ต๊ณผ (1.79ms, 32.9MB)
ํ…Œ์ŠคํŠธ 15 ใ€‰	์‹คํŒจ (11.94ms, 72.8MB)
ํ…Œ์ŠคํŠธ 16 ใ€‰	์‹คํŒจ (14.23ms, 121MB)
ํ…Œ์ŠคํŠธ 17 ใ€‰	์‹คํŒจ (15.56ms, 132MB)
ํ…Œ์ŠคํŠธ 18 ใ€‰	์‹คํŒจ (126.34ms, 670MB)
ํ…Œ์ŠคํŠธ 19 ใ€‰	์‹คํŒจ (71.53ms, 455MB)
ํ…Œ์ŠคํŠธ 20 ใ€‰	์‹คํŒจ (96.93ms, 489MB)

 

left ๋ถ€ํ„ฐ right ๊นŒ์ง€์˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ๋ฐ”๋กœ ์ถœ๋ ฅํ•ด๋ฒ„๋ฆฌ๋„๋ก ๋ฐ”๊พธ์—ˆ๋‹ค.

๊ทธ ์•ˆ์— ๊ทœ์น™์ด ์žˆ๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.

 

ํ•ด๋‹น 2์ฐจ์› ๋ฐฐ์—ด์„ 2์ฐจ์› ์ขŒํ‘œ (0, 0) ~ (n-1, n-1) ๋กœ ๋‘์—ˆ์„ ๋•Œ,

( left/n, left%n ) ~ ( right/n, right%n ) ๊นŒ์ง€์˜ ๋ฐฐ์—ด ๊ฐœ์ˆ˜๋งŒ ์ฐพ์•„๋‚ด๋ฉด ๋˜์—ˆ๋‹ค.

i ์ขŒํ‘œ์™€ j ์ขŒํ‘œ๊ฐ„์˜ ๊ทœ์น™์ด ์žˆ์—ˆ๋‹ค. i ๊ฐ€ j ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด i+1์„ i ๊ฐ€ j๋ณด๋‹ค ์ž‘๋‹ค๋ฉด j+1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

ํ•˜์ง€๋งŒ, ์ด ๋•Œ, i ์ขŒํ‘œ๊ฐ€ left/n ์ด๊ฑฐ๋‚˜ right/n ์ผ ๋•Œ๋Š” j์˜ ๋ฒ”์œ„๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด์•ผํ–ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ฐ๊ฐ์˜ if๋ฌธ์œผ๋กœ ๋‚˜๋ˆ„์–ด for ๋ฌธ์˜ ๋ฒ”์œ„๋ฅผ ๋ฐ”๊พธ์–ด ์ฃผ์—ˆ๋‹ค.

 

20๊ฐœ ์ค‘ 7๊ฐœ์˜ ์‹คํŒจ!

๋‚ด๊ฐ€ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

left/n์™€ right/n๊ฐ€ ์ผ์น˜ํ•  ๋•Œ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜๋‹ค.

 

 

[ ์„ฑ๊ณต ]

import Foundation

func solution(_ n:Int, _ left:Int64, _ right:Int64) -> [Int] {

    let left = Int(left)
    let right = Int(right)
    
    var answer = [Int]()
    
    for i in left/n...right/n {
        if left/n == right/n {
            for j in left%n...right%n {
                i >= j ? answer.append(i+1) : answer.append(j+1)
            }
        }else if i == left/n {
            for j in left%n..<n {
                i >= j ? answer.append(i+1) : answer.append(j+1)
            }
        }else if i == right/n {
            for j in 0...right%n {
                i >= j ? answer.append(i+1) : answer.append(j+1)
            }
        }else {
            for j in 0..<n {
                i >= j ? answer.append(i+1) : answer.append(j+1)
            }
        }
    }
    
    return answer
}
๋”๋ณด๊ธฐ
ํ…Œ์ŠคํŠธ 1 ใ€‰	ํ†ต๊ณผ (1.76ms, 33.5MB)
ํ…Œ์ŠคํŠธ 2 ใ€‰	ํ†ต๊ณผ (1.98ms, 34.8MB)
ํ…Œ์ŠคํŠธ 3 ใ€‰	ํ†ต๊ณผ (2.06ms, 34.9MB)
ํ…Œ์ŠคํŠธ 4 ใ€‰	ํ†ต๊ณผ (0.03ms, 16.5MB)
ํ…Œ์ŠคํŠธ 5 ใ€‰	ํ†ต๊ณผ (0.03ms, 16.4MB)
ํ…Œ์ŠคํŠธ 6 ใ€‰	ํ†ต๊ณผ (1.85ms, 33.7MB)
ํ…Œ์ŠคํŠธ 7 ใ€‰	ํ†ต๊ณผ (1.96ms, 35MB)
ํ…Œ์ŠคํŠธ 8 ใ€‰	ํ†ต๊ณผ (1.90ms, 33.4MB)
ํ…Œ์ŠคํŠธ 9 ใ€‰	ํ†ต๊ณผ (1.93ms, 34.6MB)
ํ…Œ์ŠคํŠธ 10 ใ€‰	ํ†ต๊ณผ (1.95ms, 34.4MB)
ํ…Œ์ŠคํŠธ 11 ใ€‰	ํ†ต๊ณผ (1.98ms, 33.9MB)
ํ…Œ์ŠคํŠธ 12 ใ€‰	ํ†ต๊ณผ (1.75ms, 32MB)
ํ…Œ์ŠคํŠธ 13 ใ€‰	ํ†ต๊ณผ (1.75ms, 33.5MB)
ํ…Œ์ŠคํŠธ 14 ใ€‰	ํ†ต๊ณผ (1.70ms, 33MB)
ํ…Œ์ŠคํŠธ 15 ใ€‰	ํ†ต๊ณผ (1.65ms, 32.2MB)
ํ…Œ์ŠคํŠธ 16 ใ€‰	ํ†ต๊ณผ (1.81ms, 33MB)
ํ…Œ์ŠคํŠธ 17 ใ€‰	ํ†ต๊ณผ (1.81ms, 33.1MB)
ํ…Œ์ŠคํŠธ 18 ใ€‰	ํ†ต๊ณผ (1.98ms, 34.6MB)
ํ…Œ์ŠคํŠธ 19 ใ€‰	ํ†ต๊ณผ (2.85ms, 33.5MB)
ํ…Œ์ŠคํŠธ 20 ใ€‰	ํ†ต๊ณผ (1.67ms, 31.6MB)

 

left/n๊ณผ right/n ๊นŒ์ง€ ๊ณ ๋ คํ•ด์„œ ํ‘ธ๋‹ˆ ์„ฑ๊ณต!

์ด๋ฅผ ์ข€ ๋” ๊ฐ„๋žตํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค.

 

[ ์ •๋ฆฌ ]

func solution(_ n:Int, _ left:Int64, _ right:Int64) -> [Int] {

    let left = Int(left)
    let right = Int(right)
    var answer = [Int]()
    
    for i in left/n...right/n {
        
        var x = 0
        var y = n-1
        
        if left/n == right/n { x = left%n; y = right%n }
        else if i == left/n  { x = left%n  }
        else if i == right/n { y = right%n }
        
        for j in x...y {
            i >= j ? answer.append(i+1) : answer.append(j+1)
        }
    }
    
    return answer
}

๋!

 

 

 

๋‹ค๋ฅธ ์‚ฌ๋žŒ ํ’€์ด

func solution(_ n: Int, _ left: Int64, _ right: Int64) -> [Int] {
    return (left...right).map { max(Int($0) / n, Int($0) % n) + 1 }
}

ใ…‹ใ…‹ใ…‹ ์ด๊ฒŒ ๋ญ์ง€.. ์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์— ๋ฐ•์ˆ˜์น˜๋ฉฐ ์กฐ์šฉํžˆ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค..