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

[ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ] ์˜์ƒ

EarthSea 2024. 4. 18. 10:04

 

 

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

 

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

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

programmers.co.kr

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

 

-Swift-CodingTest/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/2/42578.โ€…์˜์ƒ at main · BaeJihae/-Swift-CodingTest

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

github.com

 

 

 

๋ฌธ์ œ ์„ค๋ช…

์ฝ”๋‹ˆ๋Š” ๋งค์ผ ๋‹ค๋ฅธ ์˜ท์„ ์กฐํ•ฉํ•˜์—ฌ ์ž…๋Š”๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ฝ”๋‹ˆ๊ฐ€ ๊ฐ€์ง„ ์˜ท์ด ์•„๋ž˜์™€ ๊ฐ™๊ณ , ์˜ค๋Š˜ ์ฝ”๋‹ˆ๊ฐ€ ๋™๊ทธ๋ž€ ์•ˆ๊ฒฝ, ๊ธด ์ฝ”ํŠธ, ํŒŒ๋ž€์ƒ‰ ํ‹ฐ์…”์ธ ๋ฅผ ์ž…์—ˆ๋‹ค๋ฉด ๋‹ค์Œ๋‚ ์€ ์ฒญ๋ฐ”์ง€๋ฅผ ์ถ”๊ฐ€๋กœ ์ž…๊ฑฐ๋‚˜ ๋™๊ทธ๋ž€ ์•ˆ๊ฒฝ ๋Œ€์‹  ๊ฒ€์ • ์„ ๊ธ€๋ผ์Šค๋ฅผ ์ฐฉ์šฉํ•˜๊ฑฐ๋‚˜ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

 

์ข…๋ฅ˜ ์ด๋ฆ„
์–ผ๊ตด ๋™๊ทธ๋ž€ ์•ˆ๊ฒฝ, ๊ฒ€์ • ์„ ๊ธ€๋ผ์Šค
์ƒ์˜ ํŒŒ๋ž€์ƒ‰ ํ‹ฐ์…”์ธ 
ํ•˜์˜ ์ฒญ๋ฐ”์ง€
๊ฒ‰์˜ท ๊ธด ์ฝ”ํŠธ

 

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

 

์ฝ”๋‹ˆ๊ฐ€ ๊ฐ€์ง„ ์˜์ƒ๋“ค์ด ๋‹ด๊ธด 2์ฐจ์› ๋ฐฐ์—ด clothes๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ ์„œ๋กœ ๋‹ค๋ฅธ ์˜ท์˜ ์กฐํ•ฉ์˜ ์ˆ˜๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

 

 

์ œํ•œ์‚ฌํ•ญ

  • clothes์˜ ๊ฐ ํ–‰์€ [์˜์ƒ์˜ ์ด๋ฆ„, ์˜์ƒ์˜ ์ข…๋ฅ˜]๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฝ”๋‹ˆ๊ฐ€ ๊ฐ€์ง„ ์˜์ƒ์˜ ์ˆ˜๋Š” 1๊ฐœ ์ด์ƒ 30๊ฐœ ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์˜์ƒ์€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • clothes์˜ ๋ชจ๋“  ์›์†Œ๋Š” ๋ฌธ์ž์—ด๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋Š” 1 ์ด์ƒ 20 ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ด๊ณ  ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž ๋˜๋Š” '_' ๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์ž…์ถœ๋ ฅ ์˜ˆ

clothes return
[["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]] 5
[["crow_mask", "face"], ["blue_sunglasses", "face"], ["smoky_makeup", "face"]] 3

 

 

๋ฌธ์ œ ํ’€์ด

 

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

import Foundation

func solution(_ clothes:[[String]]) -> Int {
    
    var clothesDic = [String:Int]()
    
    clothes.forEach{ clothesDic[$0[1]] = ( clothesDic[$0[1]] ?? 0 ) + 1 }
    
    return clothesDic.values.reduce(1) { $0 * ($1 + 1) } - 1
}

 

๋ณด์ž๋งˆ์ž ๋”•์…”๋„ˆ๋ฆฌ ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค.

 

์ฒ˜์Œ์—๋Š” ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ [String: [String]]์œผ๋กœ ์ •์˜ํ•˜์—ฌ [์˜์ƒ์˜ ์ข…๋ฅ˜: [์˜์ƒ์˜ ์ด๋ฆ„]] ( ์˜์ƒ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ฅธ ์˜์ƒ์˜ ์ด๋ฆ„ ๋ฐฐ์—ด )์„ ๋‹ด์•˜๋‹ค. ํ•˜์ง€๋งŒ, ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ตณ์ด ์˜์ƒ์˜ ์ด๋ฆ„ ๋ฐฐ์—ด์ด ์•„๋‹Œ ์˜์ƒ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ฅธ ์˜์ƒ ๊ฐฏ์ˆ˜๋งŒ ๋“ค์–ด๊ฐ€๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๊ณ , [String:Int]๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค.

 

์˜์ƒ์„ ๊ณ ๋ฅด๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์€ ์‰ฌ์› ๋‹ค. ๊ณฑ์˜ ๋ฒ•์น™์„ ํ™œ์šฉํ•ด ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ–ˆ๋‹ค. ์œ—์˜ท 2๋ฒŒ, ์•„๋ž˜์˜ท 3๋ฒŒ์ด ์žˆ์„ ๊ฒฝ์šฐ์—” ์˜ท์„ ๊ณ ๋ฅด๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ 23์ด๋ฏ€๋กœ 6์ด๋‹ค. ์œ„์˜ ๋ฌธ์ œ๋Š” ์œ—์˜ท์„ ์•ˆ์ž…์„์ˆ˜๋„ ์•„๋ž˜์˜ท์„ ์•ˆ์ž…์„ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฐ€์ •์ด ๋‚ด์ œ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— (2+1)(3+1)์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜์—ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋ฌด์กฐ๊ฑด ์˜ท์„ ํ•œ ๊ฐœ ์ด์ƒ์€ ์ž…์–ด์•ผํ•œ๋‹ค๋Š” ๊ฐ€์ •์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜๋ฅผ ๋นผ์ค€๋‹ค.

 

 

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

import Foundation

func solution(_ clothes:[[String]]) -> Int {
    let types = clothes.compactMap({ $0.last })
    let typeSet = Set(types)
    let categories = Array(typeSet)

    let counts = categories.map({ category in
        return clothes.filter({ $0.last == category }).count + 1
    })

    return counts.reduce(1,  { $0 * $1 }) - 1
}

 

let types = clothes.compactMap({ $0.last })
// 	["headgear", "eyewear", "headgear"]

let typeSet = Set(types) // ์ค‘๋ณต๊ฐ’ ์ œ๊ฑฐ
// ["headgear", "eyewear"]

let categories = Array(typeSet) // ๋‹ค์‹œ array๋กœ ๋ณ€ํ™˜
// ["headgear", "eyewear"]

 

์œ„์˜ ๊ณผ์ •์„ ํ†ตํ•ด ์˜์ƒ์˜ ์ข…๋ฅ˜ ๋ฐฐ์—ด์„ ์–ป๊ณ , ์ด ๋ฐฐ์—ด์„ ์ด์šฉํ•ด ๊ฐ ์ข…๋ฅ˜์— ๋”ฐ๋ฅธ ์˜ท์˜ ๊ฐฏ์ˆ˜๋ฅผ map๊ณผ filter๋ฅผ ํ†ตํ•ด ๊ตฌํ•˜์˜€๋‹ค. ๊ฒฝ์šฐ์˜์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๊ณผ์ •์€ ๋‚˜๋ž‘ ๋™์ผํ–ˆ๋‹ค.

 

 

์œ„์˜ ํ’€์ด๋ฅผ ์••์ถ•์‹œํ‚จ๋‹ค๋ฉด ์•„๋ž˜์˜ ํ’€์ด๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

func solution(_ clothes:[[String]]) -> Int {
    let counts = Set(clothes.compactMap({ $0.last })).map({ category in
        return clothes.filter({ $0.last == category }).count + 1
    })

    return counts.reduce(1,  { $0 * $1 }) - 1
}

 

 

๐Ÿค” ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋ฌธ์ œ๋Š” ๋ฐฐ์—ด์ด ๋น ๋ฅผ๊นŒ ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ ๋น ๋ฅผ๊นŒ…?

 

๋‚˜์˜ ํ’€์ด์ธ ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ ๋น ๋ฅด๋‹ค๋Š” ํŒ๋‹จ์„ ํ–ˆ๋‹ค.

 

๋ฐฐ์—ด๋กœ ํ‘ธ๋Š” ๊ณผ์ •์—์„œ filter ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ์š”์†Œ์— ๋Œ€ํ•œ ์‹คํ–‰์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋†’์•„์ง„๋‹ค. ๋˜ํ•œ ๋งค๋ฒˆ filtering์„ ๊ฑฐ์ณ์•ผ ํ•˜๋ฏ€๋กœ ์ถ”๊ฐ€์ ์ธ ๊ณ„์‚ฐ์ด ๋งŽ์•„์ง„๋‹ค. ๊ฐ ์ข…๋ฅ˜๋งˆ๋‹ค ๋ชจ๋“  ๋ฐฐ์—ด์„ ๋‹ค์‹œ ํ•œ๋ฒˆ๋” ๊ฒ€์ƒ‰์„ ํ•ด์•ผํ•˜๋ฏ€๋กœ ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n^2)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

 

๊ทธ์— ๋น„์— ๋‚˜์˜ ํ’€์ด์ธ ๋”•์…”๋„ˆ๋ฆฌ๋Š” clothes๋ฅผ ๊ด€์ฐฐํ•˜์—ฌ ๋”ฑ ํ•œ๋ฒˆ์˜ O(n) ๊ณผ์ •์œผ๋กœ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.