본문 바로가기

 𝗔𝗣𝗣𝗟𝗘/ALGORITHM

[내일배움캠프] 데일리 루틴(iOS_3회차) - 가장 가까운 같은 글자

 

 

 

이미지를 클릭하면 코딩테스트 페이지로 이동합니다

 

내 풀이

import Foundation

func solution(_ s:String) -> [Int] {
    var answer: [Int] = []
    
    let elements = s.map { 
        String($0) 
    }
    
    for i in 0..<elements.count {        
        var index = i 
        var isArray = false 
        
        while (index > 0) {
            index -= 1
            
            if elements[index] == elements[i] {
                answer.append(i - index) 
                isArray = true
                break
            }
        }
        
        if isArray == false {
            answer.append(-1)
        }
    }
    
    return answer
}

 

- 문자열 s를 배열 elements로 변환

   → elements 배열에 각 문자가 요소로 저장 됨

- for 루프를 사용하여 각 문자의 인덱스 순회

- 현재 문자와 그 전 문자들을 비교하기 위해 while 루프 사용

   → 이전 문자들을 순회하기 위한 인덱스 변수 index 활용

- 현재 문자와 이전 문자가 같은 경우 : 두 문자의 거리를 계산하여 answer 배열에 추가

  → 거리는 현재 인덱스에서 이전 인덱스를 뺀 값으로 계산

- 이전 문자들을 모두 확인했음에도 같은 글자가 없는 경우에는 -1을 answer 배열에 추가

 

 

 

또 다른 풀이

와 이렇게 풀 수도 있구나...

func solution(_ s: String) -> [Int] {
    return s.enumerated().map { (i, c) in i - (Array(s)[0..<i].lastIndex(of: c) ?? i + 1) }
}

 

 

- s.enumerated(): 문자열을 순회하면서 각 문자의 인덱스와 문자를 가져옴

- map 함수 : 순회한 각 요소에 대해 클로저 적용

   클로저 : 문자열의 인덱스 i와 해당 문자 c를 받음

- 클로저 내부에서는 현재 문자의 인덱스와 이전에 등장한 같은 문자의 인덱스 계산

- 이전에 확인된 같은 문자의 인덱스를 찾기 위해 Array(s)[0..<i]를 사용하여 현재 문자 이전의 문자열 슬라이스를 만듬

- 슬라이스에 lastIndex(of: c)를 사용하여 현재 문자 c의 마지막 인덱스 찾기

   만약 존재하지 않으면 nil을 반환하고,
     이 경우를 대비해 ?? i + 1을 사용하여 기본값으로 현재 인덱스보다 한 칸 뒤의 인덱스 사용

- 현재 인덱스와 이전에 등장한 같은 문자의 인덱스의 차이를 계산하여 반환

 

 

 

 

 

Recent Posts
Visits
Today
Yesterday
Archives
Calendar
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31