나의 기록, 현진록

[Swift] 백준골드4) 키 순서 본문

Programming/Algorithm & Data Structure

[Swift] 백준골드4) 키 순서

guswlsdk 2024. 12. 31. 20:31
반응형

https://www.acmicpc.net/problem/2458

1. 문제이해

  • 키가 모두 다른 N명의 학생 중 자신의 키가 몇 번째인지 알 수 있는 학생의 수 구하기

2. 접근방법

X 노드에서 출발하거나, 다른 노드에서 X 노드에 도착하는 것이 모든 노드에 대해 가능할 때 자신의 키가 몇 번째인지 알 수 있는 학생이다.

플로이드 워셜

  • 모든 지점에서 다른 모든 지점까지 최단 경로 구할 수 있음
  • 이 문제는 거리를 구하는 것이 아닌 도달이 가능한지만 구하면 됨

자신의 키가 몇 번째인지 알 수 있는 학생 == 모든 노드에 접근 가능한 노드

3. 코드

func solution(){
    var input = readLine()!.split(separator: " ").map{Int(String($0))!}
    let N = input[0]
    let M = input[1]
    var map = Array(repeating: Array(repeating: false, count: N), count: N)
    for _ in 0..<M{
        input = readLine()!.split(separator: " ").map{Int(String($0))!}
        map[input[0]-1][input[1]-1] = true
    }
    var result = N
    // 플로이드 워셜
    for z in 0..<N{
        for x in 0..<N{
            for y in 0..<N{
                if map[x][z] != false, map[z][y] != false{
                    map[x][y] = true
                }
            }
        }
    }

    // 자신의 키가 몇 번째인지 알 수 있는 학생
    func isComparable(cur: Int) -> Bool{
        var inputIndex = [Int]()
        for i in 0..<N{
            if cur != i, map[cur][i] == false{
                inputIndex.append(i)
            }
        }
        for i in inputIndex{
            if cur != i, map[i][cur] == false{
                return false
            }
        }
        return true
    }
    
    for i in 0..<N{
        if !isComparable(cur: i){
            result -= 1
        }
    }
    print(result)
}
solution()

 

반응형