[Swift] [52일차] 1347_LEET ANAGRAM

·2025년 1월 28일
0

SwiftAlgorithm

목록 보기
55/105
post-thumbnail

1347. Minimum Number of Steps to Make Two Strings Anagram


문제설명

  1. 같은 길이 문자열 두개 주어짐
  2. s문자열을 t문자열로 만들기 위해 몇개 바꿔야하는지
  3. 순서는 상관없음

문제접근

  1. 이거 그럼 bab -> aba 가 되기위해서 한개만 바꾼거보니까 그냥 개수로 판단을 해주거나 ,
  2. 아니면 문자열그대로 sorting을 해주거나해서 비교를 해줄 수 있을 것 같은데
    일단 딕셔너리써서 개수로 판단해주면 될 것 같기도 ?

문제풀이

  1. S문자열에서 카운팅한걸 이제 T문자열에서 상쇄한다음 남은 잉여들을 총합하면 답이 나올 듯 ?
  2. 길이가 같다는 가정이 있으니 가능한 풀이
    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
}
  1. 딕셔너리로 카운팅을 해줘서 합산하는데, 이게 뭔가 답이 안맞게 나와서 알고보니
  2. 음수값으로 나온거는 빼주는게 아니라 음수만큼 만들어줘야하는거라서 합산에 영향을 주지 않는 것임을 알 수 있다.
    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 일때만 값에 환산하게끔 처리를 해줬다.


타인의코드

  1. 나는 중위권정도에 위치하다보니, 최상위 코드를 살펴보자
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개로 배열을 만들어줘서 시간단축을 꾀한 것을 많이 볼 수 있었는데, 다음에 좀 활용을 해봐야겠다.

profile
기억보단 기록을

0개의 댓글