티스토리 뷰

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
    -> 조건문을 통해 해결해야한다.


 

'Algorithm > Baekjoon' 카테고리의 다른 글

[Swift] 2852 NBA 농구  (1) 2023.02.01
[Swift] 백준 1181: 단어 정렬  (0) 2022.05.15
[Swift] 백준 20291: 파일정리  (0) 2022.05.15
[Swift] 백준 10825: 국영수  (0) 2022.05.12
[Swift] 백준 15649: N과 M(1)  (0) 2022.05.08
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함