백준 11650번 Swift 알고리즘 연습 - 좌표 정렬하기_정렬
11650번과 1181번은 사실 오래전에 푼 문제들이다.
난이도가 낮기도 했고 당시에 뭣도 모르고 그냥 수학 문제 풀듯이 알고리즘 하나씩 풀어볼까? 싶어서 풀었었다.
https://whowantstoquit.tistory.com/74
백준 1181번 Swift 알고리즘 연습
N개의 문자열을 입력받고 각 문자열의 길이, 알파벳 우선순위에 따라 출력하는 문제이다. 중복을 피해야한다는 것도 신경써야한다! 이 문제를 풀면서 생각한 논리적 흐름은 N개의 string을 입력
whowantstoquit.tistory.com
https://whowantstoquit.tistory.com/72
백준 11650번 Swift 알고리즘 연습
튜플을 사용하여 x좌표 먼저 값을 비교, y좌표 값을 다음으로 비교하여 정렬하는 문제이다. 이 문제를 풀면서 생각한 논리적 흐름은 입력 받은 값을 공백을 기준으로 튜플 형태로 배열에 저장한
whowantstoquit.tistory.com
그런데 위의 두 문제들을 다시 풀다보니 확실히 다른점이 느껴졌다. 아무것도 모르고 수학 문제 풀어보듯이 알고리즘을 풀던 당시의 난 클로저를 어떻게 활용하는지 아예 몰랐다. 그냥 기준을 써넣으면 알아서 해결되는구나 정도... 함수인데 좀 편하게 쓰는구나... 싶은 정도였다. 그런데 확실히 문법 공부, 개념 공부를 진행한 뒤에 다시 1181과 11650 같은 문제를 풀어보니 클로저를 이렇게 쓰는구나... 원소에 대한 접근을 0과 1 그리고 .(마침표)를 이용해서 다음 배열의 원소까지 접근해 주는 거였구나 등... 이런 깨달음을 얻었다..! 지금보면 별거 아니지만 옛날엔 공식처럼 풀이를 외워볼까 했다면, 이젠 좀 이해하면서 알고리즘도 풀어낼 수 있다는 것이 감회가 새롭다.
이 문제를 풀면서 생각한 논리적 흐름은
- 값이 같은 경우만 잘 생각해주면 된다.
- 값이 같은 경우 두 번째 원소 기준으로 오름차순 정렬을 해주면 되고
- 그게 아니라면 그냥 오름차순 기준으로 정렬을 적용해주면 된다.
* 11650번
let n = Int(readLine()!)!
var arr: [(Int, Int)] = []
for _ in 0..<n {
let input = readLine()!.split(separator: " ").map{ Int($0)! }
let x = input[0]
let y = input[1]
arr.append((x, y))
}
let sortedArr = arr.sorted { $0.0 == $1.0 ? $0.1 < $1.1 : $0.0 < $1.0 }
for i in sortedArr {
print("\(i.0) \(i.1)")
}
정리(Today I Learned)
- 이미 똑같은 문제를 한 번 풀었어서 1181과 11650은 블로그에 안올리려다가... 11650만 나의 감회를 기억하기 위해 올렸다.
앞으로도 꾸준히 발전해 나가야겠다.