swift 코딩테스트

kmjmarine·2023년 4월 17일

코딩테스트 풀이에 유용하게 쓰일 코드들 모음

구구단

  • swift도 다른 언어처럼 tuple을 지원함.
    tuple, 이중 for문으로 구구단을 구현해 봄
    (O(N^2) 시간 복잡도지만 제한된 범위)
let numbers = (x: 1...9, y: 1...9) //tuple

for i in numbers.x {
    for j in numbers.y {
        print("\(i) x \(j) = \(i * j)")
    }
}

//1 x 1 = 1
//1 x 2 = 2
//1 x 3 = 3
//1 x 4 = 4
.
.
.

입력받은 n 숫자열을 모두 더한 값 출력

  • 입력받은 n 값을 String형으로 변환, 고차함수 map으로 String형 요소들을 모두 Int형으로 변환
  • 만약 n값이 String 형에 문자가 섞여있다면 compactMap으로 nil로 변환되어 제거할 수 있음
func solution(_ n:Int) -> Int
{
    var answer:Int = 0
    let nArray = String(n).map { Int(String($0))! }

    answer = nArray.reduce(0, +)
    
    return answer
}


solution(12345) //15

두개의 문자열 배열 요소 중 같은 수 출력

func solution(_ s1:[String], _ s2:[String]) -> Int {
    return s1.filter{s2.contains($0)}.count
}

solution(["a", "b", "c"], ["com", "b", "d", "p", "c"]) //2
solution(["n", "omg"], ["m", "dot"]) //0

제곱

func solution (num: Double, power: Double) -> Double {  
    return pow(num, power)  
}

solution(num: 2, power: 4) //16.0

func solution(_ n:Int, _ t:Int) -> Int { //a << n의 값은 a * 2^n^의 값과 같다.
    return n << t 
}

solution(2, 4) // 32

사항식

func solution(_ rsp: String) -> String { 
    return rsp.map{$0 == "0" ? "5" : $0 == "2" ? "0" : "2"}.joined() 
}

solution("0") //5

최댓값 (숫자 2개의 곱 중 가장 큰 값)

func solution(_ numbers: [Int]) -> Int {
    let numbers = numbers.sorted() //[-5, -3, 1, 2, 4]
    
    return max(numbers[0] * numbers[1], numbers[numbers.count-1] * numbers[numbers.count-2])
}

solution([1,2,-3,4,-5]) //15

Factorial

func solution(_ n:Int) -> Int { 
    return (1...n).reduce(1) { $0 * $1 } //5! 5*4*3*2*1
}

solution(5) //120

가장 가까운수 (같으면 낮은 수)

func solution(_ array: [Int], _ n: Int) -> Int {
    return array.min(by: { (abs($0 - n), $0) < (abs($1 - n), $1) })!
}

solution([1,4,2], 3) //2

한번만 나오는 문자

func solution(_ s:String) -> String {
	return String(Dictionary(grouping: s) { $0 }.values.filter { $0.count == 1 }.joined().sorted()) 
}

solution("abcddeb") //ace

최빈수 (가장 자주 등장하는 숫자)

func solution(_ array: [Int]) -> Int {
    let sorted = Dictionary(grouping: array) { $0 }.sorted { $0.value.count > $1.value.count }

    return sorted.count > 1 && sorted[0].value.count == sorted[1].value.count ? -1 : sorted[0].key
}

solution([1,2,3,4,5,1]) //1

문자열 배열에서 숫자로만 된 문자열의 수

let newBabling: [String] = ["11", "uuu1", "1", "111", "1a"]
print(newBabling.compactMap { str in Int(str) }.count) //3 (compactMap으로 nil이 제거됨)

최대공약수 구하기

func gcd(_ a: Int, _ b: Int) -> Int {
    if a % b == 0 {
        return b
    } else {
        return gcd(b, a % b)
    }
}

print(gcd(192, 162)) //6

profile
shared knowledge is long, life is short

0개의 댓글