✅ 1. 수열과 구간 쿼리 3
https://school.programmers.co.kr/learn/courses/30/lessons/181924
🎃 나의 풀이
func solution(_ arr:[Int], _ queries:[[Int]]) -> [Int] {
var result = arr
for i in 0..<queries.count{
result.swapAt(queries[i][0], queries[i][1])
}
return result
}
반복문과 swapAt을 사용하여 풀어내었다.
swapAt 함수는 Array함수로 배열에 인덱스로 접근하여 두 원소의 값을 바꿔주는 함수이다.
✅ 2. 수열과 구간 쿼리 2
https://school.programmers.co.kr/learn/courses/30/lessons/181923
🎃 나의 풀이
func solution(_ arr:[Int], _ queries:[[Int]]) -> [Int] {
//queries 는 순서대로 s, e , k 이다
// s ... e 인 원소중에 k 보다 큰수를 찾는다. 그 중 제일 작은 수를 찾는다.
var result : [Int] = []
for querie in queries{
var s = querie[0]
var e = querie[1]
var k = querie[2]
var arrayInRange : [Int] = []
for i in s...e{
if(arr[i] > k){
arrayInRange.append(arr[i])
}
}
result.append(arrayInRange.min() ?? -1)
}
return result
}
굉장히 어려운 문제였다.... i가 인덱스를 뜻하는지 모르고 한참 해매다 풀게 되었다 ㅜㅜ
풀고 보니 단순한 문제였네..
🏆 모범 풀이
func solution(_ arr:[Int], _ queries:[[Int]]) -> [Int] {
return queries.map {
let (s, e, k) = ($0[0], $0[1], $0[2])
return Array(arr[s...e]).filter { $0 > k }.min() ?? -1
}
}
모범 풀이에서는 map과 fillter를 사용하여 정말 간단하게 끝났다. 아직까지 고차함수가 손에 익지 않아서 나에게는 어렵다..
✅ 3. 수열과 구간 쿼리 4
https://school.programmers.co.kr/learn/courses/30/lessons/181922
🎃 나의 풀이
func solution(_ arr:[Int], _ queries:[[Int]]) -> [Int] {
var array = arr
for querie in queries{
var s = querie[0]
var e = querie[1]
var k = querie[2]
for i in s...e{
if(i % k == 0){
array[i] += 1
}
}
}
return array
}
이전 문제와 비슷한 방식으로 풀어냈다. 다만 주의할 부분은 0은 모든 정수의 배수라는 점이었다!
🏆 모범 풀이
func solution(_ arr:[Int], _ queries:[[Int]]) -> [Int] {
var arr = arr
queries.forEach {
let (s, e, k) = ($0[0], $0[1], $0[2])
(s...e).forEach { if $0 % k == 0 { arr[$0] += 1 } }
}
return arr
}
forEach를 사용하면 for문 보다 더 간결하게 요약이 가능한듯하니 다음에는 forEach문도 사용해 봐야겠다.
✅ 4. 배열 만들기 2
https://school.programmers.co.kr/learn/courses/30/lessons/181921
🎃 나의 풀이
func solution(_ l:Int, _ r:Int) -> [Int] {
let result = (l...r).filter{String($0).allSatisfy{$0 == "0" || $0 == "5"} }
return result.isEmpty ? [-1] : result
}
filter와 allSatisfy를 사용하여 비교적 간단하게 풀어냈다!
allSatisfy는 배열의 모든 원소 중 조건문을 만족하는 원소만 배열로 반환하는 함수이다.
이런 비슷한 함수가 너무 많아서 헷갈리기 시작한다...
✅ 5. 카운트 업
https://school.programmers.co.kr/learn/courses/30/lessons/181920
🎃 나의 풀이
func solution(_ start_num:Int, _ end_num:Int) -> [Int] {
var result : [Int] = []
(start_num...end_num) .forEach{ index in
result.append(index)
}
return result
}
쉬어가는 느낌의 문제여서 굉장히 쉽게 풀었지만 이것도 어렵게 푼 것이었다..
🏆 모범 풀이
func solution(_ start: Int, _ end: Int) -> [Int] {
[Int](start...end)
}
연산한 줄로 끝 ^^... 함수의 연산이 한 번만 들어간 경우 return을 생략할 수 있는 거 같다??
✅ 6. 콜라츠 수열 만들기
https://school.programmers.co.kr/learn/courses/30/lessons/181919
🎃 나의 풀이
func solution(_ n:Int) -> [Int] {
var result : [Int] = []
var value = n
result.append(value)
while(value != 1){
if(value % 2 == 0){
value /= 2
} else{
value = 3 * value + 1
}
result.append(value)
}
return result
}
while 반복문을 사용하여 정석적으로 풀어냈다.
🏆 모범 풀이
func solution(_ n: Int) -> [Int] {
return sequence(first: n) { i in i == 1 ? nil : i % 2 == 0 ? i / 2 : 3 * i + 1 }.map { $0 }
}
sequence를 사용하여 더욱 간단하게 표현이 가능한 모양이다.
sequence 함수는 시작값과 조건 클로저를 기반으로 반복적인 값을 생성하는 함수이다.
특이한 점은 nil을 반환하면 반복문이 종료된다.
✅ 7. 배열 만들기 4
https://school.programmers.co.kr/learn/courses/30/lessons/181918
🎃 나의 풀이
func solution(_ arr:[Int]) -> [Int] {
// stk가 빈 배열인 경우 : arr[i]를 stk에 추가, i + 1 하기
// stk가 빈 배열이 아니고, stk 마지막 원소가 arr[i]가 작으면 arr[i]를 뒤에. 추가하고 i + 1
// stk가 빈 배열이 아니고, stk 마지막 원소가 arr[i]보다 크거나 같으먼 stk의 마지막 원소 제거
var stk : [Int] = []
var i = 0
while(i < arr.count){
if(stk.isEmpty){
stk.append(arr[i])
i += 1
} else {
if(stk.last! < arr[i]){
stk.append(arr[i])
i += 1
} else if(stk.last! >= arr[i]){
stk.removeLast()
}
}
}
return stk
}
의식의 흐름대로 작성하여 중복 코드가 많아졌다. 깔끔한 모범 풀이를 보자
🏆 모범 풀이
func solution(_ arr: [Int]) -> [Int] {
var stack = [Int]()
var i = 0
while i < arr.count {
if stack.isEmpty || stack.last! < arr[i] {
stack.append(arr[i])
i += 1
} else if stack.last! >= arr[i] {
stack.popLast()
}
}
return stack
}
두 개의 조건부로 깔끔하게 처리된 코드
✅ 8. 간단한 논리 연산
https://school.programmers.co.kr/learn/courses/30/lessons/181917
🎃 나의 풀이
func solution(_ x1:Bool, _ x2:Bool, _ x3:Bool, _ x4:Bool) -> Bool {
(x1 || x2) && (x3 || x4)
}
문제 자체를 이해하지 못했는데 찾아보니
∨(논리합)은 OR 연산자를, ∧(논리곱)은 AND 연산자를 나타내는 것이었다. 간단하게 해결~
✅ 9. 주사위 게임 3
https://school.programmers.co.kr/learn/courses/30/lessons/181916
🎃 나의 풀이
func solution(_ a:Int, _ b:Int, _ c:Int, _ d:Int) -> Int {
var result = 0
let arr = Array([a,b,c,d])
var noneDuplication = Array(Set(arr))
var (maxValue, maxTarget) = (0,0)
for target in noneDuplication{
let count = arr.filter{$0 == target}.count
if(maxValue < count){
maxTarget = target
maxValue = count
}
}
if(noneDuplication.count == 1){
return 1111 * a
}
else if(noneDuplication.count == 2){
if(maxValue == 3){
let value = (10 * noneDuplication.first(where: {$0 == maxTarget})! + noneDuplication.first(where: {$0 != maxTarget})!)
return value * value
}
else{
return (noneDuplication[0] + noneDuplication[1]) * abs(noneDuplication[0] - noneDuplication[1])
}
}
else if(noneDuplication.count == 3){
let index = noneDuplication.firstIndex(of: maxTarget)!
noneDuplication.remove(at: index)
return noneDuplication[0] * noneDuplication[1]
}
else{
return Array([a,b,c,d]).min()!
}
}
너무 어려워서 풀다 보니 하드코딩을 하게 되었다. 모범 풀이를 참고하자...
🏆 모범 풀이
func solution(_ a: Int, _ b: Int, _ c: Int, _ d: Int) -> Int {
let dice = [a, b, c, d]
let counts = Array(1...6).map { num in dice.filter { $0 == num }.count }
if let p = counts.firstIndex(of: 4) {
return 1111 * (p + 1)
} else if let p = counts.firstIndex(of: 3), let q = counts.firstIndex(where: { $0 == 1 }) {
return (10 * (p + 1) + (q + 1)) * (10 * (p + 1) + (q + 1))
} else if let p = counts.firstIndex(of: 2), let q = counts.lastIndex(of: 2), p != q {
return (p + q + 2) * abs(p - q)
} else if let p = counts.firstIndex(of: 2), let q = counts.firstIndex(where: { $0 == 1 }), let r = counts.lastIndex(where: { $0 == 1 }), q != r {
return (q + 1) * (r + 1)
} else {
return dice.min()!
}
}
✅ 10. 글자 이어 붙여 문자열 만들기
https://school.programmers.co.kr/learn/courses/30/lessons/181915
🎃 나의 풀이
func solution(_ my_string:String, _ index_list:[Int]) -> String {
var result = ""
index_list.forEach{ i in
let index = my_string.index(my_string.startIndex, offsetBy: i)
result += String(my_string[index])
}
return result
}
문자열에 인덱스로 접근하는 법을 아는지 묻는 문제 같았다.
index함수를 사용하여 String.Index값을 사용해서 접근해야 한다.
🏆 모범 풀이
func solution(_ my_string:String, _ index_list:[Int]) -> String {
let my_string = my_string.map { String($0) }
return index_list.reduce("") { $0 + my_string[$1] }
}
map을 사용하여 문자열 배열을 만든 모습이다. 훨씬 간결하게 해결이 가능하다.