TIL/알고리즘 공부
프로그래머스 Lv. 1 Swift 알고리즘 - 가장 가까운 같은 글자
여의도사노비
2022. 12. 26. 23:38
728x90
한 문제를 풀고 다음으로 푼 문제라 그런지 감각이 쪼끔은 돌아온거 같다.
그래서 그 전 문제보단 금방 풀었다.
항상 index 관련 문제가 나오면 머리가 아프다. 특정 문자가 어떤 위치에 있는지를 어떻게 찾을지에 대해서 고민이 많았다.
이 문제를 풀면서 생각한 논리적 흐름
- 입력받은 s 문자열을 char로 변환하여 각 원소를 배열에 저장한다.
- for 문을 활용하여 원소 하나하나 살펴본다.
- for문이 돌아갈때마다 char1에 원소를 추가하고, 만약 해당 원소가 char2라는 배열에 없다면 char2에도 추가해준다.
- char1Array에 i 값이 추가되기 전에, i 값과 같은 원소 중 가장 뒤에 위치한 원소의 인덱스를 저장한다.
- i 값이 char2에 있다면 처음 나온 값이 아니기에 i의 위치와 (4)에서 진행했던 i와 같은 값중 가장 뒤에 위치한 원소의 위치를 비교하여 값으로 저장해준다.
- 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)
- 인덱스를 쓰는 것은 항상 어렵다. 특히 start, last등의 특정 위치를 지정하기 어려운 메소드들이 많아서 두번 세번 중첩하여 사용해서 답을 찾아내야한다.