TIL/알고리즘 공부

프로그래머스 Lv. 1 Swift 알고리즘 - 가장 가까운 같은 글자

여의도사노비 2022. 12. 26. 23:38
728x90

한 문제를 풀고 다음으로 푼 문제라 그런지 감각이 쪼끔은 돌아온거 같다.

그래서 그 전 문제보단 금방 풀었다.

 

항상 index 관련 문제가 나오면 머리가 아프다. 특정 문자가 어떤 위치에 있는지를 어떻게 찾을지에 대해서 고민이 많았다.

 

 

 

이 문제를 풀면서 생각한 논리적 흐름

 
  1. 입력받은 s 문자열을 char로 변환하여 각 원소를 배열에 저장한다.
  2. for 문을 활용하여 원소 하나하나 살펴본다.
  3. for문이 돌아갈때마다 char1에 원소를 추가하고, 만약 해당 원소가 char2라는 배열에 없다면 char2에도 추가해준다.
  4. char1Array에 i 값이 추가되기 전에, i 값과 같은 원소 중 가장 뒤에 위치한 원소의 인덱스를 저장한다.
  5. i 값이 char2에 있다면 처음 나온 값이 아니기에 i의 위치와 (4)에서 진행했던 i와 같은 값중 가장 뒤에 위치한 원소의 위치를 비교하여 값으로 저장해준다.
  6. i 값이 char2에 없다면 처음 나온 값이기 때문에 -1을 대입해준다.

 

 

* 코드

import Foundation

func solution(_ s:String) -> [Int] {
    var char1Array: [Character] = []
    var char2Array: [Character] = []
    var answerArray: [Int] = []
    var previousIndex = 0
    
    //MARK: 처음 나온 값과 처음이 아닌 값 구분
    for i in s {
        if char1Array.lastIndex(of: i) != nil {
            previousIndex = char1Array.lastIndex(of: i)!
        }
        
        char1Array.append(i)
        
        if char2Array.contains(i) {
            //MARK: 처음이 아닌 값. char 위치 확인. 위치 값이 작은 값 반영
            answerArray.append(char1Array.lastIndex(of: i)! - previousIndex)
        } else {
            //MARK: 처음인 값. 바로 -1 대입.
            answerArray.append(-1)
            char2Array.append(i)
        }
    }
    
    return answerArray
}

 

 

정리(Today I Learned)

  1. 인덱스를 쓰는 것은 항상 어렵다. 특히 start, last등의 특정 위치를 지정하기 어려운 메소드들이 많아서 두번 세번 중첩하여 사용해서 답을 찾아내야한다.