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

[ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ] ํ• ์ธ ํ–‰์‚ฌ

EarthSea 2024. 4. 18. 10:47

 

๐Ÿ„ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฌธ์ œ ๋งํฌ

 

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

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

programmers.co.kr

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

 

-Swift-CodingTest/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/2/131127.โ€…ํ• ์ธโ€…ํ–‰์‚ฌ at main · BaeJihae/-Swift-CodingTest

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

github.com

 

 

๋ฌธ์ œ ์„ค๋ช…

 

XYZ ๋งˆํŠธ๋Š” ์ผ์ •ํ•œ ๊ธˆ์•ก์„ ์ง€๋ถˆํ•˜๋ฉด 10์ผ ๋™์•ˆ ํšŒ์› ์ž๊ฒฉ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. XYZ ๋งˆํŠธ์—์„œ๋Š” ํšŒ์›์„ ๋Œ€์ƒ์œผ๋กœ ๋งค์ผ ํ•œ ๊ฐ€์ง€ ์ œํ’ˆ์„ ํ• ์ธํ•˜๋Š” ํ–‰์‚ฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ํ• ์ธํ•˜๋Š” ์ œํ’ˆ์€ ํ•˜๋ฃจ์— ํ•˜๋‚˜์”ฉ๋งŒ ๊ตฌ๋งคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•Œ๋œฐํ•œ ์ •ํ˜„์ด๋Š” ์ž์‹ ์ด ์›ํ•˜๋Š” ์ œํ’ˆ๊ณผ ์ˆ˜๋Ÿ‰์ด ํ• ์ธํ•˜๋Š” ๋‚ ์งœ์™€ 10์ผ ์—ฐ์†์œผ๋กœ ์ผ์น˜ํ•  ๊ฒฝ์šฐ์— ๋งž์ถฐ์„œ ํšŒ์›๊ฐ€์ž…์„ ํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ์ •ํ˜„์ด๊ฐ€ ์›ํ•˜๋Š” ์ œํ’ˆ์ด ๋ฐ”๋‚˜๋‚˜ 3๊ฐœ, ์‚ฌ๊ณผ 2๊ฐœ, ์Œ€ 2๊ฐœ, ๋ผ์ง€๊ณ ๊ธฐ 2๊ฐœ, ๋ƒ„๋น„ 1๊ฐœ์ด๋ฉฐ, XYZ ๋งˆํŠธ์—์„œ 14์ผ๊ฐ„ ํšŒ์›์„ ๋Œ€์ƒ์œผ๋กœ ํ• ์ธํ•˜๋Š” ์ œํ’ˆ์ด ๋‚ ์งœ ์ˆœ์„œ๋Œ€๋กœ ์น˜ํ‚จ, ์‚ฌ๊ณผ, ์‚ฌ๊ณผ, ๋ฐ”๋‚˜๋‚˜, ์Œ€, ์‚ฌ๊ณผ, ๋ผ์ง€๊ณ ๊ธฐ, ๋ฐ”๋‚˜๋‚˜, ๋ผ์ง€๊ณ ๊ธฐ, ์Œ€, ๋ƒ„๋น„, ๋ฐ”๋‚˜๋‚˜, ์‚ฌ๊ณผ, ๋ฐ”๋‚˜๋‚˜์ธ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค. ์ฒซ์งธ ๋‚ ๋ถ€ํ„ฐ ์—ดํ˜ ๊ฐ„์—๋Š” ๋ƒ„๋น„๊ฐ€ ํ• ์ธํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ฒซ์งธ ๋‚ ์—๋Š” ํšŒ์›๊ฐ€์ž…์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘˜์งธ ๋‚ ๋ถ€ํ„ฐ ์—ดํ˜ ๊ฐ„์—๋Š” ๋ฐ”๋‚˜๋‚˜๋ฅผ ์›ํ•˜๋Š” ๋งŒํผ ํ• ์ธ๊ตฌ๋งคํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‘˜์งธ ๋‚ ์—๋„ ํšŒ์›๊ฐ€์ž…์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์…‹์งธ ๋‚ , ๋„ท์งธ ๋‚ , ๋‹ค์„ฏ์งธ ๋‚ ๋ถ€ํ„ฐ ๊ฐ๊ฐ ์—ดํ˜์€ ์›ํ•˜๋Š” ์ œํ’ˆ๊ณผ ์ˆ˜๋Ÿ‰์ด ์ผ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์…‹ ์ค‘ ํ•˜๋ฃจ์— ํšŒ์›๊ฐ€์ž…์„ ํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค.

 

์ •ํ˜„์ด๊ฐ€ ์›ํ•˜๋Š” ์ œํ’ˆ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด want์™€ ์ •ํ˜„์ด๊ฐ€ ์›ํ•˜๋Š” ์ œํ’ˆ์˜ ์ˆ˜๋Ÿ‰์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ ๋ฐฐ์—ด number, XYZ ๋งˆํŠธ์—์„œ ํ• ์ธํ•˜๋Š” ์ œํ’ˆ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด discount๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ํšŒ์›๋“ฑ๋ก์‹œ ์ •ํ˜„์ด๊ฐ€ ์›ํ•˜๋Š” ์ œํ’ˆ์„ ๋ชจ๋‘ ํ• ์ธ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ํšŒ์›๋“ฑ๋ก ๋‚ ์งœ์˜ ์ด ์ผ์ˆ˜๋ฅผ return ํ•˜๋Š” solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•˜์‹œ์˜ค. ๊ฐ€๋Šฅํ•œ ๋‚ ์ด ์—†์œผ๋ฉด 0์„ return ํ•ฉ๋‹ˆ๋‹ค.

 

 

์ œํ•œ์‚ฌํ•ญ

  • 1 ≤ want์˜ ๊ธธ์ด = number์˜ ๊ธธ์ด ≤ 10
    • 1 ≤ number์˜ ์›์†Œ ≤ 10
    • number[i]๋Š” want[i]์˜ ์ˆ˜๋Ÿ‰์„ ์˜๋ฏธํ•˜๋ฉฐ, number์˜ ์›์†Œ์˜ ํ•ฉ์€ 10์ž…๋‹ˆ๋‹ค.
  • 10 ≤ discount์˜ ๊ธธ์ด ≤ 100,000
  • want์™€ discount์˜ ์›์†Œ๋“ค์€ ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
    • 1 ≤ want์˜ ์›์†Œ์˜ ๊ธธ์ด, discount์˜ ์›์†Œ์˜ ๊ธธ์ด ≤ 12

 

 

์ž…์ถœ๋ ฅ ์˜ˆ

want number discount result
["banana", "apple", "rice", "pork", "pot"] [3, 2, 2, 2, 1] ["chicken", "apple", "apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice", "pot", "banana", "apple", "banana"] 3
["apple"] [10] ["banana", "banana", "banana", "banana", "banana", "banana", "banana", "banana", "banana", "banana"] 0

 

 

๋ฌธ์ œ ํ’€์ด

 

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

import Foundation

func solution(_ want:[String], _ number:[Int], _ discount:[String]) -> Int {
    
    var wantDic = [String:Int]()
    var count = 0
    
    for (product, num) in zip(want, number) {
        wantDic[product] = num
    }
    
    for i in 0..<discount.count-9 {
        var dic = [String:Int]()
        for j in 0...9 {
            dic[discount[i+j]] = ( dic[discount[i+j]] ?? 0 ) + 1
        }
        if dic == wantDic {
            count += 1
        }
    }
    
    return count
}

 

discount์˜ ๋ฐฐ์—ด์„ ๋Œ๋ฉด์„œ [0…9] ๊นŒ์ง€์˜ ๋ฐฐ์—ด๋“ค์„ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ฐ”๊พธ์–ด ์ •ํ˜„์ด๊ฐ€ ์›ํ•˜๋Š” ์ œํ’ˆ๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•ด์•ผํ–ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๊ฐœ์˜ ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ ๊ฐ™๋‹ค๋ฉด count๋ฅผ ์˜ฌ๋ฆฌ๋„๋ก ๋กœ์ง์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.

 

discount์˜ ์ตœ๋Œ€ ๊ธธ์ด๊ฐ€ 100,000์ด๋ฏ€๋กœ ์ตœ๋Œ€ 100,000-10์˜ for๋ฌธ์„ ๋Œ๋ฉฐ ๋ฐฐ์—ด์„ ๋”•์…”๋„ˆ๋ฆฌ์— ์ •๋ฆฌํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณค๋‹ค. ํ•˜๋‚˜์˜ ๋ฐฐ์—ด์„ ๋”•์…”๋„ˆ๋ฆฌ์— ๋„ฃ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 10 ์ด๋ฏ€๋กœ ์ตœ๋Œ€ ( 100,000-10 ) * 10 ๋ฒˆ์„ ๊ณ„์‚ฐํ•ด์•ผํ•œ๋‹ค.

 

๋˜ํ•œ ์ •ํ˜„์ด๊ฐ€ ์›ํ•˜๋Š” ์ œํ’ˆ๊ณผ ์›ํ•˜๋Š” ์ œํ’ˆ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ์— ๋‹ด๋Š” ๊ณผ์ •์€ ์ตœ๋Œ€ 10๋ฒˆ์ด๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ ๋‚˜์˜ ํ’€์ด์˜ ์ตœ๋Œ€ ๋ฐ˜๋ณต ํšŸ์ˆ˜๋Š” 10 + ( 100,000-10 ) * 10 ์ด๋ผ๊ณ  ํŒ๋‹จํ•˜์—ฌ ์ถฉ๋ถ„ํžˆ ํ’€๋ฆฌ๊ฒ ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

 

 

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

import Foundation

func solution(_ want:[String], _ number:[Int], _ discount:[String]) -> Int {
    let cnt = want.count
    var wantArr = [Int](repeating: 0, count: cnt)
    var discountArr = [Int](repeating: 0, count: cnt)

    var saleDict = [String: Int]()

    for i in 0..<want.count {
        saleDict[want[i]] = i
        wantArr[i] = number[i]
    }

    for i in 0..<10 {
        guard let idx = saleDict[discount[i]] else {
            continue
        }
        discountArr[idx] += 1
    }

    var answer = 0

    if wantArr == discountArr {
        answer += 1
    }

    for i in 0..<discount.count-10 {
        if let idx = saleDict[discount[i]] {
            discountArr[idx] -= 1
        }

        if let idx = saleDict[discount[i+10]] {
            discountArr[idx] += 1
        }

        if wantArr == discountArr {
            answer += 1
        }
    }

    return answer
}

 

์ด ๋ถ„์˜ ํ’€์ด๋Š” ์ฒ˜์Œ 0~9๊นŒ์ง€์˜ ๋ฐฐ์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด์„œ Arr์— ๋„ฃ์€ ํ›„์— ๊ทธ ๋‹ค์Œ 1~10๊นŒ์ง€์˜ ๋ฐฐ์—ด์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์›๋ž˜์˜ 0์˜ ๊ฐœ์ˆ˜๋ฅผ ๋นผ๊ณ , ๊ทธ๋‹ค์Œ์— ์˜ฌ 10์˜ ๊ฐœ์ˆ˜๋ฅผ ๋”ํ•˜๋Š” ์‹์œผ๋กœ ๋กœ์ง์„ ๊ตฌํ˜„ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ๋‚˜์˜ ๊ณ„์‚ฐ๋ณด๋‹ค ํ›จ~์”ฌ ๋นจ๋ž๋‹ค. ๋‚˜๋Š” 0~9๊นŒ์ง€์˜ ๋ฐฐ์—ด์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋”•์…”๋„ˆ๋ฆฌ์— ๋„ฃ๋Š” ๋‹ค๋ฉด ์ด ๋ถ„์˜ ํ’€์ด๋Š” ๋ฐ”๋€ ๋ฐฐ์—ด๋งŒ ๊ณ„์‚ฐํ•˜์—ฌ ์‹œ๊ฐ„ ๋ณต์žก๋„๋„ ๊ณต๊ฐ„ ๋ณต์žก๋„๋„ ํ›จ์”ฌ ๋นจ๋ž๋‹ค.

 

์ฒ˜์Œ์—” ํ’€์ด๊ฐ€ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์•„ ํ•˜๋‚˜ํ•˜๋‚˜ ๋œฏ์–ด๋ณธ ๋’ค ์Šค์Šค๋กœ ๋‹ค์‹œ ์ด ํ’€์ด๋กœ ํ’€์–ด๋ณด์•˜๋‹ค. wandDic์€ ๊ตณ์ด ๋งŒ๋“ค์ง€ ์•Š์•„๋„ count๋ž‘ ๋น„๊ตํ•˜์—ฌ ๊ณ„์‚ฐํ•˜๋ฉด ๋˜์—ˆ๊ณ , ํŠน์ดํ•˜๊ฒŒ ๋”•์…”๋„ˆ๋ฆฌ์—๋Š” ์ •ํ˜„์ด๊ฐ€ ์›ํ•˜๋Š” ์ œํ’ˆ๋“ค์˜ index๊ฐ’์„ ๋„ฃ์–ด์„œ discount๋ฅผ ๋น„๊ตํ• ๋•Œ ํ•ด๋‹น ์ œํ’ˆ์ด ๋”•์…”๋„ˆ๋ฆฌ์— ๋“ค์–ด์žˆ์œผ๋ฉด ํ•ด๋‹น ๋”•์…”๋„ˆ๋ฆฌ์˜ value๊ฐ’ ( ์ •ํ˜„์ด๊ฐ€ ์›ํ•˜๋Š” ์ œํ’ˆ์˜ index ๊ฐ’ ) ์— ์žˆ๋Š” ๋ฐฐ์—ด์˜ ๊ฐ’์„ ์˜ฌ๋ ธ๋‹ค.

 

๋‹ค๋ฅธ ์‚ฌ๋žŒ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๋‹ค์‹œ ํ’€์–ด๋ณธ ๋‚˜์˜ ํ’€์ด

func solution(_ want:[String], _ number:[Int], _ discount:[String]) -> Int {
    
    var wantArrNum = [String: Int]()
    var discountArr = [Int](repeating: 0, count: want.count)
    var count = 0
    
    for i in 0..<want.count {
        wantArrNum[want[i]] = i
    }
    
    for i in 0..<10 {
        guard let tmp = wantArrNum[discount[i]] else {
            continue
        }
        discountArr[tmp] += 1
    }
    
    print(number, discountArr)
    
    if number == discountArr {
        count += 1
    }
    
    for i in 0..<discount.count-10 {
        if let arrNum = wantArrNum[discount[i]] {
            discountArr[arrNum] -= 1
        }
        
        if let arrNum = wantArrNum[discount[i+10]]  {
            discountArr[arrNum] += 1
        }
        
        print(number, discountArr)
        
        if number == discountArr {
            count += 1
        }
    }
    
    return count
}