카테고리 없음

백준 11650번 Swift 알고리즘 연습 - 좌표 정렬하기_정렬

여의도사노비 2023. 3. 6. 10:55
728x90

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 그리고 .(마침표)를 이용해서 다음 배열의 원소까지 접근해 주는 거였구나 등... 이런 깨달음을 얻었다..! 지금보면 별거 아니지만 옛날엔 공식처럼 풀이를 외워볼까 했다면, 이젠 좀 이해하면서 알고리즘도 풀어낼 수 있다는 것이 감회가 새롭다.

 

 

이 문제를 풀면서 생각한 논리적 흐름은

  1. 값이 같은 경우만 잘 생각해주면 된다.
  2. 값이 같은 경우 두 번째 원소 기준으로 오름차순 정렬을 해주면 되고
  3. 그게 아니라면 그냥 오름차순 기준으로 정렬을 적용해주면 된다.

 

 

* 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)

  1. 이미 똑같은 문제를 한 번 풀었어서 1181과 11650은 블로그에 안올리려다가... 11650만 나의 감회를 기억하기 위해 올렸다.
    앞으로도 꾸준히 발전해 나가야겠다.