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를 반환한다.