Algorithm/Baekjoon
[Swift] 15970: 화살표 그리기
내일은개발천재🎵
2022. 5. 15. 20:10
문제
https://www.acmicpc.net/problem/15970
15970번: 화살표 그리기
직선 위에 위치를 나타내는 0, 1, 2, ...와 같은 음수가 아닌 정수들이 일정한 간격으로 오른쪽 방향으로 놓여 있다. 이러한 위치들 중 N개의 위치에 하나씩 점들이 주어진다(<그림 1>). 주어진 점들
www.acmicpc.net
알고리즘
정렬
1. n을 입력받는다.
2. 반복문을 n번 반복한다.
a. 입력을 받아서 점의 위치와 색을 입력받는다.
b. 색은 key, 점의 위치를 value에 저장한다. (Int 배열 -> append)
3. dictionary의 value들을 정렬하여 sumOfArrow라는 함수를 호출한다.
<sumOfArrow>
1. 입력받은 배열의 길이가 1 이하라면 0을 return 한다.
-> (런타임에러 예외처리) for문 조건에 1 ..< len -1의 조건에서 벗어남을 방지하기 위해서이다.
2. 배열의 길이가 1보다 클 때에만 다음으로 넘어간다.
3. 현재 노드를 기준으로 [ 이전노드 - 현재노드 - 다음노드] 에서 가장 짧은 길이를 선택하여 result에 더한다.
4. 여기서 맨 처음 노드는 이전 노드가 없고, 마지막 노드는 다음 노드가 없기 때문에 다음과 같은 로직을 수행한다.
a. 첫번째 노드와 두번째 노드의 길이를 result에 더한다.
b. n번째 노드와 n-1번째 노드의 길이를 result에 더한다.
나의 코드
let n = Int(readLine()!)!
var arrows = [Int: [Int]]()
var result = 0
for _ in 0 ..< n {
let input = readLine()!.split(separator: " ").map{ Int($0)! }
let(node, color) = (input[0], input[1])
if arrows.keys.contains(color) {
arrows[color]!.append(node)
} else { arrows[color] = [node] }
}
for arrow in arrows.values {
result += sumOfArrow(arrow.sorted())
}
print(result)
func sumOfArrow(_ arrow: [Int]) -> Int {
var result = 0
let len = arrow.count
if len > 1 {
for i in 1 ..< len - 1 {
result += min( (arrow[i] - arrow[i-1]), (arrow[i+1] - arrow[i]) )
}
result += arrow[1] - arrow[0]
result += arrow[len - 1] - arrow[len - 2]
}
return result
}
나의 코드(주석)
let n = Int(readLine()!)!
var arrows = [Int: [Int]]()
var result = 0
for _ in 0 ..< n {
// 화살표 정보 (노드 위치, 색) 입력받기
let input = readLine()!.split(separator: " ").map{ Int($0)! }
let(node, color) = (input[0], input[1])
if arrows.keys.contains(color) { // 이미 존재하는 색이라면
arrows[color]!.append(node) // append
} else { // 처음 등장한 색이라면
arrows[color] = [node] // 등록
}
}
for arrow in arrows.values {
result += sumOfArrow(arrow.sorted()) //value를 정렬하여 호출
}
print(result)
func sumOfArrow(_ arrow: [Int]) -> Int {
var result = 0
let len = arrow.count
if len > 1 { // 예외처리 (없으면 런타임에러)
for i in 1 ..< len - 1 {
result += min( (arrow[i] - arrow[i-1]), (arrow[i+1] - arrow[i]) ) // 최단거리
}
result += arrow[1] - arrow[0] // 첫번째 화살표
result += arrow[len - 1] - arrow[len - 2] // 마지막 화살표
}
return result
}
Key point!
📍색이 항상 1과 2로 나타나는 것이 아니다! (문제를 잘 읽자.)
📍dictionary의 value가 배열이다.
-> Key가 존재하지 않을 때 value는 nil이다. nil에 append를 할 수 없다. -> error
-> 조건문을 통해 해결해야한다.