Algorithm
[Swift 백준] 15922 아우으 우아으이야!!
Kim Roks
2025. 1. 8. 19:25

유쾌한 제목의 골드 문제입니다.
저는 이 문제를 보고 일반적인 구현 문제 생각했습니다.
매 조건에 따라 선을 만들어주면 되겠구나 했거든요
그런데 '스위핑'이라는 알고리즘을 사용한다고 합니다.
풀고 보니 이런 걸 스위핑이라고 하는구나 한 문제였습니다.
문제를 푼 후 스위핑이 뭔지 찾아봤는데 아래 블로그에서 그림과 함께 아주 친절하게 설명해 주시더라고요 참고하시면 좋을 것 같습니다.
https://byeo.tistory.com/entry/%EC%8A%A4%EC%9C%84%ED%95%91-Sweeping
스위핑 (Sweeping)
목차 개요 설명 일반화 코드 개요 스위핑 (Sweeping)은 "쓸다" 를 의미합니다. 스위핑 알고리즘 이란 말 그대로 한 쪽 방향부터 시작해서 다른 방향으로 스캔해가면서 쓸어가는 것이라고 보시면 됩
byeo.tistory.com
아이디어부터 설명하겠습니다.
총 세 가지 경우를 대비해야 한다고 생각했습니다.
case 1. 선이 연장되는 경우
case 2. 새로운 선이 생기는 경우
case 3. 새로운 선이 의미가 없는 경우
풀이 코드와 함께 자세한 설명은 주석으로 달아놓겠습니다.
풀이
let n = Int(readLine()!)!
var xy = [[Int]]()
for _ in 0..<n {
let input = readLine()!.split(separator: " ").map{Int($0)!}
xy.append(input)
}
var line = [[Int]]()
// 가장 첫 라인은 무조건 쓰게 되어있습니다. 첫번째 인덱스에 위치시켜줍니다.
line.append([xy[0][0], xy[0][1]])
// 현재 제가 비교하고싶은 라인의 위치를 위해 선언한 count 변수입니다.
var count = 0
// 1번부터 시작합니다.
for i in 1..<n{
//배열에 계속 [0][1] 이렇게 접근하면 햇갈려서 지정해줬습니다.
// 비교를 원하는 X와 Y가 current 입니다. 위에서 line.count가 아닌 0으로 지정한 이유입니다.
let currentX = line[count][0]
let currentY = line[count][1]
// 새로 들어올 xy입니다
let nextX = xy[i][0]
let nextY = xy[i][1]
//case 1 선이 연장되는 경우입니다.
if currentY <= nextY && currentY >= nextX{
let newLine = [currentX,nextY]
// 기존의 선을 바꿔치기합니다.
line[count] = newLine
// case 2 새로운 선이 생기는 경우입니다.
} else if currentX < nextX && currentY < nextY {
let newLine = [nextX,nextY]
line.append(newLine)
count += 1
// case 3 선이 의미가 없는 경우입니다.
} else {
continue
}
}
// 결과를 위한 변수를 준비합니다.
var result = 0
for item in line {
result += item[1] - item[0]
}
print(result)