Swift로 코딩테스트를 볼 일이 생겨서 준비를 하는 중에 정리해보고 있다.
새삼 Swift는 기본 문법의 내장 함수 파라미터 이름 하나하나가 정교하다는 느낌을 받는다.. ex) print() 함수의 separator: 라던지..
그리고 고차원 언어이므로 지원하는 내장 함수나 기능이 풍부하다 !! Python 만큼 대중화(?) 되지 않아서 그렇지 있을건 다 있는 함수이고, 다만 코딩테스트 볼 때는 옵셔널한 값을 받지 않을것이므로 옵셔널 강제 해제를 해주고 있다.
원래 PS때 쓰던 언어가 파이썬이므로 파이썬과의 비교가 있을 수 있습니다(!)
백준 기준으로 보통 이렇게 많이 입력을 받는다
배열에 대한 정보가 주어지기 이전에 배열의 세로길이와 가로길이를 먼저 입력받고,
2차원 배열을 입력받는 코드에 대한 예시이다
let input = readLine()!.split { $0 == " "}.map{ Int(String($0))! }
let n = input[0]
let m = input[1]
우선 맨 윗줄 숫자값을 읽어들이기 위해서, swift에서는 python 의 sys 라이브러리에 있는 sys.stdin.readline() 과 같은 역할을 하는것이 readLine() 함수이다. 읽어들일 때 String 타입으로 읽어들인다. 따라서 map() 함수를 통하여 String에서 Int로 타입 변환을 해준다.
$0 는 swift에서 개발할때 많이 쓰이는데.. 이름없는 변수를 의미한다. map 이전까지 ["8", "7"] 이런 값이 담겨있을 것이므로, 문자열 타입에서 Int타입으로 변환해주어야 한다. 이때 $0 은 8, 7 .. 값 하나하나를 찍어준다
그리고 공백을 기준으로 잘라주어야 하므로, split() 함수를 썼다. 위에서는 클로저 함수로 separator를 표기한 것이고, split() 함수 파라미터로 separator가 있다. 파이썬에 있는 split() 함수와 유사한 기능을 한다.
split(separator: " ")
다음으로 n*m 크기의 배열을 초기화 해보자
// reapting: 초기값, count: 배열의 크기
var matrix = Array(repeating: Array(repeating: 0, count: m), count: n)
repeating 파라미터에는 배열을 초기화 할 값을 넣어주고, count로 배열의 크기를 설정한다.
matrix 값이 변할 수도 있으므로 변수로 선언해주었다.
for i in 0..<n {
let data = readLine()!.split(separator: " ").map{ Int(String($0))! }
matrix[i] = data
}
입력값에서 한줄 한줄 읽어들이면서 한 row 째로 matrix에 넣어주었다.
마지막으로 잘 입력받았는지 matrix를 출력해보는 코드이다.
for i in 0..<n {
for j in 0..<m {
print(matrix[i][j], terminator: " ")
}
print()
}
전체 코드
import Foundation
// let input = readLine()!.split {$0 == " " }.map { Int(String($0))!} // Array 로 입력받음
let input = readLine()!.split { $0 == " "}.map{ Int(String($0))! }
let n = input[0]
let m = input[1]
// reapting: 초기값, count: 배열의 크기
var matrix = Array(repeating: Array(repeating: 0, count: m), count: n)
for i in 0..<n {
let data = readLine()!.split(separator: " ").map{ Int(String($0))! }
matrix[i] = data
}
print()
for i in 0..<n {
for j in 0..<m {
print(matrix[i][j], terminator: " ")
}
print()
}