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

[ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ] ์‹ ๊ณ  ๊ฒฐ๊ณผ ๋ฐ›๊ธฐ

EarthSea 2024. 3. 20. 16:03

 

 

 

๐Ÿ„ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ

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

โœ๐Ÿป Github

๋ฌธ์ œ ํ’€์ด github ๋งํฌ

 

 

๋ฌธ์ œ ์„ค๋ช…

์‹ ์ž…์‚ฌ์› ๋ฌด์ง€๋Š” ๊ฒŒ์‹œํŒ ๋ถˆ๋Ÿ‰ ์ด์šฉ์ž๋ฅผ ์‹ ๊ณ ํ•˜๊ณ  ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”์ผ๋กœ ๋ฐœ์†กํ•˜๋Š” ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๋ฌด์ง€๊ฐ€ ๊ฐœ๋ฐœํ•˜๋ ค๋Š” ์‹œ์Šคํ…œ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ฐ ์œ ์ €๋Š” ํ•œ ๋ฒˆ์— ํ•œ ๋ช…์˜ ์œ ์ €๋ฅผ ์‹ ๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์‹ ๊ณ  ํšŸ์ˆ˜์— ์ œํ•œ์€ ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ์œ ์ €๋ฅผ ๊ณ„์†ํ•ด์„œ ์‹ ๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ•œ ์œ ์ €๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹ ๊ณ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋™์ผํ•œ ์œ ์ €์— ๋Œ€ํ•œ ์‹ ๊ณ  ํšŸ์ˆ˜๋Š” 1ํšŒ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  • k๋ฒˆ ์ด์ƒ ์‹ ๊ณ ๋œ ์œ ์ €๋Š” ๊ฒŒ์‹œํŒ ์ด์šฉ์ด ์ •์ง€๋˜๋ฉฐ, ํ•ด๋‹น ์œ ์ €๋ฅผ ์‹ ๊ณ ํ•œ ๋ชจ๋“  ์œ ์ €์—๊ฒŒ ์ •์ง€ ์‚ฌ์‹ค์„ ๋ฉ”์ผ๋กœ ๋ฐœ์†กํ•ฉ๋‹ˆ๋‹ค.
    • ์œ ์ €๊ฐ€ ์‹ ๊ณ ํ•œ ๋ชจ๋“  ๋‚ด์šฉ์„ ์ทจํ•ฉํ•˜์—ฌ ๋งˆ์ง€๋ง‰์— ํ•œ๊บผ๋ฒˆ์— ๊ฒŒ์‹œํŒ ์ด์šฉ ์ •์ง€๋ฅผ ์‹œํ‚ค๋ฉด์„œ ์ •์ง€ ๋ฉ”์ผ์„ ๋ฐœ์†กํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ „์ฒด ์œ ์ € ๋ชฉ๋ก์ด ["muzi", "frodo", "apeach", "neo"]์ด๊ณ , k = 2(์ฆ‰, 2๋ฒˆ ์ด์ƒ ์‹ ๊ณ ๋‹นํ•˜๋ฉด ์ด์šฉ ์ •์ง€)์ธ ๊ฒฝ์šฐ์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

์œ ์ € ID ์œ ์ €๊ฐ€ ์‹ ๊ณ ํ•œ ID ์„ค๋ช…
"muzi" "frodo" "muzi"๊ฐ€ "frodo"๋ฅผ ์‹ ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.
"apeach" "frodo" "apeach"๊ฐ€ "frodo"๋ฅผ ์‹ ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.
"frodo" "neo" "frodo"๊ฐ€ "neo"๋ฅผ ์‹ ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.
"muzi" "neo" "muzi"๊ฐ€ "neo"๋ฅผ ์‹ ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.
"apeach" "muzi" "apeach"๊ฐ€ "muzi"๋ฅผ ์‹ ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ์œ ์ €๋ณ„๋กœ ์‹ ๊ณ ๋‹นํ•œ ํšŸ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์œ ์ € ID ์‹ ๊ณ ๋‹นํ•œ ํšŸ์ˆ˜
"muzi" 1
"frodo" 2
"apeach" 0
"neo" 2

์œ„ ์˜ˆ์‹œ์—์„œ๋Š” 2๋ฒˆ ์ด์ƒ ์‹ ๊ณ ๋‹นํ•œ "frodo"์™€ "neo"์˜ ๊ฒŒ์‹œํŒ ์ด์šฉ์ด ์ •์ง€๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ๊ฐ ์œ ์ €๋ณ„๋กœ ์‹ ๊ณ ํ•œ ์•„์ด๋””์™€ ์ •์ง€๋œ ์•„์ด๋””๋ฅผ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์œ ์ € ID ์œ ์ €๊ฐ€ ์‹ ๊ณ ํ•œ ID ์ •์ง€๋œ ID
"muzi" ["frodo", "neo"] ["frodo", "neo"]
"frodo" ["neo"] ["neo"]
"apeach" ["muzi", "frodo"] ["frodo"]
"neo" ์—†์Œ ์—†์Œ

๋”ฐ๋ผ์„œ "muzi"๋Š” ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ๋ฉ”์ผ์„ 2ํšŒ, "frodo"์™€ "apeach"๋Š” ๊ฐ๊ฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ๋ฉ”์ผ์„ 1ํšŒ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด์šฉ์ž์˜ ID๊ฐ€ ๋‹ด๊ธด ๋ฌธ์ž์—ด ๋ฐฐ์—ด id_list, ๊ฐ ์ด์šฉ์ž๊ฐ€ ์‹ ๊ณ ํ•œ ์ด์šฉ์ž์˜ ID ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ๋ฌธ์ž์—ด ๋ฐฐ์—ด report, ์ •์ง€ ๊ธฐ์ค€์ด ๋˜๋Š” ์‹ ๊ณ  ํšŸ์ˆ˜ k๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๊ฐ ์œ ์ €๋ณ„๋กœ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ๋ฉ”์ผ์„ ๋ฐ›์€ ํšŸ์ˆ˜๋ฅผ ๋ฐฐ์—ด์— ๋‹ด์•„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

 

์ œํ•œ์‚ฌํ•ญ

  • 2 ≤ id_list์˜ ๊ธธ์ด ≤ 1,000
    • 1 ≤ id_list์˜ ์›์†Œ ๊ธธ์ด ≤ 10
    • id_list์˜ ์›์†Œ๋Š” ์ด์šฉ์ž์˜ id๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด์ด๋ฉฐ ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
    • id_list์—๋Š” ๊ฐ™์€ ์•„์ด๋””๊ฐ€ ์ค‘๋ณตํ•ด์„œ ๋“ค์–ด์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • 1 ≤ report์˜ ๊ธธ์ด ≤ 200,000
    • 3 ≤ report์˜ ์›์†Œ ๊ธธ์ด ≤ 21
    • report์˜ ์›์†Œ๋Š” "์ด์šฉ์žid ์‹ ๊ณ ํ•œid"ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด "muzi frodo"์˜ ๊ฒฝ์šฐ "muzi"๊ฐ€ "frodo"๋ฅผ ์‹ ๊ณ ํ–ˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
    • id๋Š” ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด์šฉ์žid์™€ ์‹ ๊ณ ํ•œid๋Š” ๊ณต๋ฐฑ(์ŠคํŽ˜์ด์Šค)ํ•˜๋‚˜๋กœ ๊ตฌ๋ถ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ž๊ธฐ ์ž์‹ ์„ ์‹ ๊ณ ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†์Šต๋‹ˆ๋‹ค.
  • 1 ≤ k ≤ 200, k๋Š” ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • return ํ•˜๋Š” ๋ฐฐ์—ด์€ id_list์— ๋‹ด๊ธด id ์ˆœ์„œ๋Œ€๋กœ ๊ฐ ์œ ์ €๊ฐ€ ๋ฐ›์€ ๊ฒฐ๊ณผ ๋ฉ”์ผ ์ˆ˜๋ฅผ ๋‹ด์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ

id_list report k result
["muzi", "frodo", "apeach", "neo"] ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"] 2 [2,1,1,0]
["con", "ryan"] ["ryan con", "ryan con", "ryan con", "ryan con"] 3 [0,0]

 

์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

์ž…์ถœ๋ ฅ ์˜ˆ #1

๋ฌธ์ œ์˜ ์˜ˆ์‹œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ #2

"ryan"์ด "con"์„ 4๋ฒˆ ์‹ ๊ณ ํ–ˆ์œผ๋‚˜, ์ฃผ์–ด์ง„ ์กฐ๊ฑด์— ๋”ฐ๋ผ ํ•œ ์œ ์ €๊ฐ€ ๊ฐ™์€ ์œ ์ €๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹ ๊ณ ํ•œ ๊ฒฝ์šฐ๋Š” ์‹ ๊ณ  ํšŸ์ˆ˜ 1ํšŒ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ "con"์€ 1ํšŒ ์‹ ๊ณ ๋‹นํ–ˆ์Šต๋‹ˆ๋‹ค. 3๋ฒˆ ์ด์ƒ ์‹ ๊ณ ๋‹นํ•œ ์ด์šฉ์ž๋Š” ์—†์œผ๋ฉฐ, "con"๊ณผ "ryan"์€ ๊ฒฐ๊ณผ ๋ฉ”์ผ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ [0, 0]์„ return ํ•ฉ๋‹ˆ๋‹ค.

 

 

๋ฌธ์ œ ํ’€์ด

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

 

์ •๋‹ต๋ฅ  91.7 -> ์‹คํŒจ

import Foundation

func solution(_ id_list:[String], _ report:[String], _ k:Int) -> [Int] {

    // ๋ ˆํฌํŠธ๋ฅผ array๋กœ ์ €์žฅ
    var reportArray = [[String]]()
    // ์‹ ๊ณ ๋ฐ›์€ ํšŸ์ˆ˜ ์ €์žฅ
    var reportedUserDict = [String: Int]()
    // ์œ ์ €์— ๋”ฐ๋ฅธ ๋ฉ”์ผ์„ ๋ฐ›์€ ํšŸ์ˆ˜ ์ €์žฅ
    var emailedUser = [Int](repeating: 0, count: id_list.count)
    
    var i = 0
    for re in Set(report) {
        reportArray.append(re.split(separator: " ").map{ String($0) })
        let reported = String(reportArray[i][1])
        i += 1
        if reportedUserDict[reported] == nil {
            reportedUserDict[reported] = 1
        }else {
            reportedUserDict[reported]! += 1
        }
    }
    
    // ์‹ ๊ณ ๋‹นํ•œ ์œ ์ €
    let reportedUser = reportedUserDict.filter{ $1 >= k }.map{ $0.key }
    if reportedUser.isEmpty { return emailedUser }
    
    for a in reportArray{
        if reportedUser.contains(a[1]) {
            emailedUser[id_list.firstIndex(of: a[0])!] += 1
        }
    }
    return emailedUser
}

 

์šฐ์„  ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ํ’€์ด๊ณผ์ •์€ ์‹ ๊ณ  ๋‹นํ•œ ์œ ์ € ์ค‘ ์‹ ๊ณ  ํšŸ์ˆ˜๊ฐ€ k๊ฐœ๊ฐ€ ๋„˜๋Š” ์œ ์ €๋ฅผ ๊ตฌํ•˜์—ฌ ๊ทธ ์œ ์ €๋ฅผ ์‹ ๊ณ ํ•œ ์œ ์ €๋ฅผ ์ฐพ์•„ ๋ฐฐ์—ด์˜ ๊ฐฏ์ˆ˜๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ƒ๊ฐ๋งŒํผ์ด๋‚˜ ์‰ฝ์ง€ ์•Š์•˜๋‹ค. ์‹ ๊ณ  ํšŸ์ˆ˜๊ฐ€ ์ ํ˜€์žˆ๋Š” Report์˜ ์ตœ๋Œ“๊ฐ’์ด 200,000 ์ด์˜€๊ณ , id_list์˜ ์ตœ๋Œ“๊ฐ’์ด 1,000์ด๊ธฐ ๋•Œ๋ฌธ์— 3๋ฒˆ๊ณผ 21๋ฒˆ์—์„œ์˜ ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ํ”ผํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

 

๋”๋ณด๊ธฐ
ํ…Œ์ŠคํŠธ 1 ใ€‰	ํ†ต๊ณผ (0.13ms, 16.4MB)
ํ…Œ์ŠคํŠธ 2 ใ€‰	ํ†ต๊ณผ (0.20ms, 16.5MB)
ํ…Œ์ŠคํŠธ 3 ใ€‰	์‹คํŒจ (์‹œ๊ฐ„ ์ดˆ๊ณผ)
ํ…Œ์ŠคํŠธ 4 ใ€‰	ํ†ต๊ณผ (0.29ms, 16.2MB)
ํ…Œ์ŠคํŠธ 5 ใ€‰	ํ†ต๊ณผ (0.31ms, 16.6MB)
ํ…Œ์ŠคํŠธ 6 ใ€‰	ํ†ต๊ณผ (6.46ms, 16.6MB)
ํ…Œ์ŠคํŠธ 7 ใ€‰	ํ†ต๊ณผ (13.79ms, 16.8MB)
ํ…Œ์ŠคํŠธ 8 ใ€‰	ํ†ต๊ณผ (21.19ms, 16.9MB)
ํ…Œ์ŠคํŠธ 9 ใ€‰	ํ†ต๊ณผ (4654.00ms, 31.8MB)
ํ…Œ์ŠคํŠธ 10 ใ€‰	ํ†ต๊ณผ (350.81ms, 31.6MB)
ํ…Œ์ŠคํŠธ 11 ใ€‰	ํ†ต๊ณผ (8415.67ms, 50.1MB)
ํ…Œ์ŠคํŠธ 12 ใ€‰	ํ†ต๊ณผ (5.46ms, 16.4MB)
ํ…Œ์ŠคํŠธ 13 ใ€‰	ํ†ต๊ณผ (1.61ms, 16.5MB)
ํ…Œ์ŠคํŠธ 14 ใ€‰	ํ†ต๊ณผ (6474.66ms, 30.2MB)
ํ…Œ์ŠคํŠธ 15 ใ€‰	ํ†ต๊ณผ (613.91ms, 42MB)
ํ…Œ์ŠคํŠธ 16 ใ€‰	ํ†ต๊ณผ (1.55ms, 16.7MB)
ํ…Œ์ŠคํŠธ 17 ใ€‰	ํ†ต๊ณผ (1.38ms, 16.4MB)
ํ…Œ์ŠคํŠธ 18 ใ€‰	ํ†ต๊ณผ (7.80ms, 16.5MB)
ํ…Œ์ŠคํŠธ 19 ใ€‰	ํ†ต๊ณผ (30.51ms, 16.5MB)
ํ…Œ์ŠคํŠธ 20 ใ€‰	ํ†ต๊ณผ (6781.54ms, 30.4MB)
ํ…Œ์ŠคํŠธ 21 ใ€‰	์‹คํŒจ (์‹œ๊ฐ„ ์ดˆ๊ณผ)
ํ…Œ์ŠคํŠธ 22 ใ€‰	ํ†ต๊ณผ (0.10ms, 16.1MB)
ํ…Œ์ŠคํŠธ 23 ใ€‰	ํ†ต๊ณผ (0.11ms, 16.3MB)
ํ…Œ์ŠคํŠธ 24 ใ€‰	ํ†ต๊ณผ (0.09ms, 16.2MB)

 

๋‚ด๊ฐ€ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋œ ์ด์œ ๋ฅผ ๋” ์ž์„ธํ•˜๊ฒŒ ๋œฏ์–ด๋ณด์ž. ๊ทธ๋ž˜์•ผ ๋‹ค์Œ์—๋„ ๋˜‘๊ฐ™์€ ์‹ค์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์œผ๋‹ˆ๊น.

 

๋‚˜๋Š” " ํ•œ ์œ ์ €๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹ ๊ณ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋™์ผํ•œ ์œ ์ €์— ๋Œ€ํ•œ ์‹ ๊ณ  ํšŸ์ˆ˜๋Š” 1ํšŒ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. " ๋ผ๋Š” ์กฐ๊ฑด์— ๋”ฐ๋ผ ์šฐ์„  ์ค‘๋ณต๋˜๋Š” report ๊ฐ’์„ Set ๋กœ ํ•œ๋ฒˆ ๊ฐ์‹ธ์„œ ์ค‘๋ณต์„ ์—†์• ์ฃผ์—ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ์‹ ๊ณ ๋ฐ›์€ ์œ ์ €์™€ ์‹ ๊ณ ํ•œ ์œ ์ €๊ฐ€ ํ•œ ๋ฌธ์ž์—ด๋กœ ์„ ์–ธ์ด ๋˜์–ด์žˆ์œผ๋‹ˆ ์ด๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ’์„ ์„œ์น˜ํ•˜๊ธฐ ํŽธํ•˜๊ฒŒ ๋ฐ”๊พธ์–ด์•ผ ํ–ˆ๋‹ค. report๋ฅผ ํ•œ ๋ฒˆ์€ ๋Œ์•„์•ผ๋งŒ ํ•œ๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ for๋ฌธ์„ ๋Œ๋ฆด ๋•Œ, ์‹ ๊ณ ๋ฐ›์€ ์œ ์ €๋งŒ ๋”ฐ๋กœ ๋”•์…”๋„ˆ๋ฆฌ์— ์ €์žฅํ•˜์—ฌ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ์—ˆ๊ณ , ์‹ ๊ณ ํ•œ ์œ ์ €์™€ ์‹ ๊ณ ๋ฐ›์€ ์œ ์ €๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ์„ ์–ธํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ, ํ‚ค ๊ฐ’์ด ์ค‘๋ณต๋  ์ˆ˜๋Š” ์—†์œผ๋‹ˆ ์–ด์ฉ” ์ˆ˜ ์—†์ด ์ด์ค‘๋ฐฐ์—ด๋กœ ์„ ์–ธํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ด๋ฏธ ๋‚œ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค. ์‹ ๊ณ ํ•œ ์œ ์ €์™€ ์‹ ๊ณ ๋ฐ›์€ ์œ ์ €๋ฅผ ๋ฐฐ์—ด๋กœ ์„ ์–ธํ•œ ์ˆœ๊ฐ„ ์‹ ๊ณ ๋ฐ›์€ ์œ ์ €๋ฅผ ์„œ์น˜ํ•ด์„œ ์‹ ๊ณ ํ•œ ์œ ์ €๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์—์„œ ์ตœ๋Œ€ O(200,000)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ์ด๋‹ค. ์•ž์„œ report๋ฅผ ํ•œ๋ฒˆ ์กฐ์‚ฌํ•  ๋•Œ, O(200,000)๋ฒˆ์„ ์‚ฌ์šฉํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(400,000)์ด ๋˜์–ด ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค. ๊ฑฐ๊ธฐ๋‹ค๊ฐ€ + ์‹ ๊ณ ๋‹นํ•œ ์œ ์ €๊ฐ€ k๊ฐ€ ๋„˜๋Š” ๊ฐ’์ž„์„ ์กฐ์‚ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋˜ filter์™€ map์„ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ๊ทธ ์ด์ƒ์ด ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค. 

 

๋‚ด๊ฐ€ ๋†“์นœ ๋ถ€๋ถ„์€ ๋ฐ”๋กœ ์—ฌ๊ธฐ ์‹ ๊ณ ํ•œ ์œ ์ €์™€ ์‹ ๊ณ ๋ฐ›์€ ์œ ์ €๋ฅผ ์ด์ค‘๋ฐฐ์—ด๋กœ ์„ ์–ธํ•œ ๋ถ€๋ถ„! 1์‹œ๊ฐ„ ๋„˜๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ’€๋‹ค๊ฐ€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋ชป์ฐพ์ž ํžŒํŠธ๋ฅผ ์ฐพ์•„ ๋‚˜์„ฐ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์ด์ค‘ ๋ฐฐ์—ด์ด ์•„๋‹Œ ๋”•์…”๋„ˆ๋ฆฌ์— ๋„ฃ์–ด์•ผ ํ–ˆ๋‹ค. [String: [String]] ์ด๋ ‡๊ฒŒ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ง๊ฐ. ์•„๋‹ˆ ๋ชฐ๋ž๋˜ ๊ฒƒ์ด๋‹ค. ์ด ๋ฌธ์ œ์˜ ์š”์ ์€ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ์„œ์น˜ ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋ƒ๋ฅผ ๋ฌป๋Š” ๋ฌธ์ œ์˜€๋‹ค. ๋”•์…”๋„ˆ๋ฆฌ์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ๊ณต๋ถ€์™€ ๋” ๋งŽ์€ ๋ฌธ์ œ ํ’€์ด๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ ํžŒํŠธ๋ฅผ ์–ป์–ด ๋‹ค์‹œ ํ’€์–ด๋‚˜๊ฐ”๋‹ค.

 

์ •๋‹ต๋ฅ  100 -> ์„ฑ๊ณต!

import Foundation

func solution(_ id_list:[String], _ report:[String], _ k:Int) -> [Int] {
    
    // ๋ ˆํฌํŠธ๋ฅผ array๋กœ ์ €์žฅ
    var reportDic = [String:[String]]()
    // ์‹ ๊ณ ๋ฐ›์€ ํšŸ์ˆ˜ ์ €์žฅ
    var reportedUserDict = [String:Int]()

    for str in Set(report) {
        var reportArr = str.split(separator: " ").map{ String($0) }
        
        // ์‹ ๊ณ ๋ฐ›์€ ์œ ์ €๋งŒ reportedUserDict์— ์ €์žฅ
        reportedUserDict[reportArr[1]] = (reportedUserDict[reportArr[1]] ?? 0) + 1
        
        // ๋ ˆํฌํŠธ์˜ ๋‚ด์šฉ์„ reportDic์— ์ €์žฅ
        reportDic[reportArr[0]] = (reportDic[reportArr[0]] ?? []) + [reportArr[1]]
        
    }
    
    // ์‹ ๊ณ ๋ฐ›์€ ์œ ์ €์˜ ์‹ ๊ณ  ํšŸ์ˆ˜๊ฐ€ k๊ฐ€ ๋„˜๋Š” ์œ ์ €๋งŒ ๋‚จ๊ธฐ๊ธฐ
    reportedUserDict.forEach{ 
        if $0.value < k {
            reportedUserDict[$0.key] = nil
        } 
    }
    
    return id_list.map { id in
        (reportDic[id] ?? []).filter{
            reportedUserDict.keys.contains($0)
        }.count
    }
}

 

๋”•์…”๋„ˆ๋ฆฌ์˜ value ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ value ๊ฐ’์„ ์–ป์–ด์˜ฌ ๋•Œ๋Š” ์˜ต์…”๋„ ๊ฐ’์œผ๋กœ ๊ฐ์‹ธ์ ธ ์žˆ์–ด ์–ธ๋ž˜ํ•‘์ด ํ•„์š”ํ•˜๋‹ค ์ด๋•Œ๊นŒ์ง€๋Š” if๋ฌธ์ด๋‚˜ guard let ์œผ๋กœ ๋”•์…”๋„ˆ๋ฆฌ์˜ ๊ฐ’์„ ์–ธ๋ž˜ํ•‘ ํ–ˆ์—ˆ๋Š”๋ฐ, ์ด๋ฒˆ ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ?? ๋ฅผ ์จ์„œ ๋ฐ”์ธ๋”ฉํ•˜๋ฉด ํ›จ์”ฌ ํŽธํ•˜๊ฒŒ ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•˜๊ฑฐ๋‚˜ ์ฆ๊ฐ ์—ฐ์‚ฐ์ž๋ฅผ ์“ฐ๊ฑฐ๋‚˜ ๊ฐ’์„ ๋นผ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋‚ด์ผ ํ•œ๋ฒˆ๋” ํ’€์–ด๋ณด๋ฉด์„œ ๋”•์…”๋„ˆ๋ฆฌ์— ๋Œ€ํ•œ ๋ณต์Šต์„ ์ง„ํ–‰ํ•ด๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

๋”๋ณด๊ธฐ
ํ…Œ์ŠคํŠธ 1 ใ€‰	ํ†ต๊ณผ (0.15ms, 16.4MB)
ํ…Œ์ŠคํŠธ 2 ใ€‰	ํ†ต๊ณผ (0.23ms, 16.5MB)
ํ…Œ์ŠคํŠธ 3 ใ€‰	ํ†ต๊ณผ (1034.26ms, 39.8MB)
ํ…Œ์ŠคํŠธ 4 ใ€‰	ํ†ต๊ณผ (0.32ms, 16.5MB)
ํ…Œ์ŠคํŠธ 5 ใ€‰	ํ†ต๊ณผ (0.33ms, 16.6MB)
ํ…Œ์ŠคํŠธ 6 ใ€‰	ํ†ต๊ณผ (11.91ms, 16.7MB)
ํ…Œ์ŠคํŠธ 7 ใ€‰	ํ†ต๊ณผ (19.24ms, 17MB)
ํ…Œ์ŠคํŠธ 8 ใ€‰	ํ†ต๊ณผ (14.18ms, 17.1MB)
ํ…Œ์ŠคํŠธ 9 ใ€‰	ํ†ต๊ณผ (533.04ms, 27.1MB)
ํ…Œ์ŠคํŠธ 10 ใ€‰	ํ†ต๊ณผ (577.07ms, 26.7MB)
ํ…Œ์ŠคํŠธ 11 ใ€‰	ํ†ต๊ณผ (1104.82ms, 39.1MB)
ํ…Œ์ŠคํŠธ 12 ใ€‰	ํ†ต๊ณผ (2.54ms, 16.8MB)
ํ…Œ์ŠคํŠธ 13 ใ€‰	ํ†ต๊ณผ (1.43ms, 16.4MB)
ํ…Œ์ŠคํŠธ 14 ใ€‰	ํ†ต๊ณผ (338.69ms, 26.5MB)
ํ…Œ์ŠคํŠธ 15 ใ€‰	ํ†ต๊ณผ (542.44ms, 37.9MB)
ํ…Œ์ŠคํŠธ 16 ใ€‰	ํ†ต๊ณผ (2.12ms, 16.7MB)
ํ…Œ์ŠคํŠธ 17 ใ€‰	ํ†ต๊ณผ (1.32ms, 16.3MB)
ํ…Œ์ŠคํŠธ 18 ใ€‰	ํ†ต๊ณผ (2.40ms, 16.6MB)
ํ…Œ์ŠคํŠธ 19 ใ€‰	ํ†ต๊ณผ (7.45ms, 16.5MB)
ํ…Œ์ŠคํŠธ 20 ใ€‰	ํ†ต๊ณผ (318.61ms, 26.6MB)
ํ…Œ์ŠคํŠธ 21 ใ€‰	ํ†ต๊ณผ (513.44ms, 37.4MB)
ํ…Œ์ŠคํŠธ 22 ใ€‰	ํ†ต๊ณผ (0.12ms, 16.3MB)
ํ…Œ์ŠคํŠธ 23 ใ€‰	ํ†ต๊ณผ (0.13ms, 16.4MB)
ํ…Œ์ŠคํŠธ 24 ใ€‰	ํ†ต๊ณผ (0.13ms, 16.6MB)

 

 

 

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

import Foundation

func solution(_ id_list:[String], _ report:[String], _ k:Int) -> [Int] {
    
    // ๋ ˆํฌํŠธ๋ฅผ Dict๋กœ ์ €์žฅ
    var reportDict = [String: [String]]()
    // ์‹ ๊ณ ๋ฐ›์€ ํšŸ์ˆ˜ ์ €์žฅ
    var reportedUserDict = [String: Int]()
    
    for str in Set(report){
        let array = str.split(separator: " ").map{ String($0) }
        
        reportDict[array[0]] = (reportDict[array[0]] ?? []) + [array[1]]
        reportedUserDict[array[1]] = (reportedUserDict[array[1]] ?? 0) + 1
        
    }
    
    return id_list.map{ id in
        return (reportDict[id] ?? []).reduce(0) {
            $0 + ((reportedUserDict[$1] ?? 0 ) >= k ? 1 : 0)
        }
    }
}

 

๊ฐํƒ„.. ๊ทธ ์ž์ฒด.. ๋‚˜์˜ ํ’€์ด์™€ ๋‹ฌ๋ฆฌ k๊ฐ’๋ณด๋‹ค ํฐ ์ˆ˜ ์ธ๊ฒƒ์„ ๋”ฐ๋กœ ์—†์• ์ง€ ์•Š๊ณ , ๊ฐ’์„ ๋”ํ•˜๋ฉด์„œ ๋ฐ”๋กœ ๋น„๊ต๋ฅผ ํ•˜์˜€๋‹ค. ์ด ๋•Œ ์‚ผํ•ญ์—ฐ์‚ฐ์ž์™€ reduce๋ฅผ ์‚ฌ์šฉํ•œ ์•„์ฃผ ์‹ ๋ฐ•ํ•œ ํ’€์ด ๋ฐฉ๋ฒ•์ด๋‹ค.. ๋ณธ๋ฐ›์•„์•ผ ๊ฒ ๋‹ค.

 

๊ทผ๋ฐ.. ๋‚ด ์ฝ”๋“œ๊ฐ€ ๋” ๋น ๋ฅด๋‹ค..? ์œ™? filter๋ณด๋‹ค reduce ์‹œ๊ฐ„์ด ๋” ๋А๋ ค์„œ ๊ทธ๋Ÿฐ๊ฒƒ ๊ฐ™๊ธฐ๋‘..!

๋”๋ณด๊ธฐ
ํ…Œ์ŠคํŠธ 1 ใ€‰	ํ†ต๊ณผ (0.18ms, 16.4MB)
ํ…Œ์ŠคํŠธ 2 ใ€‰	ํ†ต๊ณผ (0.20ms, 16.2MB)
ํ…Œ์ŠคํŠธ 3 ใ€‰	ํ†ต๊ณผ (1111.91ms, 39.4MB)
ํ…Œ์ŠคํŠธ 4 ใ€‰	ํ†ต๊ณผ (0.25ms, 16.5MB)
ํ…Œ์ŠคํŠธ 5 ใ€‰	ํ†ต๊ณผ (0.30ms, 16.6MB)
ํ…Œ์ŠคํŠธ 6 ใ€‰	ํ†ต๊ณผ (6.56ms, 16.7MB)
ํ…Œ์ŠคํŠธ 7 ใ€‰	ํ†ต๊ณผ (10.03ms, 17MB)
ํ…Œ์ŠคํŠธ 8 ใ€‰	ํ†ต๊ณผ (12.03ms, 17.2MB)
ํ…Œ์ŠคํŠธ 9 ใ€‰	ํ†ต๊ณผ (414.53ms, 27.1MB)
ํ…Œ์ŠคํŠธ 10 ใ€‰	ํ†ต๊ณผ (472.88ms, 27.1MB)
ํ…Œ์ŠคํŠธ 11 ใ€‰	ํ†ต๊ณผ (1271.84ms, 39.4MB)
ํ…Œ์ŠคํŠธ 12 ใ€‰	ํ†ต๊ณผ (2.10ms, 16.7MB)
ํ…Œ์ŠคํŠธ 13 ใ€‰	ํ†ต๊ณผ (1.30ms, 16.4MB)
ํ…Œ์ŠคํŠธ 14 ใ€‰	ํ†ต๊ณผ (295.75ms, 26.6MB)
ํ…Œ์ŠคํŠธ 15 ใ€‰	ํ†ต๊ณผ (625.43ms, 38MB)
ํ…Œ์ŠคํŠธ 16 ใ€‰	ํ†ต๊ณผ (0.93ms, 16.2MB)
ํ…Œ์ŠคํŠธ 17 ใ€‰	ํ†ต๊ณผ (2.48ms, 16.6MB)
ํ…Œ์ŠคํŠธ 18 ใ€‰	ํ†ต๊ณผ (2.22ms, 16.6MB)
ํ…Œ์ŠคํŠธ 19 ใ€‰	ํ†ต๊ณผ (6.10ms, 16.7MB)
ํ…Œ์ŠคํŠธ 20 ใ€‰	ํ†ต๊ณผ (492.23ms, 26.5MB)
ํ…Œ์ŠคํŠธ 21 ใ€‰	ํ†ต๊ณผ (549.28ms, 37.6MB)
ํ…Œ์ŠคํŠธ 22 ใ€‰	ํ†ต๊ณผ (0.09ms, 16.3MB)
ํ…Œ์ŠคํŠธ 23 ใ€‰	ํ†ต๊ณผ (0.09ms, 16.4MB)
ํ…Œ์ŠคํŠธ 24 ใ€‰	ํ†ต๊ณผ (0.14ms, 16.3MB)

 

์ค‘์š”ํ•œ ๊ฐœ๋…

  • ๋”•์…”๋„ˆ๋ฆฌ์—๋Š” ๋ฐฐ์—ด๋„ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Œ
  • ์„œ์น˜ ๋ฌธ์ œ์—์„œ๋Š” ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜์—ฌ ์‹œ๊ฐ„ ๋ณต์žก๋„ ์ค„์ด๊ธฐ
  • ๋”•์…”๋„ˆ๋ฆฌ์˜ ์–ธ๋ž˜ํ•‘ ๊ณผ์ •์—์„œ ?? ์–ธ๋ž˜ํ•‘์„ ํ•˜๋ฉด ์ข€ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ
  • reduce ์™€ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž ์กฐํ•ฉํ•ด์„œ ๋”•์…”๋„ˆ๋ฆฌ ํ•„ํ„ฐ๋ง ํ•˜๋Š” ์—ฐ์Šตํ•˜๊ธฐ

 

 

 

์•„๋‹ˆ ์ด๊ฒŒ ๋ฌด์Šจ Lv.1 ์งœ๋ฆฌ์•ผ.. ๋‚˜ ์šธ์–ด..ใ… ใ… ใ…  ๊ด‘๊ด‘

์‹ค์ œ๋กœ๋Š” 2022๋…„ ์นด์นด์˜ค ์ฝ”ํ…Œ ์‹œํ—˜์—์„œ 1๋ฒˆ์œผ๋กœ ์ถœ์ œ๋œ ๋ฌธ์ œ๋ผ๊ณ  ํ•œ๋‹ค. ๊ทธ ์ž๋ฆฌ์— ์žˆ์—ˆ์œผ๋ฉด ๊ทธ๋ƒฅ ๋ฉ˜ํƒˆ ํ„ฐ์กŒ์„ ๋“ฏ..

๊ทธ๋ž˜๋„ ์˜ค๋Š˜๋„ ์„ฑ์žฅํ•œ ๋‚˜ ๋ฟŒ๋“ฏ^__^ ์ด์ œ ๋”•์…”๋„ˆ๋ฆฌ ๋ฌธ์ œ ๋‹ค ๋ฟŒ์‹ค ์ˆ˜ ์ž‡์„ ๋“ฏ.. ๋“œ๋ฃจ์™€!!!!