문자열 만들기
String.reduce("", { (result, str) -> String in
return result + (넘겨받은 str을 변경)
})
String.map({ str -> String in
return (넘겨받은 str을 변경)
}).joined()
String.reduce(""){
$0 + (변경된 Str)
} //$1로 접근 가능
String.map{(변경된 Str)}.joined()
부분 배열 생성
let origin: [Int] = [1,2,3,4,5,6]
let sub: [Int] = Array(origin[0..2])
문자열 나누기
String.components(separatedBy: "")
String.split(separator: "")
- components, split 둘다 String을 잘라 배열에 담아주긴 하지만 둘의 반환값이 다르다
components의 경우 [String]배열에 담을 수 있는 반면 split은 불가능 하다 split의 반환값이 [String.Subsequence]이기 때문
input 입력
Int(readLine()!)!
readLine()!
- 알고리즘의 경우 입력이 항상 같은 형식으로 들어오기 때문에 강제추출이 가능하다
Array 배열
let arr: [Int] = [1,2,3,4,5,6]
arr.enumerated().map{
print($0.offset, $0.element) // {(0,1), (1,2) ,,,}
}
arr.indices.map{ print($0) } // 0,1,2,3,4,5 -> index접근
짝 생성 - Sequence 프로토콜을 채택한 컬렉션 한쌍을 생성
let arr1: [Int] = [1,2,3,4,5,6,7,8]
let arr2: [String] = ["one","two","three","four","five","six","seven"]
for z in zip(arr1,arr2){
print(z)
}
- arr1의 경우 0~7번의 인덱스를 가지고 arr2의 경우 0~6번의 인덱스를 가진다. 그럼 zip(arr1,arr2)는 둘중 낮은 인덱스를 따른다
즉) z는 (1,"one") ~ (7,"seven") 까지만 값을 가진다
SubString - 부분 문자열
let arr: [String] = ["a","b","c","d","e","f"]
print(arr[1...5]) // ["b","c","d","e","f"]
let str = "abcdefg"
//print(str[2]) -> 오류 발생
let idx = str.index(str.startIndex, offsetBy: 2)
print(str[idx]) // "c"
let start = str.index(str.startIndex, offsetBy: 1)
let end = str.index(str.startIndex,offsetBy: 5)
//print(str[1...5]) -> 오류 발생
print(str[start...end]) // "bcdef"
- 단순 배열의 경우는 arr[1...5] 처럼 범위로 접근이 가능하지만 String의 경우는 불가능하다
print(str[2])과 같이 접근하려고 하면 'subscript(_:)' is unavailable: cannot subscript String with an Int, use a String.Index instead. 와 같은 경고를 띄운다 그렇기에 직접 접근이 아닌 변상수.index( , offsetBy: ) 메서드를 사용해서 접근해야한다
문자열 속 숫자 걸러내기
let str: String = "fdkoofmdo212352odos"
let numArr: [Int] = str.filter{ $0.isNumber }.map{ Int(String($0))! }
- str.filter{ $0.isNumber } 까지만 실행할 경우 숫자만 담겨있는 String문자열이 반환된다
String을 배열로 변환하는 법
let str: String = "fdkoofmdo212352odos"
let chaArr: [Character] = Array(str)
let strArr: [String] = str.map{ String($0) }
let strSlice: ArraySlice<Character> = ArraySlice(str)
- Array(str)의 경우 반환값이 [Character]이므로 String으로 사용 하려면 변환 후 사용해야한다
배열에서 원하는 값이 처음으로 나오는 인덱스 구하기
let arr: Int? = array.firstIndex(of: 원하는 값)
- 찾는 값이 없을 수 있기 때문에 옵셔널로 반환된다
접미사 / 접두사
let str: String = "123456789"
print(str.prefix(3)) // 123
print(str.suffix(3)) // 789
특정 suffix를 가진 가장 긴 문자열 구하기
let str: String = "123456789"
let ran = str.range(of:"456",options: .backwards)
let sufstr = str.prefix(upTo: ran!.upperBound)
print(sufstr)
- upTo에서 ran!.lowerBound가 될경우 "456"을 포함하지 않음
- upTo : 가져올 범위
문자열 A의 순서를 바꿔 문자열 B를 만들 수 있는지 확인
let str1: String = "abcdefghijk"
let str2: String = "kjihgfedcba"
print(str1.sorted() == str2.sorted())
문자열이 특정 조건을 만족하는지
let str: String = "apple banana strawberry"
print(str.filter{String($0).allSatisfy{$0=="a" || $0=="b"}}) //abaaaab
튜플 비교 연산자 사용
let num1: (Int,Int) = (3,10)
let num2: (Int,Int) = (2,10)
let num3: (Int,Int) = (3,15)
print(num1 > num2) // true
print(num1 > num3) // false
- 튜플의 비교는 (n1, n2) 중 n1을 먼저 비교 하고 두 수가 같은 경우에 n2를 비교한다
진수 변환(10진수 -> 2진수 / 2진수 -> 10진수)
let num10: Int = 8
let num2: String = String(num10, radix:2) // 10진수를 2진수로 변환
print(num2) // 1000
let num2: String = "1000"
let num10: Int = Int(num2, radix: 2)! // 2진수를 10진수로 변환
print(num10) // 8
- 2진수 -> 10진수의 경우 String -> Int 이므로 이때 값은 옵셔널이 된다 ( 반대의 경우 Int는 String이 무조건 되므로 옵셔널이 아님 )
문자의 아스키 코드 값 구하기
print(Character("A").asciiValue) // 65
특정 문자열 변경
let str1: String = "abcdefg"
let str2: String = str1.replacingOccurrences(of: "cde", with: "****")
print(str2)
- of: 변경 전 내용 / with: 변경 후 내용
배열 범위를 통한 배열 변경
var arr: [Int] = [1,2,3,4,5,6,7,8,9]
arr.replaceSubrange(Range<Int>(0...3), with: [-1,-1,-1])
print(arr1) // [-1,-1,-1,5,6,7,8,9]
- [0...3] 을 [-1,-1,-1]로 바꾸었기 때문에 배열 요소의 수가 하나줄음
조합 알고리즘 관련 팁
- nCn = 1, nC0 = 1, nC1 = n
- nCr = nC(n-r)
- nCr = (n-1)C(r-1) + (n-1)C(r)
기타 알고리즘 팁
- 종이를 가위로 자를 때 가위를 몇번 써야하는가? = 가로길이 x 세로길이 -1
- 최대 공약수 구하기 = 유클리드 호제법 사용