iOS/Swift

[Swift] PS에 유용하게 사용할 것들 정리

유훈 | Yuhun 2022. 6. 23. 17:31
반응형

IDE를 사용하지 않고 PS문제를 푸는 연습을 하는 중입니다.
Swift는 parameter 이름도 method에 써줘야해서 조금 까다롭습니다.
물론 구현해서 써도 되지만 너무 기본적인 것도 전부 구현하면 코드 길이와 시간이 비약적으로 늘어나기에.. 정리해보려 합니다.

일단 쭉 써놓고 코테가 끝나면 String, Array 등 확실히 정리해서 구분해보는걸로!

pow(_ p1: Double, _p2: Double)

- p1의 p2승

- 양쪽을 float이나 double로 써줘야한다. 리터럴은 타입캐스팅 해주는듯 하지만.. 변수는 에러 (숫자라면 소수점 3.0 / 변수라면 Double() 사용)

var a: Int = 3
var result: Double = pow(2.0, 3); // 8

var result2: Double = pow(2.0, a) // 에러 (a가 Int이기 때문)
var result3: Double = pow(2.0, Double(a)) // 이렇게 써야 안전

sqrt(p1:float또는Double)

- pow()와 비슷하게 float이나 double 제곱근을 구함

let a = 16
print(sqrt(a)) // Error
print(sqrt(Double(a))) // 4.0

reversed()

- String, Array 모두 사용 가능

- String이나 Array 객체를 반환하지 않아 타입을 바꿔 사용할 필요가 있다.

var a: String = "abcd"

var b = a.reversed()
var c: [String] = ["a","b","c","d"]

print(Array(c.reversed())) // ["d", "c", "b", "a"]
print(String(b)) // dcba - reversed()의 반환 타입이 String이 아님이로 String으로..

문자열 나누기 split(separator: Character)과 components(separatedBy: CharacterSet)

split은 [subString]을 반환하고 components는 Foundation에 속하고 [String]을 반환한다는 차이점이 있으니 사용에 주의!
이 둘이 무엇인지는 예시를 보면 바로 알 수 있고 추가로 components는 문자열 여러개를 기준으로 문자열을 나눌 수도 있다.

(components는 오버로딩 되어있어 문자 하나도 괜찮고 CharacterSet도 괜찮다는 것!)

+ split과 components의 파라미터 이름은 다름 주의

import Foundation

let ex:String = "1+2-3/4*5"
let s:[Substring] = ex.split(separator: "-")
// split과 let c:[String] = ex.components(speratedBy: "-")는 반환 값만 다르지 비슷하다.
let c:[String] = ex.components(separatedBy: ["+","-","/","*"])

print(s) // ["1+2", "3/4*5"]
print(c) // ["1", "2", "3", "4", "5"]

String Index 처리

string은 Int로 접근이 불가능함으로(strA[0] 같은거 x) Index로 접근해야한다.

IDE를 못 쓴다면 index method의 파라미터를 잘 외우자 -> 문자열.index(_ : offsetBy:)

// Index로 접근
var strA: String = "01234567"
print(strA[strA.index(strA.startIndex, offsetBy: 2)]) // 2
// 뒤에서부터도 가능 (endIndex는 마지막 인덱스 다음인 것을 주의)
print(strA[strA.index(strA.endIndex, offsetBy: -2)]) // 6

// index로 구간
strA[strA.index(strA.startIndex, offsetBy: 1)...strA.index(strA.startIndex, offsetBy: 3)] //123

// String을 구간으로 접근하고 싶을땐 배열을 이용하는 방법도 있음
String(Array(strA)[1...3]) // 123

 

String -> 아스키코드

string 값을 아스키코드로 변환하는 방법

"A".unicodeScalars.first!.value // 65

아스키코드 -> String

let A = Character(UnicodeScalar(65)) // A

진법 변환

10진수 Int에서 다른 것으로 변경할 때는 String(_:Int, radix: Int )을 사용해서 변환할 수 있지만

다른 것을 10진수로 변환할 때는 Int(:String, radix:Int)를 사용합니다. (사실 String은 아니지만.. 편의상)

** Int()를 사용할 때는 String->Int임으로 ! 옵셔널을 벗겨줍니다.

10진수 -> 다른것은 변환할 진법을 알려줬지만 다른것->10진법은 주어진 String의 진법을 radix에 써줍니다,

var a:Int = 16 // 10->2 진법
print(String(a,radix: 2)) // 10000
print(String(a,radix: 8)) // 20
print(String(a,radix: 16)) // 10

var b:String = "1100" // 2->10진법
print(Int(b,radix: 2)!) // 1

 max(_p1,_p2), min(_p1,_p2) / 배열의 max(), min() 

먼저 그냥 max()는 두 개의 파라미터 중 큰것을 리턴하고 min은 작은것을 리턴합니다.

다음은 배열에서 최댓값과 최소값을 찾는 method입니다.
근데 배열에 값이 비교가능한 값이 아닐 수 있음으로 optional을 반환한다! -> ps에서는 그냥 ! 하자

// 비교 max(), min()
let a:Int = 1
let b:Int = 5
print(max(a,b)) // 5
print(min(a,b)) // 1

// 배열의 method
let arr: [Int] = [1,2,3,4,5]
print(arr.max()!) // 5
print(arr.min()!) // 1

Character의 대소문자 구분 isLowercase , isUppercase

대소문자를 구분하는 것은 ()이 없음을 주의..

let ch:Character = "A"
ch.isUppercase // true

String의 대소문자 변환 lowercased(), uppercased()

IDE를 쓸 때에는 lowerCase() 일거라고 생각했는데 case가 소문자인 것, ed 형인것을 주의해야겠습니다.

let str:String = "AaBbCcDd"
str.lowercased() // aabbccdd 리턴
print(str.uppercased()) // AABBCCDD 리턴

String에서 맨 앞 문자, 뒷 문자 제거

subString으로 구현해도 괜찮지만 간단한 메서드를 제공합니다.

var str:String = "aaaaa"

// subString으로(before나 after사용도 가능) - 앞 뒤 모두 제거한 예
str = str[str.index(str.startIndex, offsetBy: 1)..<str.index(str.endIndex, offsetBy: -1)]

// 메서드를 이용(코테에선 이걸 사용하자)
str.removeFirst()
str.removeLast()

 

enumerated() 배열의 인덱스와 값을 한번에 받아올 수 있는 메서드

배열의 index와 value를 쌍으로 받아와 for문에서 처리가 용이합니다.

사용법으 array.enumerated()

let arr:[String] = ["a","b","c","d","e"]

for (index, value) in arr.enumerated() {
    print("인덱스는 \(index)이고, 값은 \(value)입니다.")
}

// 결과
// 인덱스는 0이고, 값은 a입니다.
// 인덱스는 1이고, 값은 b입니다.
// 인덱스는 2이고, 값은 c입니다.
// 인덱스는 3이고, 값은 d입니다.
// 인덱스는 4이고, 값은 e입니다.

배열에서 String의 index 구하기 firstIndex(of: )

배열에서 주어진 문자열의 index를 구해주는 함수입니다.

** 리턴값이 Optional임으로 언래핑 필요

let arr:[String] = ["hello", "world", "hi", "hello"]
arr.firstIndex(of: "world") // Optional(1)
arr.firstIndex(of: "world")! // 1

Set 선언과 사용

set이 유용한데 다른 collection type과 약간 선언과 사용법이 달라 간단하게 정리합니다.

(알기만 해도 은근 유용할 때가 있음)

// 선언(Int 타입 set)
var exSet1:Set<Int> = []
// 또는 다음처럼 초기화도 가능
var exSet2:Set<Int> = [1,2,3,4,5]

// 배열과 같은 프로퍼티들
exSet2.count // 5
exSet2.isEmpty // false
exSet2.contains(3) // true

// 삽입 삭제
exSet2.insert(6)
exSet2.remove(4)
exSet2.removeAll()

// 다음은 집합(이걸 몰라서 직접 구현해서 사용했네요.. 하하)
// 부분집합 확인
exSet1.isSubset(of:exSet2) // true or false 리턴
// 교집합
exSet1.intersection(exSet2) // 교집합 set 리턴
// 합집합
exSet2.union(exSet2)// 합집합 set 리턴

// 일단 위까지 알면 무난하게 사용할 수 있을듯 합니다.
// 아래는 추가로 알면 좋은?

// 여집합
exSet1.symmetricDifference(exSet2) // 여집합 리턴

// 차집합
exSet1.a.subtracting(exSet2) // 차집합 리턴

크기 비교

크기를 비교할 때 1 > 2는 당연히 false이다.
그런데 "1" > "2" 로 해도 결과는 같다

반응형