본문 바로가기
반응형

분류 전체보기109

[Algorithm/BOJ] 5014 - 스타트링크 (BFS) Swift 문제풀이: 스타트링크는 총 F층으로 이루어진 고층 건물에 사무실이 있고, 스타트링크가 있는 곳의 위치는 G층이다. 강호가 지금 있는 곳은 S층이고, 이제 엘리베이터를 타고 G층으로 이동하려고 한다. -> 총 F층이 있는 고층 건물에서 S층에서 엘리베이터를 타고 G층으로 이동한다. 보통 엘리베이터에는 어떤 층으로 이동할 수 있는 버튼이 있지만, 강호가 탄 엘리베이터는 버튼이 2개밖에 없다. U버튼은 위로 U층을 가는 버튼, D버튼은 아래로 D층을 가는 버튼이다. (만약, U층 위, 또는 D층 아래에 해당하는 층이 없을 때는, 엘리베이터는 움직이지 않는다) -> 엘리베이터에 U층만큼 올라가는 U버튼과 D층만큼 내려가는 D버튼만 있다. 두 버튼을 몇 번 눌러야 S층에서 G층으로 갈 수 있는지 구하는 것이고 G.. 2021. 2. 23.
[Algorithm/BOJ] 7569 - 토마토 (BFS) Swift 문제풀이: 보관 후 하루가 지나면, 익은 토마토들의 인접한 곳에 있는 익지 않은 토마토들은 익은 토마토의 영향을 받아 익게 된다. 하나의 토마토에 인접한 곳은 위, 아래, 왼쪽, 오른쪽, 앞, 뒤 여섯 방향에 있는 토마토를 의미한다. -> 위, 아래, 왼쪽, 오른쪽, 앞, 뒤 6가지 방향으로 탐색하여 토마토를 익힌다. 토마토를 창고에 보관하는 격자모양의 상자들의 크기와 익은 토마토들과 익지 않은 토마토들의 정보가 주어졌을 때, 며칠이 지나면 토마토들이 모두 익는지, 그 최소 일수를 구하는 프로그램을 작성하라. 단, 상자의 일부 칸에는 토마토가 들어있지 않을 수도 있다. -> 아래의 그림과 같이 상자에는 익지 않은 토마토, 익은 토마토, 빈 칸이 존재하고 3차원 배열을 이용한다. 정수 1은 익은 토마토, .. 2021. 2. 23.
[RxSwift] Observable Observable에 대해서 기록해보겠습니다. 공식문서 (ReactiveX)에서는 Observer는 Observable을 구독(subscribe)한다. 그리고 그 Observer는 Observable에서 방출(emit)하는 item이나 item의 순서(sequence)에 반응한다. 이러한 패턴은 Observable이 객체를 방출하기를 기다리는 동안 차단할 필요가 없기 때문에 동시 작업(concurrent operations)을 수월하게 하지만 대신 Observable이 미래의 어떤 시간에 적절히 반응할 준비가 되어 있는 관찰자(observer)의 형태로 보초(sentry)를 서게 됩니다. Observable 생명 주기 Create Subscribe onNext onCompleted or onError D.. 2021. 2. 16.
[Design Patterns] MVC, MVVM 디자인 패턴 디자인 패턴은 소프트웨어를 설계하면서 자주 발생하는 문제들을 피하기 위해서 재사용이 가능한 해결책이다. 과거의 소프트웨어 개발을 하면서 발견된 규칙을 이후에 재이용하기 좋게 정리한 것이며 프로그래머들 간의 의사소통의 효율성을 높여준다. MVC (Model-View-Controller) Model : 앱에서 사용되는 데이터를 읽고 쓰기 및 데이터 처리를 하고 변경 사항을 controller에 보낸다. (비즈니스 로직) View : 데이터를 화면에 보여주는 역할을 하고 사용자의 입력을 controller로 보낸다. Controller : model과 view 사이에서 다리 역할을 하면서 업데이트시킬 수 있다. 특징: Controller와 View는 1:N 관계이다. Apple MVC 애플의 MV.. 2021. 2. 9.
[Algorithm/BOJ] 18353 - 병사 배치하기 (DP) Swift 문제 풀이: N명의 병사가 무작위로 나열되어 있다. 각 병사는 특정한 값의 전투력을 보유하고 있으며, 병사를 배치할 때는 전투력이 높은 병사가 앞쪽에 오도록 내림차순으로 배치를 하고자 한다. 다시 말해 앞쪽에 있는 병사의 전투력이 항상 뒤쪽에 있는 병사보다 높아야 한다. 또한 배치 과정에서는 특정한 위치에 있는 병사를 열외시키는 방법을 이용한다. 그러면서도 남아있는 병사의 수가 최대가 되도록 하고 싶다. LIS에 대한 개념을 아는 상태라면 쉽게 풀 수 있는 문제이다. 하지만 기본적인 LIS는 오름차순이고 문제에서는 내림차순으로 바꿔 풀어야 한다. 또한, 최대로 남은 병사의 수를 구하는 것이기 때문에 N에서 제일 긴 감소하는 부분 수열의 길이를 빼줘야 한다. 아래 그림은 내림차순인 것을 제외하면 전 포스팅.. 2021. 2. 9.
[Algorithm/BOJ] 11053 - 가장 긴 증가하는 부분 수열 (DP) Swift 문제 풀이: LIS에 대한 개념을 아는 상태라면 쉽게 풀 수 있는 문제이다. 가장 긴 증가하는 부분 수열 (LIS) 하나의 수열이 주어졌을 때, 값들이 증가하는 형태의 가장 긴 부분 수열을 찾는 것이다. 아래의 그림을 그리면서 DP를 어떻게 사용해야 하는지 알 수 있었다. 값이 1인 n개의 요소들을 포함하는 배열을 이용해서 전의 값들을 비교하고 증가되었을 경우에 원래 값에 1을 더해주면서 부분 수열의 최장 길이를 갱신하는 것이다. 코드: import Foundation func solution() -> Int { let n = Int(readLine()!)! let nums = readLine()!.split(separator: " ").map { Int(String($0))! } var dp = [In.. 2021. 2. 9.
[Algorithm/BOJ] 1932 - 정수 삼각형 (DP) Swift 문제 풀이: 맨 위층부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다. -> 문제의 설명을 토대로 아래 그림으로 그려봤다. 빨간색 화살표로 갈 수 있는 경로를 나타내고 파란색 글씨는 배열의 인덱스를 나타낸 것이다. 오른쪽 그림과 같이 인덱스가 0 -> 0,1 1 -> 1,2 의 규칙이 있다. 이 규칙을 이용해서 맨 왼쪽라인의 경우, 맨 오른쪽 라인의 경우 그리고 그 외의 경우에 대해서 값을 위에서 아래로 더하는 방식으로 문제를 접근했다. 그 외의 경우는 맨 왼쪽과 맨 오른쪽 라인의 사이 값은 갈 .. 2021. 2. 7.
[Algorithm/Programmers] 가장 먼 노드 Swift 가장 먼 노드 Level 3 BFS 문제 풀이: 1번 노드에서 가장 멀리 떨어진 노드의 개수를 구하려고 합니다. -> 1번 노드에서 시작한다. 가장 멀리 떨어진 노드란 최단경로로 이동했을 때 간선의 개수가 가장 많은 노드들을 의미합니다. -> 모든 간선의 거리는 동일하다. -> BFS 주어진 간선을 이용해서 노드의 번호와 배열의 인덱스가 같은 배열을 만들어 그래프로 사용하고 노드의 번호와 배열의 인덱스가 같은 배열을 만들어 1번 노드로부터 떨어진 거리를 저장할 용도로 사용한다. 그리고 시작노드를 큐에 넣고 그래프에 연결되고 방문한 적이 없는 다음 노드로 넘어가면서 현재 노드의 거리에 1씩 더해서 다음 노드에 저장한다. 또한 큐에 다음 노드를 넣는다. 큐에 있는 노드를 다 순회할 때까지 반복한다. 코드: .. 2021. 2. 4.
[Algorithm/Programmers] 섬 연결하기 Swift 섬 연결하기 Level 3 문제 풀이: n개의 섬을 최소 비용으로 모든 섬이 통행이 가능하도록 만든다. -> 크루스칼 알고리즘을 이용한다. 🍎 크루스칼 알고리즘 모든 간선에 대하여 정렬을 수행한 뒤에 가장 거리가 짧은 간선부터 집합에 포함시키는 것이다. 1. 비용을 기준으로 오름차순으로 정렬한다. 2. 간선을 차례로 확인하면서 사이클이 발생하는지 확인한다. 2-1. 사이클이 발생하지 않으면 최소 신장 트리에 포함한다. 2-2. 사이클이 발생하면 PASS 3. 모든 간선에 대하여 2번을 반복한다. 비용으로 정렬을 한 배열: [[0, 1, 1], [1, 3, 1], [0, 2, 2], [1, 2, 5], [2, 3, 8]] 같은 사이클인지 확인하기 위해서 Parent 배열을 만듭니다. 집합에 포함되어 있지 .. 2021. 2. 2.
[iOS] Firebase와 Google 로그인 연동하기 Firebase를 이용해서 구글 로그인을 구현하는 방법을 기록해보겠습니다. 아래의 그림을 보면서 먼저 동작 원리를 살펴보자면, 구글에 로그인을 하면 구글 토큰을 받게 되고 구글 사용자임을 증명하는 구글 토큰을 이용해서 파이어베이스 로그인을 시도합니다. 그리고 성공하게 되면 파이어베이스 토큰을 얻습니다. Firebase에서 프로젝트를 만들고 Xcode 프로젝트를 등록했다는 전제하에 시작하겠습니다. Podfile에 아래 두 줄을 추가하고 pod install로 설치해줍니다. pod 'Firebase/Auth' pod 'GoogleSignIn' 그리고 프로젝트에 복사해놨던 GoogleService-Info.plist의 RESERVED_CLIENT_ID를 복사해서 아래의 그림에서 URL Schemes에 붙여줍니.. 2021. 2. 2.
반응형