문제를 읽어보면 뭔가 복잡한 과정에 대해 설명하고 있습니다. 하지만 부분부분 쪼개서 읽어보면 단지 주어진 입력을 주어진 문제 그대로 코드로 구현하면 되는 문제입니다. 복잡한 풀이 방법, 알고리즘에 대해 고민할 필요가 1도 없습니다. 딱 원하는대로만 구현하면 풀 수 잇는 문제입니다.
정렬의 조건이 복잡합니다. 이럴 때는 정렬 함수를 별도로 만들어서 푸는 것이 도움이 됩니다. 일단 정렬 부분에만 집중할 수 있기 때문인데요. Swift의 .sort 메소드 클로저를 전달할 수 있는데요. 문제에서 정렬에 필요한 건은 정렬의 대상이 되는 lhs, rhs 튜플 뿐만 아니라 col 값도 요구합니다. 해당 3가지를 인자로 받는 정렬함수를 별도로 구현합니다.
row_begin, row_end 값을 사용해서 이중 반복문을 돌리면 쉽게 해결 가능합니다.
배타적 논리합이라도 불리는 XOR 연산입니다. 이 문제에서는 정수 2개를 XOR 연산을 하는데요. 정수를 이진수로 표현하고 자릿수끼리 비교해서 같으면 0, 다르면 1을 리턴하면 됩니다. 예를 들면 3과 5의 연산의 경우 이진수로 변환하면 각각 011, 101입니다. 각각 자릿수를 비교해서 같으면 0, 다르면 1을 하게되면 110이 됩니다. 즉 6이 되는 것이죠.
다행히도 이 연산을 직접 구현할 필요는 없습니다. Swift에서는 “^”를 연산자로 사용하여 배타적 논리합을 구합니다.
또한 reduce를 활용해서 배열 안에 있는 모든 수를 XOR 연산을 하였는데요. reduce의 초기값은 0을 하면 됩니다. 모든 수 a에 대해서 a^0은 a이기 때문입니다.
// 정렬 함수
func sort(_ lhs: [Int], _ rhs: [Int], _ col: Int) -> Bool {
let index = col - 1 //👉 col을 index값으로
// col에 대해서는 오름 차순으로 정렬
if lhs[index] < rhs[index] {
return true
// 다만 col이 같을 때는 기본키에 대해 내림차순
} else if lhs[index] == rhs[index] {
return lhs[0] > rhs[0]
} else {
return false
}
}
func solution(_ data:[[Int]], _ col:Int, _ row_begin:Int, _ row_end:Int) -> Int {
// 원하는 바대로 정렬
let sorted = data.sorted { sort($0, $1, col) }
// S_i를 구하는 연산
var S_i = [Int]()
for i in row_begin...row_end {
let tuple = sorted[i - 1]
var result = 0
// 나눈 값을 result에 다 더하기
for j in tuple {
result += j % i
}
S_i.append(result)
}
// S_i의 모든 값을 XOR 연산해서 리턴
return S_i.reduce(0, ^)
}