Swift 코딩테스트(37)
-
[Swift 코테] 백준 24313 알고리즘 수업 - 점근적 표기 1
f(n) = a1 * n + a0 g(n) = n 모든 n >= n0에 대해 f(n) = n0에 대해 f(n) 7 ≤ n 일 때 모든 10 < n 이 성립한다. 2번 조건에서 n이 7보다 크거나 같으면 f(n)
2023.04.07 -
[Swift 코테 기초] -1을 입력받을 때까지 while let 사용하기
- -1을 입력받으면 종료하는 while문, 입력값을 계속 사용해야할 때 사용할 수 있다. while let input = readLine(), input != "-1" {}
2023.04.03 -
[Swift 코테 기초] 제곱근으로 약수 구하기
1. 약수 구하기 - N을 1부터 N까지의 수로 나눠서 그 값이 0이 되면 나눈 수는 N의 약수이다. 하지만 이 방법은 매우 비효율적이다. - N의 약수는 N의 제곱근보다 클 수 없기 때문에 범위를 N/2로 한다. - 주어진 수의 제곱근을 넘어선 약수는 이미 이전에 발견한 약수와 곱하여 나타낼 수 있기 때문 - 범위가 N/2이기 때문에 리턴 배열에 N이 포함되지 않으므로 추가해준다. ex) 36의 경우 6까지만 탐색한다. 6 이상의 숫자는 이미 이전에 발견한 약수와의 곱으로 표현할 수 있다. (12 * 3, 3 * 12) func solution(_ n: Int) -> [Int]{ return Array(1...n/2).filter { n % $0 == 0 } + [n] } print(solution(1..
2023.04.03 -
[Swift 코테 기초] reverse()와 reversed(), ReversedCollection<Array<Element>> 사용 방법
1. reverse() reverse()는 새로운 배열을 리턴하지 않고 배열 그 자체를 변경한다. var arr = [Int](1...10) arr.reverse() print(arr) //[10, 9, 8, 7, 6, 5, 4, 3, 2, 1] 2. reversed() reversed()는 컬렉션에서 역전된 순서의 요소를 새로운 뷰로 반환한다. 즉 원래 컬렉션의 값에는 변화가 없다. A ReversedCollection instance wraps an underlying collection and provides access to its elements in reverse order var arr = [Int](1...10) arr.reversed() print(arr) //[1, 2, 3, 4, 5,..
2023.02.22 -
[Swift 코테 기초] 배열 초기화 하기, [1, 2, 3, 4, ..., n] 증가하는 배열 초기화하기
var arr = [Int](1...10) //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] var n = 10 var arr2 = [Int](1...n) //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2023.02.22 -
[Swift 코테 기초] 2차원 배열에서 최소, 최대 찾기
let arr = [[50, 10, 30], [-10, -20, -30, -500], [100,200,300, -400]] let max = arr.map({$0.max()!}).max()! //300 let min = arr.map({$0.min()!}).min()! //-500
2023.02.16 -
[Swift 코테 기초] 고차함수를 이용해서 값을 더하고 정렬하기
고차함수: 전달인자로 함수를 전달받거나 함수 실행의 결과를 함수로 반환하는 함수 고차함수 - https://ksk9820.tistory.com/127 숫자가 주어지고 값을 더해야 할 때 -> reduce 함수 이용 - 내부의 콘텐츠를 하나로 통합할 때 사용 initialResult: 축적되는 값의 초기 값, 클로저에서 처음으로 실행될 값 nextPartialResult: 이때까지 축적된 값과 이후에 축적될 값을 순서로, 다음 호출에서 또 사용될 값이거나 리턴될 값 reduce(초기값, 어떻게 통합할지) let arr = [10, 20, 30, 40, 50] arr.reduce(0, +) //150 arr.reduce(0, -) //-150
2023.02.08 -
[Swift 코테 기초] 대각선 찾기, 판별하기
일직선상에 있는 좌표 1 (x1, y1)과 좌표 2 (x2, y2)의 x 간의 거리와 y 간의 거리가 같다면 두 좌표는 같은 대각선 위에 위치한다. x 간의 거리와 y 간의 거리가 같다면 => |x1 - x2| == |y1 - y2|
2022.09.07 -
[Swift 코테] 백준 15649, 15650, 15651, 15652 N과 M
백트레킹 진행 과정에서 답이 아닌 분기를 만나면 탐색을 진행하지 않고 돌아가 다른 분기로 감으로써 가지치기를 한다는 차이가 있다. 조건에 맞지 않는 분기에서 가지 치기를 하고, 부모 노드로 돌아가 다른 자식을 검색한다 First In Last Out을 하는 Stack과 재귀를 사용해서 구현할 수 있다. 모든 요소를 포함하고 있는 그래프에서 조건에 맞게 분기를 할지 말지 결정하는 것이 아니라 그래프(혹은 배열)에 바로바로 추가할지 말지를 결정해야 하는 문제이다. 또한 조건을 만족하는 답을 찾아서 끝내는 것이 아니라 재사용을 위해서 마지막 요소를 popLast() 하고 부모 노드로 돌아가서 재귀를 이용해야 한다. [popLast()와 removeLast()] - 둘 다 배열의 마지막 요소를 제거하지만 pop..
2022.09.05 -
[Swift 알고리즘] 탐색 알고리즘
//공부 기록용 포스팅입니다. 틀린 부분이 있을 경우 댓글로 알려주시면 감사합니다! 😎 1. 깊이 우선 탐색(DFS: Depth-First-Search) 그래프 완전 탐색 재귀함수로 구현 스택 자료구조 이용 깊이 우선 탐색은 그래프 완전 탐색 기법 중 하나 그래프의 시작 노드에서 출발하여 탐색할 한쪽 분기를 정하여 최대 깊이까지 탐색을 마친 후 다른 쪽 분기로 이동하여 다시 탐색 수행 ⇒ 자식 노드부터 탐색 재귀 함수로 구현, 스택 자료구조를 이용 처음 탐색 노드의 어떤 인접 노드부터 탐색할지에 대한 순서는 상관없음 [깊이 우선 탐색의 원리] 한 번 방문한 노드를 다시 방문하면 안 된다. 노드 방문 여부를 체크할 배열이 필요하다. 그래프를 인접 리스트로 표현 DFS는 후입 선출의 특성을 가짐 → 스택 o..
2022.09.02 -
[Swift 코테] 백준 11051 이항 계수2
스위프트의 경우 pascal(n: n-1, k: k-1) + pascal(n: n-1, k: k)를 DP를 이용해서 풀면 시간초과의 문제가 생긴다. -> 시간초과를 해결하기 위해서는 2차원 배열에 값들을 저장해서 c[n-1][k-1] + c[n-1][k]를 계산해서 문제를 풀 수 있다. 1. 먼저 이항계수의 성질은 nCk = n-1Ck-1 + n-1Ck 2. nC0 = 1, nCn = 1 을 사용해서 문제를 풀 수 있다. 위의 2가지를 사용한다면 풀 수 있는 문제이지만, 한 번에 풀지 못해 다른 블로그를 참고했을 때 이해 되지 않던 점을 정리해보았다. 1. 범위를 k가 n을 초과할 수 없는 이유 - 이항계수 값을 저장할 배열은 [N+1][N+1]개의 사각형 형태의 이차원 배열로 저장했지만 당연히 이항계수..
2022.08.03 -
[Swift 코테] 백준 2981검문 (swift 런타임 에러)
주어진 수의 최대공약수의 약수를 구하는 문제이다. - 주어진 수의 규칙을 찾아내는 것이 중요하다. - 나머지(r)가 모두 같게 되는 M을 구하는 문제 1. 모든 수에서 r을 빼면 M으로 나눠진다. 2. 가장 큰 M을 구하고(최대공약수), M의 약수를 구하면 된다. - 사실 이 문제를 풀면서 런타임 에러가 많이 발생했는데 이유를 찾을 수 있었다. - 차(gap: input[1] - input [0])를 새로운 정렬에 저장해서 gcf를 구했는데, 이때 변수의 범위를 잘 못 지정해서 런타임 에러가 발생했다. for i in 1..
2022.08.02