1. 나머지 구하기
Q. 정수 num1, num2가 매개변수로 주어질 때, num1를 num2로 나눈 나머지를 return 하도록 solution 함수를 완성해주세요.
func solution(_ num1:Int, _ num2:Int) -> Int {
return num1 % num2
}
A. % 연산자를 통해 num1를 num2로 나눈 나머지를 구하여 해결했다.
2. 중앙값 구하기
Q. 중앙값은 어떤 주어진 값들을 크기의 순서대로 정렬했을 때 가장 중앙에 위치하는 값을 의미합니다. 예를 들어 1, 2, 7, 10, 11의 중앙값은 7입니다. 정수 배열 array가 매개변수로 주어질 때, 중앙값을 return 하도록 solution 함수를 완성해보세요. (array의 길이는 홀수입니다.)
func solution(_ array:[Int]) -> Int {
let result = array.sorted()
return result[result.count / 2]
}
A. 먼저, 입력 받은 배열을 sorted()를 통해 오름차순으로 정렬된 배열로 변환했다.
그리고 입력된 배열의 길이는 홀수라는 조건이 있기 때문에,
정렬된 배열의 길이에 2를 나눈 값으로 배열에 접근하여 중앙값을 구해 해결했다.
feat.
swift에는 정렬을 쉽게 할 수 있는 sort(), sorted() 라는 메서드들이 존재하는데,
두 메서드의 큰 차이점은 다음과 같다.
- sort() : 원본 배열을 변경
- sorted() : 원본 배열을 정렬한 새로운 배열을 반환
만약 위 문제에서 array.sorted() 대신 array.sort()를 사용하게 되면,
파라미터로 전달 받은 array는 상수 let이기 때문에 배열을 변경할 수 없어
cannot use mutating member on immutable value: 'array' is a 'let' constant 과 같은 에러가 발생한다!
3. 최빈값 구하기
Q. 최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
func solution(_ array:[Int]) -> Int {
var result: [Int: Int] = [0: 0]
var preValue = 0
array.sorted().forEach {
if $0 == preValue {
result[$0]! += 1
} else {
result[$0] = 1
preValue = $0
}
}
var max = 0
var mode = 0
var isMultiple = false
result.forEach {
if max < $0.value {
max = $0.value
mode = $0.key
isMultiple = false
} else if max == $0.value {
isMultiple = true
}
}
return isMultiple ? -1 : mode
}
A. 문제 해결을 위해 과정을 두 단계로 나누었다.
1. 전달 받은 array에서 각각의 값이 나온 횟수를 dictionary에 저장
2. 저장된 dictionary에서 가장 자주 나오는 값 즉, 최빈값을 구하고, 최빈값이 여러 개인지 확인
3. 2번에서 구한 값을 바탕으로 결과값 반환
먼저, sorted()를 통해 array를 정렬하였다.
왜냐하면 오름차순으로 정렬된 배열을 반복문으로 순회했을 때,
이전 값과 현재 값을 비교하여 각각의 값이 나온 횟수를 구할 수 있을 거라 생각했기 때문이다.
반복문 내에서, 이전 값과 현재 값이 같을 때는 현재 값이 한 번 더 나타난 것을 의미하기 때문에
dictionary에 저장된 key에 접근하여 value를 1 올려주었고
이전 값과 현재 값이 다를 때는 현재 값이 새로 나타난 값을 의미하기 때문에
dicionary에 현재 값을 key로 하여 추가하였다.
그리고 저장한 dictionary를 반복문으로 순회하면서
조건문을 통해 먼저 value의 값들을 max값과 비교하여 가장 자주 나오는 값인 최빈값을 구하였고
value와 max 값이 일치한다면 최빈 값이 여러 개라는 플래그를 지정했다.
마지막으로 구한 플래그 값과 최빈 값을 통해 삼항연산자 ?를 통해 문제에서 요구하는 값을 반환하여 해결했다.
feat.
해당 문제가 오늘 해결한 문제중 가장 생각을 많이한 문제였다.
지금까지 배열만 사용해서 문제를 해결해왔기에,
dictionary를 사용할 생각을 바로 하지 못해서 오래 걸렸던 것 같다!
- mode (최빈값)
4. 짝수는 싫어요
Q. 정수 n이 매개변수로 주어질 때, n 이하의 홀수가 오름차순으로 담긴 배열을 return하도록 solution 함수를 완성해주세요.
func solution(_ n:Int) -> [Int] {
var result: [Int] = []
for i in 1...n {
if i % 2 == 1 {
result.append(i)
}
}
return result
}
A. 입력값 n을 통해 1부터 n까지 반복하는 for문을 구성하고
반복문 안에서 % 연산자를 통해 나머지가 1이 나오면 홀수로 판별되기 때문에 이 때, result 배열에 추가한 후,
반복문이 끝나면 result 배열을 반환하여 문제를 해결했다.
feat.
func solution(_ n:Int) -> [Int] { (1...n).filter {$0 % 2 == 1} }
다른 사람들의 풀이를 살펴보았을 때,
위 코드와 같이 고차함수 filter를 사용하면
굳이 for문을 통해 코드를 길게 작성할 필요가 없다는 것을 느꼈다.
오늘은 주말이라 시간도 여유로워서
편하게 문제를 풀고 글을 작성한 것 같다.
내일부터는 다시 월요일인데 평일에도
놓치지 않고 꾸준히 글을 작성해보자고 다짐하며
내일도 화이팅!
'Develop > Coding Test' 카테고리의 다른 글
코딩 테스트 입문 (feat. Day 5 수학, 배열) (5) | 2024.11.12 |
---|---|
코딩 테스트 입문 (feat. Day 4 수학, 배열) (0) | 2024.11.11 |
코딩 테스트 입문 (feat. Day 2 사칙연산, 조건문, 배열) (2) | 2024.11.09 |
코딩 테스트 입문 (feat. Day 1 사칙연산) (2) | 2024.11.08 |
코딩테스트 입문 (with. 오블완 챌린지) (5) | 2024.11.07 |