Haru's 개발 블로그

[자료구조,알고리즘] Swift 알고리즘 문제 풀기 전 리마인드 본문

CS/자료구조,알고리즘

[자료구조,알고리즘] Swift 알고리즘 문제 풀기 전 리마인드

Haru_29 2022. 5. 8. 22:49

일단 들어가기 전에 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
Comments