알고리즘/백준

[백준/Swift] 15970번: 화살표 그리기

녕이 2023. 1. 31. 14:55
728x90

 

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

 

15970번: 화살표 그리기

직선 위에 위치를 나타내는 0, 1, 2, ...와 같은 음수가 아닌 정수들이 일정한 간격으로 오른쪽 방향으로 놓여 있다. 이러한 위치들 중 N개의 위치에 하나씩 점들이 주어진다(<그림 1>). 주어진 점들

www.acmicpc.net

 

 

정렬하고, 완전탐색으로 각 점들을 순회했다.

양쪽으로 화살표를 가리키게 할 수 있는데,

방향에 따라 범위를 넘어선 경우(-1, n)와 색상이 다른 경우를 제외하고 left와 right 화살표 길이를 구할 수 있다.

 

 

import Foundation

/*
 각 점은 N개의 색깔 중 하나를 갖는다
 각 점 p에 대해서, p에서 시작하는 직선 화살표를 이용해 다른 점 q를 연결하려고 한다.
 여기서 점 q는 p와 같은 색깔의 점 중 p와 거리가 가장 가까운 점 (가까운 점이 두 개이상이면 아무거나 선택)
 모든 점에서 시작하는 화살표들의 길이 합을 출력
 point = (index, color)
 */

//input
let n = Int(readLine()!)!
var answer = 0
var points = [(Int, Int)]()
for _ in 0..<n {
    let input = readLine()!.split(separator: " ").map{ Int(String($0))! }
    points.append((input[0], input[1]))
}
points = points.sorted { $0.1 == $1.1 ? $0.0 < $1.0 : $0.1 < $1.1 } //색상기준, 인덱스 오름차순으로 정렬

//각 점을 순회하면서 왼쪽, 오른쪽 방향으로 최소 화살표 길이 구하기
for i in 0..<n {
    var left = 0
    var right = 0
    if i - 1 >= 0 {
        if points[i].1 == points[i-1].1 {
            left = points[i].0 - points[i-1].0
        }
    }
    if i + 1 < n {
        if points[i].1 == points[i+1].1 { //같은 색이라면
            right = points[i+1].0 - points[i].0
        }
    }
    if left == 0 { answer += right }
    else if right == 0 { answer += left }
    else { answer += min(left, right) }
}
print(answer)

 

 

728x90