[Swift/Algorithm] Swift Algorithm 팁 정리❗️
💡 Algorithm

[Swift/Algorithm] Swift Algorithm 팁 정리❗️

오늘은 Algorithm 문제를 풀면서 많이 사용되는 것들을 정리해보려 합니다.
이 내용들은 추가할 내용이 생길 때마다 업데이트할 예정입니다 :)

 

값 입력 프로젝트 생성

swift 언어로 알고리즘을 풀 경우에는(특히 백준 알고리즘의 값을 입력받아야 하는 경우) readLine()을 사용해야 합니다. 그렇기에 그게 가능한 Command Line Tool로 프로젝트를 생성하면 됩니다.

Xcode -> Command Line Tool 생성!

 

키보드 값 입력받기

var input = readLine() // return 값은 Optional String 형식

var input = readLine()! // return 값은 String 형식

 

Int 값 입력받기

var input = Int(readLine()!)! // return 값은 Int

var input = Int(String(readLine()!))! // 위보다 조금 더 속도가 빠르다고함

 

입력 값 공백으로 구분

  • split()으로 구분 (예시: 1 2 3 4)
var nums = readLine()!.split(seperator: " ") // ["1", "2", "3", "4"]
  • components로 구분 (예시: 1 2 3 4)
var nums = readLine()!.components(separatedBy: " ") // ["1", "2", "3", "4"]

코드 예시로는 다를 게 없어 보이지만, components()를 사용할 경우에는 Foundation을 import를 해주어야 하지만, split() 함수는 Swift Standard library에 속해있기 때문에 별도로 Foundation을 import 해주지 않아도 됩니다.

 

자세한 내용은 다음에 자세히 정리해서 포스팅할 예정입니다 :)

 

N 개의 줄 만큼 입력받기

var N = Int(readLine()!)!
var lines = [Int]()
for _ in 0..<N { lines.append(Int(readLine()!)!) }

print(lines)
// 입력
// 4 (N개의 줄 개수)
// 5
// 7
// 2
// 9

// 출력: [5, 7, 2, 9]

 

배열 생성

let arr = [Int]() // 개인적으로 위의 방법을 선호
let arr: Array<Int>

let arr = [Int](repeating: 2, count: 5)
let arr = Array(repeating: 2, count: 5)
// 출력) [2, 2, 2, 2, 2]

let arr = [String](repeating: "Z", count: 4) // 이처럼 다른 데이터 타입도 가능함
// 출력) ["Z", "Z", "Z", "Z"]

 

2차원 배열 생성

let arr = [[Int]]() // 빈 2차원 배열

let arr = [[Int]](repeating: Array(repeating: 2, count: 3), count: 4)
let arr: [[Int]] = Array(repeating: Array(repeating: 2, count: 3). count: 4)
// 출력) [[2, 2, 2], [2, 2, 2], [2, 2, 2], [2, 2, 2]]

 

임의의 Data 넣어서 생성

let arr = Array(1...5) 
// 출력) [1, 2, 3, 4, 5]

 

배열 역순으로 출력

let reversed()
arr = arr.reversed()

 

배열 정렬

// 오름차순. default도 오름차순. (1, 2, 3, 4, ...)
arr.sort()
arr.sort(by: <)
arr.sorted(by: <)

// 내림차순. (..., 4, 3, 2, 1)
arr.sort(by: >)
arr.sorted(by: >)

 

고차함수

 

map

let string = ["1", "2", "3", "4"]
string.map { Int($0)! }
// [1, 2, 3, 4] 각 원소를 전부 Int로 맵핑

filter

let arr = [1, 2, 3, 4]
arr.filter { $0 % 2 == 0 }
// [2, 4] 조건에 맞는 수만 filtering 하여 걸러냄

reduce

let arr = [1, 2, 3, 4]
arr.reduce(0, +)
// 1, 2, 3, 4를 다 더한 10의 값. 문자열 합치기도 가능함

고차 함수에 대한 자세한 내용을 알고 싶다면, 고차함수 이 글에서 확인해주세요 :)

 

 

무한 루프

while true {
    ...
}

 

아스키코드(ASCII) 변환

// Character to Ascii
Character("a").asciiValue! // return 타입은 UInt8 이며, 값은 97

// Ascii to Chacter, String
let char = Character(UnicodeScalar(65)) // A
let str = String(UnicodeScalar(97)) // a

 

절댓값 변환

 abs(-31) // 31
 abs(31) // 31

 

print 줄 바꿈 안 하기

for i in 1...5 {
    print(i, terminator: " ")
}
// 1, 2, 3, 4, 5

 

print 중간에 값 넣기

print("my", "name", "is", "Miro", separator: "___")
// 출력: my___name___is___Miro

 

for 문과 stride( ) 함수

let input = Int(readLine()!)!

for i in stride(from: input, to: 0, by: -1) {
    print(i, terminator: " ")
}
// 입력(input): 5일 경우
// 출력 : 5 4 3 2 1

for i in stride(from: input, through: 0, by: -1) {
    print(i, terminator: " ")
}
// 입력(input): 5일 경우
// 출력: 5 4 3 2 1 0

위, 아래의 for문의 차이점은 to이냐, through이냐의 차이입니다.

 

자세한 내용을 알고 싶다면 stride() 함수 이 글에서 확인해주세요 👍

 

 

 

 

공부하며 정리한 내용이기 때문에, 틀린 내용이 있을 수 있습니다.
틀린 내용이 있다면 댓글로 알려주시면 감사하겠습니다 😋