새소식

코딩테스트/프로그래머스

[Swift] 가장 먼 노드

  • -

[문제]

코딩테스트 연습 - 가장 먼 노드 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

[문제 풀이]

bfs를 이용해서 쉽게 풀 수 있는 문제이다.

처음에 입력이 주어질때 edge 값을 graph[edge[i][0]] 에 edge[i][1] 들을 넣으면 graph[1] 안에 2와 3이란 값이 순서대로 들어가 있다.

이걸 양방향으로 처리해주고 반복문을 이용해서 1부터 순서대로 노드를 가까운 순서대로 방문하자.

그렇게 방문하다가 마지막 거리일때 answer를 반환해주면 된다.

[회고]

첨에는 단순히 graph[20002][20002]를 만들어서 풀었는데 해당 방식으로는 최악의 경우 20,000 * 20,000번을 방문해야 해서 시간초과가 났다.

그래서 이와 같이 graph[1] 안에 2, 3.... 식으로 넣는걸 생각할 수 있었다.

swift로 코테를 푸는게 오랜만이라 순간 안 익숙했는데 어느정도 감을 찾기까지 얼마 안 걸릴 것 같다.

일주일동안 swift로 코테를 풀면서 감을 되찾자!

[코드]

import Foundation

struct Queue<T> {
    private var queue = [T]()
    
    public mutating func push(_ element: T) {
        queue.append(element)
    }
    
    public mutating func pop() -> T? {
        return isEmpty ? nil : queue.removeFirst()
    }
    
    public func front() -> T? {
        return isEmpty ? nil : queue.first
    }
    
    public var size: Int {
        return queue.count
    }
    
    public var isEmpty: Bool {
        return queue.isEmpty
    }
}

var graph = Array(repeating: [Int](), count: 20002)
var visited = [Int](repeating: 0, count: 20001)

func bfs(_ n : Int) -> Int {
    var answer = 0
    var q = Queue<(Int,Int)>()
    q.push((1,0))
    visited[1] = 1
    var num: Int = 0
    
    while q.size > 0 {
        var cur: Int = q.front()?.0 ?? 0
        var cnt: Int = q.front()?.1 ?? 0
        q.pop();
        answer += 1
        if num != cnt {
            num = cnt
            answer = 1
        }
        for i in graph[cur] {
            if visited[i] == 1 {
                continue
            }
            visited[i] = 1
            q.push((i,cnt + 1))
        }
    }    
    return answer
}

func solution(_ n:Int, _ edge:[[Int]]) -> Int {
    var answer: Int = 0
    
    for i in edge {
        graph[i[0]].append(i[1])
        graph[i[1]].append(i[0])
    }
    
    answer = bfs(n)
    
    return answer
}

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

[C++] 피로도  (0) 2023.08.09
[C++] 가장 먼 노드  (0) 2023.08.09
[C++] 두 큐 합 같게 만들기  (0) 2023.08.08
[C++] 테이블 해시 함수  (0) 2023.07.14
[C++] 택배상자  (0) 2023.06.25
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.