알고리즘 문제 풀기

<leetCode> 7. Reverse Integer

studying develop 2021. 1. 8. 00:58

 

푸는데 오래걸렸다. swift랑 안친해서 그런거 같다.

 

 

 

class Solution {
    func reverse(_ x: Int) -> Int {
        var str = String(x)
        var arr = Array(str)
    
        var y = x
        let max = 1 << 31 - 1
        let min = -1 * (1<<31)
        
        if arr[0] == "-" {
            let str2 = str.dropFirst(1)
            
            var rev = String(str2.reversed())
            //print(type(of: rev))
            
            //var rev2 = rev.insert("-", at: rev.startIndex)
            
            //print(type(of: rev2))
            
            y = -1 * (Int(rev) ?? 2)
        } else {
            let revStr = String(str.reversed())
            
            if let ind = revStr.firstIndex{ $0 != "0" } {
                y = Int(revStr[ind..<revStr.endIndex]) ?? -1
            } else {
                y = Int(revStr) ?? 1
            }
        }

        guard (max >= y) else {
            return 0
        }
        
        guard (min <= y) else {
            return 0
        }

        
        return y
    }

}

스위프트가 strong type형 언어이다 보니까, 메소드들을 자유 자재로 사용하기 어렵다...

 

막혔던 부분은

 

1. reverse를 직접 구현하던 점, 물론 연습상 좋긴한데, 사용하기 어렵더라... String extension으로 사용할걸, 파라미터로 받아서 반환할려 했더니 사용하기도 어려워짐...

 

2. reversed()의 반환이 reversed String인가 하는 String 타입이 아니였다. 그래서 그것도 String으로 바꿔줘야 String의 index들을 사용할 수 있었다.

 

3. 2^31을 어떻게 표현할까 하다가, pow는 더블 타입에 대한 거라. bit opereation을 사용했다. c++에서는 많이 사용해봤는데, 여기서 사용하려니 되는지 몰랐음.

 

4. 3을 하고보니 Int, UInt32, UInt64가 다 다르고,  Int로 그냥 하니까 32비트 초과 정수도 저장되는걸 보니, UInt64랑 Int는 뭐가 다른지 모르겠다. 찾아 보니 int는 wrapper로 개발자가 진짜 구분해야 되는거 아니면 구분할 필요 없다함. 32bit컴에서는 UInt32 64bit 컴에서는 UInt64이다.

 

5.  그리고 인덱스와 관련해서 0이 아닌걸로 시작하는 첫 인덱스를 반환하는 firstIndex 메소드를 사용했는데, 반환이 optional이라 if let 으로 감싸 줘야 했는데, 이부분도 왜 optional인지 좀 해맸고.

 

6. String을 int로 변환하려는데 x가 변수면 x as! Int가 안됐음, 이게 근데 sigbart가 뜸, 이거 그냥 다운 캐스팅이라 그런가. 나는 왜 형 변환이라 생각했지. 그래서 Int(x) ?? 0 이런식으로 해줘야되고, optional이라 해줘야됨

 

 


음 릿코드 솔루션은 뭔가 다르고 신기하다.

 

Approach 1: Pop and Push Digits & Check before Overflow

 

Intuition

We can build up the reverse integer one digit at a time. While doing so, we can check beforehand whether or not appending another digit would cause overflow.

 

이게 문자열을 reverse하라는게 아니라 Integer를 reverse 하라는 거였는데, 좀 본질적으로 먼저 접근해야되는데 보지도 않고 Int -> String으로 전환해서 한건 문제라 본다...

 

int에서 할 방법을 먼저 생각해볼걸

 

123 -> 321