스파르타 코딩 클럽 - iOS 스타터 6기/알고리즘 코드카타

15. 스파르타 코딩 클럽 - 3월 31일 코딩테스트 연습 (코드카타)

seongpil Heo 2025. 3. 31. 09:55

 ❓ 오늘의 문제

1. k의 개수

  • 1부터 13까지의 수에서, 1은 1, 10, 11, 12, 13 이렇게 총 6번 등장합니다. 정수 ijk가 매개변수로 주어질 때, i부터 j까지 k가 몇 번 등장하는지 return 하도록 solution 함수를 완성해 주세요.

k의 개수 contains

나의 정답 코드

import Foundation

func solution(_ i:Int, _ j:Int, _ k:Int) -> Int {
    var result: Int = 0
    for num in i...j {
        if String(num).contains(String(k)) {
            result += 1
        }
    }
    return result
}

 

k의 개수 filter

나의 정답 코드

import Foundation

func solution(_ i:Int, _ j:Int, _ k:Int) -> Int {
    var result: Int = 0
    for num in i...j {
        result += String(num).filter { String($0) == String(k) }.count
    }
    return result
}

 ✓ TIL

오늘은 k의 개수라는 문제를 풀어보았다.

매개변수 i, j , k가 주어지는데 i부터 j안에 k가 몇 번 들어있는지 찾는 문제이다.

 

처음 문제를 풀었을 때 contains 함수를 이용해서 문자열 num에서 주어진 k가 몇번 포함되는지 찾으려고 했다.

그러나 contains함수의 문제는 중복된 숫자에서 정확한 포함 숫자를 찾지 못한다.

 

예를 들어 1부터 13까지 1이 몇번 포함되는지 찾으면 1, 10, 11, 12, 13 총 6번이지만

contains함수는 11을 2번 카운트하지 않고 1번만 카운트한다.

 

contains 함수는 조건의 값이 포함되면 true를 리턴하기 때문에 11과 같은 값을 정확하게 처리하기 어렵다.

 

그래서 두 번째 방법으로 contains 함수 대신 filter를 이용하였다.

똑같이 i부터 j까지를 문자열 num으로 변경하고 filter를 사용하여 문자열의 각 문자를 검사하고 k와 같은 경우만 남긴 후

count를 사용하여 남은 문자의 개수를 카운트했다.

 

filter를 이용했을 때 contains 보다 정확한 등장 횟수를 셀 수 있었다.


 😼 GitHub