1347. Minimum Number of Steps to Make Two Strings Anagram
문제설명
- 같은 길이 문자열 두개 주어짐
- s문자열을 t문자열로 만들기 위해 몇개 바꿔야하는지
- 순서는 상관없음
문제접근
- 이거 그럼
bab
->aba
가 되기위해서 한개만 바꾼거보니까 그냥 개수로 판단을 해주거나 ,- 아니면 문자열그대로 sorting을 해주거나해서 비교를 해줄 수 있을 것 같은데
일단 딕셔너리써서 개수로 판단해주면 될 것 같기도 ?
문제풀이
- S문자열에서 카운팅한걸 이제 T문자열에서 상쇄한다음 남은 잉여들을 총합하면 답이 나올 듯 ?
- 길이가 같다는 가정이 있으니 가능한 풀이
func minSteps(_ s: String, _ t: String) -> Int {
var s = Array(s); var t = Array(t)
var s_dict = [Character: Int]()
var t_dict = [Character: Int]()
var answer = 0
for i in 0 ..< s.count {
s_dict[s[i], default: 0] += 1
t_dict[t[i], default: 0] += 1
}
for (k, v) in t_dict {
if let canCount = s_dict[k] {
s_dict[k] = canCount - v
}
}
// print(s_dict)
for item in s_dict.values {
if item > 0 {
answer += item
}
}
return answer
}
aba
aba
를 예시로 보면은 알 수 있는데 s : a : 2 b:1
t: a: 1 b:2
---
s-t : a :1 b:-1
a:1 , b:-1 로 a 는 하나를 채워야하고, b는 하나가 모자르다는 것인데, 결국 정답은 1이다.
b에서 빵꾸난걸 a로 채운다는 것이라서 그냥 사실상 음수를 없는 값으로 치부해도 괜찮다는 것이다.
item>0
일때만 값에 환산하게끔 처리를 해줬다.타인의코드
- 나는 중위권정도에 위치하다보니, 최상위 코드를 살펴보자
class Solution {
func minSteps(_ s: String, _ t: String) -> Int {
var arr = Array(repeating: 0, count: 26)
for i in s {
if let ascii = (i.asciiValue) {
arr[Int(ascii) - 97] += 1
}
}
for i in t {
if let ascii = (i.asciiValue) {
if arr[Int(ascii) - 97] > 0 {
arr[Int(ascii) - 97] -= 1
}
}
}
var counter = 0
for i in arr {
counter += i
}
return counter
}
}
길이가 26인 알파벳 빈도수 배열을 생성한 후,
아스키 코드써서 문자를 인덱스로 매핑한 걸 볼 수 있었다.(길이26짜리)
그래서 S 순회하면서 일단 인덱스에 맞게 카운팅을 해주고, 이미 포함된 문자만 카운팅에서 빼주면서 음수가 안나오게 설계한 뒤,
이제 알파벳 배열을 순회하면서 카운팅 다 더해줘서 해결 한걸 볼 수 있었다.
이런식의 문제들 볼 때마다 아스키코드나, 26개로 배열을 만들어줘서 시간단축을 꾀한 것을 많이 볼 수 있었는데, 다음에 좀 활용을 해봐야겠다.