๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“– Problem Solution/Programmers

[Swift] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ˆœ์œ„

by Fomagran ๐Ÿ’ป 2021. 5. 15.
728x90
๋ฐ˜์‘ํ˜•

 

Problem

 

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ์ˆœ์œ„

5 [[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]] 2

programmers.co.kr


Solution

 

์ด๋ฒˆ ๋ฌธ์ œ๋Š” ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ ์œผ๋กœ ํ’€์–ด์•ผ ํ•˜๋Š” ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 

1. ๋ชจ๋“  ์Šน๋ถ€๋ฅผ ์ €์žฅํ•  ์ด์ค‘ ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค.

 

1๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ์„ ์ˆ˜๋“ค์˜ ์Šน๋ถ€๋ฅผ ๋‹ด์„ ์ด์ค‘ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ n+1 ํฌ๊ธฐ๋กœ ๊ฐ’์„ 0์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐฐ์—ด์„ n+1๊ฐœ๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

n+1๊ฐœ์”ฉ์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์ด์œ ๋Š” 0๋ฒˆ ์ธ๋ฑ์Šค๋ฅผ ๋ฌด์‹œํ•˜๊ธฐ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.

 

(win ๋ฐฐ์—ด์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”)

 

2. results๋ฅผ ์ˆœํšŒํ•˜์—ฌ ์Šน๋ถ€์— ๋Œ€ํ•œ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

 

results์•ˆ์— ์žˆ๋Š” ๊ฐ’ ์ค‘ 0๋ฒˆ์งธ๋Š” ์ด๊ธด ์‚ฌ๋žŒ 1๋ฒˆ์งธ๋Š” ์ง„ ์‚ฌ๋žŒ์ด๋ฏ€๋กœ 

 

์Šน๋ถ€๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด [result[0]][result[1]] ์˜ ๊ฐ’์„ 1๋กœ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.

 

0์€ ๋ชจ๋ฅด๋Š” ์ƒํƒœ 1์€ ์ด๊ธด ์ƒํƒœ๋กœ ์ €์žฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

(results.forEach๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”!)

 

3. ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ์œผ๋กœ ์ค‘๊ฐ„์— ์žˆ๋Š” ๊ฐ’์„ ์ฒดํฌํ•ด์ค€๋‹ค.

 

i,j,k 3์ค‘ for๋ฌธ์„ ๋งŒ๋“ค์–ด i์™€ k์˜ ์ค‘๊ฐ„์— ์žˆ๋Š” j๊ฐ€ kํ•œํ…Œ ์ง€๋Š”์ง€ ์ด๊ธฐ๋Š” ์ฒดํฌํ•ด์ค๋‹ˆ๋‹ค.

 

๋งŒ์•ฝ i๊ฐ€ j๋ฅผ ์ด๊ฒผ๊ณ  k๊ฐ€ i๋ฅผ ์ด๊ฒผ๋‹ค๋ฉด k๋Š” j๋ฅผ ์ด๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ณ ๋กœ ์Šน๋ถ€๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด์˜ [k][j] ๋ฒˆ์งธ๋ฅผ 1๋กœ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.

 

( checkMiddleByFloyd ํ•จ์ˆ˜๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!)

 

4. ์ˆœ์œ„๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ์„ ์ˆ˜์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

1๋ถ€ํ„ฐ n๊นŒ์ง€ ์ˆœํšŒ๋ฅผ ํ•˜๋Š” ์ด์ค‘ for๋ฌธ์„ ๋งŒ๋“ค์–ด ๋ชจ๋“  ์„ ์ˆ˜์˜ ์Šน๋ถ€๋ฅผ ์ˆœํšŒํ•ฉ๋‹ˆ๋‹ค.

 

i ์„ ์ˆ˜์™€ j์„ ์ˆ˜์˜ ์Šน๋ถ€๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„  ์Šน๋ถ€๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด์—์„œ i๊ฐ€ j๋ฅผ ์ด๊ฒผ๊ฑฐ๋‚˜ j๊ฐ€ i๋ฅผ ์ด๊ฒผ๋‹ค๋ฉด ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ฆ‰ [i][j]๊ฐ€ 1์ด๊ฑฐ๋‚˜ [j][i]๊ฐ€ 1์ด๋ผ๋ฉด ์•Œ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๊ฐ€ n์—์„œ ์ž์‹ ์˜ ๋บ€ ๊ฐ’ ์ฆ‰, n-1์ด๋ผ๋ฉด ๋ชจ๋“  ์„ ์ˆ˜์™€์˜ ์Šน๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ˆœ์œ„๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ชจ๋‘ ์ˆœํšŒ๋ฅผ ํ•˜๋ฉด์„œ ์ด๋ ‡๊ฒŒ ๋ชจ๋“  ์„ ์ˆ˜์™€์˜ ์Šน๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ์„ ์ˆ˜์˜ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.

 

( canKnowRankCount ํ•จ์ˆ˜๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”! )


Source Code

 

import Foundation
func solution(_ n:Int, _ results:[[Int]]) -> Int {
//๋ˆ„๊ฐ€ ๋ˆ„๊ตด ์ด๊ฒผ๋Š”์ง€ ํ™•์ธํ•  ์ด์ค‘๋ฐฐ์—ด
var win:[[Int]] = Array(repeating: Array(repeating: 0, count: n+1), count: n+1)
//result์˜ 0๋ฒˆ์งธ๋Š” 1๋ฒˆ์จฐ๋ฅผ ์ด๊ธด ๊ฒƒ์ด๋ฏ€๋กœ 1์ด๋ผ๊ณ  ์ฒดํฌํ•ด์คŒ
results.forEach{ win[$0[0]][$0[1]] = 1 }
//์ค‘๊ฐ„์— ์žˆ๋Š” ๊ฐ’์„ ํ”Œ๋กœ์ด๋“œ๋กœ ์•Œ์•„๋‚ธ๋‹ค.
checkMiddleByFloyd(win: &win, n: n)
//์ˆœ์œ„๋ฅผ ์•Œ์ˆ˜์žˆ๋Š” ๊ฒƒ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.
return canKnowRankCount(results: results, win: win, n: n)
}
//i,j,k๋ฅผ ๋‘๊ณ  k๊ฐ€ j๋ฅผ ์ด๊ธธ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฒดํฌํ•ด์ค€๋‹ค.
func checkMiddleByFloyd(win:inout [[Int]],n:Int) {
for i in 1...n {
for j in 1...n {
for k in 1...n {
//๋งŒ์•ฝ i๊ฐ€ j๋ฅผ ์ด๊ฒผ๊ณ  k๊ฐ€ i๋ฅผ ์ด๊ฒผ๋‹ค๋ฉด
if win[i][j] == 1 && win[k][i] == 1 {
//k๋Š” j๋ฅผ ์ด๊ธธ ์ˆ˜ ์žˆ๋‹ค.
win[k][j] = 1
}
}
}
}
}
func canKnowRankCount(results:[[Int]],win:[[Int]],n:Int) -> Int {
//์ „์ฒด ๊ฐฏ์ˆ˜
var total:Int = 0
for i in 1...n {
//i์™€ j์˜ ์Šน๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฐฏ์ˆ˜
var count:Int = 0
for j in 1...n {
//๋งŒ์•ฝ i๊ฐ€ jํ•œํ…Œ ์กŒ๊ฑฐ๋‚˜ ์ด๊ฒผ๋‹ค๋ฉด
if win[i][j] == 1 || win[j][i] == 1 {
//์Šน๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ +1
count += 1
}
}
//count๊ฐ€ n-1์ด๋ผ๋ฉด ๋ชจ๋“  ์Šน๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ
if count == n-1 {
//ํ† ํƒˆ์„ +1
total += 1
}
}
//ํ† ํƒˆ์„ ๋ฐ˜ํ™˜
return total
}
view raw ์ˆœ์œ„.swift hosted with โค by GitHub


1์ฐจ ํ’€์ด

 

์ฒ˜์Œ์—” ๋ˆ„๊ฐ€ ๋ˆ„๊ตด ์ด๊ฒผ๊ณ  ์กŒ๋Š”์ง€๋งŒ ๋‹ด๊ณ  

 

์ด๊ธด ์‚ฌ๋žŒ๊ณผ ์ง„ ์‚ฌ๋žŒ์„ ํ•ฉ์ณ์„œ ์ž์‹ ์„ ๋บ€ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋‹ด๊ฒจ์žˆ๋‹ค๋ฉด ์ˆœ์œ„๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ฒ ์ง€๋ผ๊ณ  ์—„์ฒญ ์‰ฌ์šด ๋ฌธ์ œ๋„ค ํ•˜๊ณ  ํ’€์—ˆ๋Š”๋ฐ...

 

๋ˆ„๊ฐ€ ๋ˆ„๊ตด ์ด๊ธฐ๊ณ  ์งˆ๋•Œ๋งˆ๋‹ค ๊ฐ’์ด ๋ฐ”๋€Œ๋Š”๋ฐ ์ด๋Ÿฌ๋ฉด ๋ชจ๋“  ๊ฐ’์ด ๋ฐ”๋€Œ์–ด์•ผ ํ–ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ๊ฒฐ๊ตญ ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด์„œ ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ๋กœ ํ’€์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋จ...

import Foundation

func solution(_ n:Int, _ results:[[Int]]) -> Int {
    
    var win:[[Int]] = (0...n).map{[$0]}
    var lose:[[Int]] = (0...n).map{[$0]}
    var answer:Int = 0
    
    results.forEach{
        win[$0[0]].append($0[1])
        lose[$0[1]].append($0[0])
    }

    for i in 1..<win.count {
        let count = Set((win[i].map{win[$0]} + lose[i].map{lose[$0]}).flatMap{$0}).count
        if count == n {
           answer += 1
        }
    }
    
    return answer
}

Reference 

 

์ด ๋ถ„์˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 

[C++, Swift][ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์ˆœ์œ„

๋ฌธ์ œ์„ค๋ช…์€ ๋”๋ณด๊ธฐ๋ฅผ ๋ˆŒ๋Ÿฌ์ฃผ์„ธ์š” ๋”๋ณด๊ธฐ ๋ฌธ์ œ ๋งํฌ : programmers.co.kr/learn/courses/30/lessons/49191 ๋ฌธ์ œ ์„ค๋ช… n๋ช…์˜ ๊ถŒํˆฌ์„ ์ˆ˜๊ฐ€ ๊ถŒํˆฌ ๋Œ€ํšŒ์— ์ฐธ์—ฌํ–ˆ๊ณ  ๊ฐ๊ฐ 1๋ฒˆ๋ถ€ํ„ฐ n๋ฒˆ๊นŒ์ง€ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๊ถŒํˆฌ ๊ฒฝ

9967han.tistory.com

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€