👨🏻‍💻iOS 공부/Swift_알고리즘 풀이

[LeetCode] Strings (1)

728x90
반응형

String 데이터 타입에 대한 문제들을 풀이해볼 것 이다.

 

1. Reverse String

말 그대로 문자열을 뒤집는 것이 문제이다. 

 

"ABCD"일 때, "DCBA"가 되도록 하는 것이다. 

바로 코드로 봐보자. 

 

class Solution {
    func reverseString(_ s: inout [Character]) {
        // 그냥 s.reverse() 사용하면 풀리긴 함..! 
        
        // 좌/우 인덱스를 정해준다. 
        var left = 0
        var right = s.count - 1
        
        // 만나는 순간 끝낼 수 있도록 
        while left < right {
            // left 값 저장해두고
            var temp = s[left]
            // left 값을 right 값으로 변경하고
            s[left] = s[right]
            // 저장해둔 left값을 rigth 값으로 변경
            s[right] = temp
            
            // 인덱스는 한 칸씩 +/-
            left += 1
            right -= 1
        }
        
    }
}

 

inout 파라미터를 또 맞닥뜨렸다. 

inout 파라미터가 있을 때는? return이 있을 필요가 없다! 왜냐? 자체 값을 바꾸고 출력하기 때문에!

 

[ 프로세스 ] 

 

1. 좌우 인덱스를 정한다 (0, array.count-1)

2. while문을 활용하여 좌/우 인덱스가 만나기 직전까지 수행

3. 좌우 값을 변경해준다. 

4. 인덱스를 각각 한 칸씩 이동한다. 

 

 

2. Reverse Integer

1번 문제와 똑같은 형식이나 문자열이 아닌 숫자를 뒤집는 방법에 대해서 묻고 있다. 

String으로 바꿔서 뒤집은 후 Int 형식으로 바꿔주는 방식도 있겠지만, 수학적으로 접근하는 방식을 이용해보자. 

 

아래 예시를 보자.

 

// Input : 1234
// res : 0

A| 1의 자리 수인 4를 1000의 자리 수로 두어야 한다. 
B| res에 10을 곱한다. (첫 사이클에는 무의미) 
C| Input % 10을 하여 나머지 4를 res에 더한다. 
D| Input / 10을 하여 123으로 바꾼다. 

A| 10의 자리 수인 3을 100의 자리 수에 두어야 한다. 
B| res에 10을 곱한다. (res = 40) 
C| Input % 10을 하여 나머지 3를 res에 더한다. (res = 43)
D| Input / 10을 하여 12로 바꾼다. 

// Input이 0이 될 때까지 반복! 

이를 코드로 봐보자.

 

class Solution {
    func reverse(_ x: Int) -> Int {
        // 결과를 저장하기 위한 res
        var res = 0 
        // 기존 x는 let이기에 var로 변경
        var x = x
        
        // x 가 0이 될 때까지
        while x != 0 { 
            res *= 10
            res += x % 10
            x /= 10
            
            // 문제 조건 맞추기
            if res < Int(Int32.min) || res > Int(Int32.max) {
                return 0
            }
        }
        return res
    }
}

 

[ 프로세스 ] 

 

1. 결과를 저장하기 위한 res, 값 변경을 위한 x를 var로 할당한다. 

2. x가 0이 될 때 까지 while문을 돈다. 

     2-1. res에 10을 곱해 자릿수를 바꿔준다. 

     2-2. res에 x를 10으로 나눈 나머지 값을 할당해준다. 

     2-3. x를 10으로 나눠 가장 끝 자릿수를 탈락시킨다. 

3. Int32.min보다 작거나 Int32.max보다 클 경우 0을 반환해준다. 

 

 

3. First Unique Character in a String

문자열에서 처음으로 등장하는 unique한 chr를 찾는 문제이다. 

우선 unique한 chr인지 알아내기 위해 dict 형태로 하여 key / value 접근을 가능하도록 했다.

 

class Solution {
    func firstUniqChar(_ s: String) -> Int {
        // key & value 쌍으로 만들기
        var tes = Dictionary(s.map {($0,1)},uniquingKeysWith : +)
        // 앞에서 부터 원소들과 비교
        for (i,n) in s.enumerated() {
            // 가장 먼저 value가 1인 값의 index 반환
            if tes[n] == 1 {
                return i
            }
        }
        // 값이 없을 경우 -1 반환
        return -1
    }
}

 

[ 프로세스 ] 

 

1. Key & Value 쌍으로 접근하기 위해 Dictionary를 만들어준다.

2. 기존 배열을 enumerated하여 index, value로 매칭해준다.

3. 앞에서부터 돌며 dictionary의 값이 1인 s 배열 내의 값을 찾는다.

4. 그 때의 index를 내뱉는다. 

5. 그렇지 못할 경우 -1를 반환한다.

728x90
반응형