TIL/알고리즘 공부
프로그래머스 Lv. 2 Swift 알고리즘 - 짝지어 제거하기
여의도사노비
2023. 1. 1. 20:49
728x90
이제 본격적으로 Lv.2 문제들을 두드리고자하는데...
졸릴때 풀어서 그런지 시작부터 집중력이 극한으로 떨어졌었다... 그래서 진짜 오래 걸림 ㅠ-ㅠ
2개 연속 붙어있는 문자열을 찾아 삭제하고 그 공간을 붙인 뒤, 붙은 문자열끼리 다시 비교하여 2개 연속 붙어있는 문자열을 삭제하면 된다.
이 문제를 풀면서 생각한 논리적 흐름
- 이런 연속 문자열 문제를 마주칠때마다 중요하게 생각해야하는 것은, 원소들을 한 배열에 담고 기준에 맞는 값을 찾을 떄마다 해당 위치 값들을 제거해버리는 방식은 오류를 일으킬 확률이 높다는 것이다.
- 그래서 한번에 원소 하나하나 알고리즘을 적용시켜 오류 발생 확률을 줄이는 것이 더 효율적이다.
- 우선은 원소 하나하나 쉽게 비교할 수 있도록 arrS를 만들어준다.
- result 배열에 원소가 비어있지 않고 result 배열의 마지막이 arrS의 i번째 원소와 같으면 result 배열에 마지막 원소를 삭제한다. (이 경우 앞에 추가된 arrS[i-1]원소와 arrS[i]원소의 값이 같기 때문에 pop 시키는 것으로 볼 수 있다.)
- 위의 해당 사항이 없으면 그냥 result 배열에 값을 추가해준다.
- 이를 반복하면 문자열이 끝까지 지워지거나 지워지지 않거나 둘 중 하나의 결과를 도출할 수 있다.
* 코드
import Foundation
func solution(_ s:String) -> Int{
let arrS: [Character] = s.map{Character(extendedGraphemeClusterLiteral: $0)}
var result: [Character] = []
for i in 0..<arrS.count {
if !result.isEmpty && result.last == arrS[i] {
result.removeLast()
} else {
result.append(arrS[i])
}
}
return result.isEmpty ? 1 : 0
}
정리(Today I Learned)
- 배열 내의 원소를 String으로 하나하나 map 해줄땐 깔끔하게 나오는데... Character 매핑하려니 나오는 extended... 이 부분이 정확히 뭔지 모르겠다...(자동완성되어 넣어놨다 ㅠㅠ) ㅎㅎ 나중에 찾아봐야겠다.
- 간단한 문제임에도 불구하고 항상 헷갈리는건 배열의 구성에 변화가 생기는 문제이다. 이렇게 특정 값들이 지워져야하는 상황에 특히 배열의 count를 이용하기에도 부담되고, 서로 잘못된 순환참조로 맞물려 오류가 발생하기도 한다. 지속적으로 다양한 유형을 접하는 것도 중요할 것 같다.