일단 들어가기 전에 Swift 알고리즘에 팁에 대하여 적을 예정입니다.
기본 입력 받기
var input = readLine()!
Int형 한 개의 숫자 입력 받기
var num = Int(readLine()!)!
공백 있는 숫자 받기
// split - ReturnType: [SubString]
var nums = readLine()!.split(separator: " ").map{Int($0)!}
// components - ReturnType: [String]
var nums = readLine()!.components(separatedBy: " ").map{Int($0)!}
공백 없는 숫자 배열로 받기
var num = Array(readLine()!).map{Int(String($0))!}
// String 변수 삽입해도 가능합니다.
var nums = Array(numbers).map{String($0)}
1차원 배열 선언 방법
let arr = [Int](repeating: 0,count: 5)
2차원 배열 선언 방법
let arr = [[Int]](repeating: [[Int]](repeating: 0, count: 3), count: 5)
// graph에서 다른 노드와 다른 노드와의 거리를 Set으로 사용할 경우
var graph = Array(repeatinf: [(Int, Int)](), count: n)
배열 역순으로 뒤집기
arr.reverse()
arr = arr.reversed()
배열 정렬하기
//오름차순
arr.sort(by: <)
//내림차순
arr.sort(by: >)
배열의 특정 요소 세기
let arr = ["D", "D", "R", "D"]
arr.filter { $0 == "D" }.count //3
배열의 각 요소의 수 세기(Counter)
let arr = ["one","two","three","four","one"]
var counter = [String: Int]()
arr.forEach { counter[$0, default: 0] += 1 }
print(counter) // ["three": 1, "one": 2, "two" : 1, "four": 1]
고차함수(map, filter, reduce)
let array = ["1","2","3","4","5"]
// map
// [1,2,3,4,5]
newArray = array.map { Int($0)!}
// filter
// [4,5]
// 위 식을 간소화
newArray = newArray.filter { $0 > 3}
//reduce
//20
let result1 = newArray.reduce(1) { (n1: Int, n2: Int) in
return n1 * n2
}
// return과 타입 생략 가능
let result2 = newArray.reduce(1) { (n1, n2) in
n1 * n2
}
// 1은 초기 값
let result3 = newArray.reduce(1) { $0*$1}
let result4 = newArray.reduce(1,*)
sum (reduce() 활용, nums의 데이터 타입
num.reduce(0,+)
거듭 제곱
pow(밑: Double, 지수: Double)
let n = 2
Int(pow(2.0,Double(n))) // 4
type 확인하기
print(type(of : input))
소수점 아래 자리수 제한하여 스트링으로 표현
String(format: "%.2f",value)
문자열 자르기
var s. "HelloWorld"
// "Hello"
var prefix = s.prefix(5)
// "World"
var suffix = s.suffix(5)
// 배열을 이용하여 문자열 자르고 합치기
var index = 4
var hello = w[w.startindex...index].map{String($0)}
var world = w[index+1..<w.endIndex].map{String($0)}
var helloWorld = hello.joined() + world.joinded()
절대값
abs(-11) // 11
올림(ceil),내림(floor),반올림(round)
ceil{Double)
ceil(6.3) // 7.0
floor(Double)
floor(4.3) // 4.0
round(Double)
round(5.5) // 6.0
//원하는 소수점까지 반올림하고 싶을 때
var value = 1.543
value = round(value * 100) / 100 // 1.54
String 대문자 또는 소문자로 바꾸기
var s = "Hello, Swift"
s.lowercased() // hello, swift
s.uppercased() // HeLLO, SWIFT
문자열 치환
import Foundation
let str = "Hello, Swift"
let replacedStr = str.replacingOccurrences(of: "Hello", with: "Hi") // Hi, Swift
진수 변환
let num = 45
//String(var, radix: 3)의 경우 var의 타입은 Int
String(num, radix: 3) //1200
//Int(var, radix: 3)의 경우 var의 타입은 String
// 45를 3진법으로 변환하고 앞뒤를 반전시킨 값을 10진법으로 표현한 것
Int(String(String(num,radix: 3).reversed()), radix: 3)! // 7
아스키코드 변환
// Character -> Ascii
Character("a").asciiValue! // 97, Return Type: UInt8
// Ascii -> String or Character
let c = Character(UnicodeScalar(97) // a
let s = String(UnicodeScalar(65)) // A
// String -> Ascii 함수
func strToAscii(_ str: String) -> Int {
str.map{ $0.asciiValue!}.map{Int($0)}.reduce(0,+)
}
String식 계산하기
let expr = NSExpression(format: "10-20*30+20")
let result = expr.expressionValue(with: "-", context: nil) as! Int // -570
2차원 배열 -> 1차원 배열 만들기
var arr = [[1,2,3],[2,3],[4]]
let flatten = arr.flatMap { $0 } // [1,2,3,2,3,4]
Subsequence(ArraySlice) -> Array
// nums 배열에서 특정 구간을 잘라서 res 배열로 넣는 상황
let nums = [0,1,2,3,4,5]
var res = [[Int]]()
// Subsequence 타입을 다시 Array로 캐스팅해야 res에 넣을 수 있음
res.append(Array(nums[nums.firstIndex(of: 3)!...]))
//res -> [[3,4,5]]
범위 체크(그래프에서 좌표 예시)
let n =5, m = 6
func checkBorder(_ r:Int,_ c:Int) -> Bool {
0..<n ~= r && 0..<m ~= c
}
print(checkBorder(3,4)) // true
print(checkBorder(4,7)) // false
'CS > 자료구조,알고리즘' 카테고리의 다른 글
[알고리즘/자료구조] 알고리즘/자료구조 준비방법 (0) | 2022.05.19 |
---|