All
28 posts
(중복순열 3가지 방법) 이모티콘 할인행사 - Swift 문제풀이

(중복순열 3가지 방법) 이모티콘 할인행사 - Swift 문제풀이

문제 링크 카카오 코딩테스트: 이모티콘 할인행사 문제 분석 먼저 이 문제는 중복순열을 활용해야 하는 문제로서, 각 이모티콘마다 rates 적용한 경우의 수에서, 문제에 제시된 두 목표일 때의, (이모티콘 플러스 서비스 가입 수와 이모티콘 매출액) 값을 갱신시켜나가야 하는 문제다. 이 문제의 경우, 중복순열을 여러가지 방법으로 구현해보는 연습을 해보았다. 특히 비트마스킹의 경우, 지금까지 2^n 가지 경우의 수 문제. 즉 2가지 선택을 n번 반복하는 경우에 대해서, 적용하는 문제에만 적용해왔는데, 4^n 의 경우에는 1비트가 아니라 2비트를 사용하기에 이렇게도 코드를 짤 수 있구나. 생각해볼 수 있던 문제였다. 물론, 4진법을 활용해서도 풀어보았다. 구현하기에는 재귀방법이 가장 간단하고 빠르다. 그러나 학습을 위해 다양한 방법으로 문제를 풀어보았다. 내 코드 재귀방법 4진법 활용 비트마스킹 배운 점 리팩토링 코드 튜플 비교를 통해서, 기존의 긴 조건문을 한줄로 바꿈! zip 사용 정…

Algorithm
주난의 난 - Swift 문제풀이

주난의 난 - Swift 문제풀이

문제 링크 백준: 주난의 난 문제 분석 이 문제는 가중치가 같을 때 최단거리 탐색에 사용하는, 일반적인 bfs와는 조금 다르다. 왜냐하면 “0”을 만나면, 해당 queue를 계속 진행해야 하고 그 이외에는 다음 탐색 사이클에서, 새로운 시작점으로 저장해두어야 한다. 즉 queue가 두 개 필요하다. 메인 큐: 현재 탐색하고자 하는 위치 담은 큐 배열. 만약 0이 있으면 그 다음 위치도 계속 탐색하게 됨. temp 큐: 다음 사이클에서 메인 큐 시작점들 담은 배열 (이번 점프에서 쓰러트린 친구들의 위치를 담았다고 볼 수 있다.) 그리고 y, x 좌표를 일차원 배열로 큐에 담기 위해 모듈러 연산을 했다. (ex: 3004 -> y: 3, x: 4) 내 코드 시간 복잡도 전체 맵의 크기가 n, m 일 때 O(n * m * 점프횟수) 출력

Algorithm
표현 가능한 이진트리 - Swift 문제풀이

표현 가능한 이진트리 - Swift 문제풀이

문제 링크 카카오 코딩테스트: 표현 가능한 이진트리 문제 분석 이 문제는 구현 문제 먼저 십진수를 이진수로 변환한다. 포화이진트리의 정점의 개수는 2^k - 1 이다. 만약 이진수의 자릿수가 6이고, 포화이진트리는 7이라면, 1개의 0을 이진수 문자열에 붙여준다. 포화이진트리를 보면, 루트노드는 항상 왼쪽 서브트리의 루트노드와 오른쪽 서브트리의 루트노드의 딱 중간이다. 그렇기 때문에, 재귀함수로 f(start, end) 이분탐색을 구현한다. 만약 101 처럼 루트노드가 0인데, 자식노드 중에 1인 것이 하나라도 있다면, 그 숫자는 포화이진트리로 표현할 수 없다. 따라서 false를 리턴한다. 내 코드 배운 점 리팩토링 코드 정리

Algorithm
택배 배달과 수거하기 - Swift 문제풀이

택배 배달과 수거하기 - Swift 문제풀이

문제 링크 카카오 코딩테스트: 택배 배달과 수거하기 문제 분석 멀리 있는 집을 먼저 방문하는 것이 이득이기 때문에, 이 문제는 딱 봐도 “그리디다!”를 떠올렸다. 그러나, 스택을 쓰는 것까지는 도달하지 못했다. 배달 및 수거할 택배 상자가 남은 가장 먼 집부터 택배를 배달 및 수거합니다. 트럭이 물류창고에서 출발해 가장 먼 집으로 이동할 때는 배달만 하고, 다시 물류창고로 돌아올 때는 수거만 합니다. 트럭이 물류창고에서 출발할 때 항상 택배를 최대 개수만큼 배달하고, 물류창고로 돌아갈 때 최대 개수만큼 수거합니다. 집 번호와 해당 집에 배달할 택배 개수를 집 번호가 작은 순서대로 배달 스택에 담습니다. 집 번호와 해당 집에 수거할 빈 택배 개수를 집 번호가 작은 순서대로 스택에 담습니다. 배달 스택에서 가장 위에 위치한 원소의 집 번호와 수거 스택에서 가장 위에 위치한 원소의 집 번호를 비교해 큰 값의 두 배만큼 answer에 더합니다. 이 때 두 배를 더하는 이유는 트럭이 물류창…

Algorithm
개인정보 수집 유효기간 - Swift 문제풀이

개인정보 수집 유효기간 - Swift 문제풀이

문제 링크 카카오 코딩테스트: 개인정보 수집 유효기간 문제 분석 숫자를 년,월,일로 바꾸고 [String] 배열을 순회하면서 유효기간을 계산한 뒤, 만료일과 현재 날짜를 비교하면 되는 문제라고 생각했다. 이 때 월, 일이 각각 오버플로우/언더플로우 되는 상황을 주의해야 한다. 비교는 년도 > 월 > 일 순서로 진행했다. 내 코드 그러나, 월, 일을 비교하고 오버/언더플로우를 처리하는 과정은 조금 복잡하고 실수할 수 있는 영역이기 때문에, 년도, 월을 모두 일로 변환하여 푸는 것으로 코드를 개선하였다. (이 문제의 조건 중 모든 달은 28일까지 있다는 조건 사용) 또한, 일수로 변환하는 것은 따로 함수로 뺐다. 이렇게 하면 코드의 가독성을 증가시키고, 역할 분리, 재사용 할 수 있게 된다. 배운 점 년도, 월, 일을 각각 숫자로 변환하고 각각 비교해야 한다는 생각 때문에 시간이 꽤 걸렸다. 이렇게 ‘일’의 제한이 있는 간단한 문제의 경우, “년도, 월을 모두 일로 변환 시켜 계산” …

Algorithm
미로 탈출 명령어 - Swift 문제풀이

미로 탈출 명령어 - Swift 문제풀이

문제 링크 카카오 코딩테스트: 미로 탈출 명령어 문제 분석 미로 탈출 조건 격자 바깥으로 나갈 수 없다. (x, y)부터 (r, c) 까지 이동거리가 k여야 한다. 같은 격자를 두 번 이상 방문해도 된다. 탈출 경로(문자열)가 사전 순으로 가장 빠른 경로로 탈출해야 한다.예를들어 탈출 경로가 (lldud, dllrl) 가 있으면, dllrl 가 정답이다. 만약 탈출할 수 없는 경우 “impossible” 를 출력한다. 내 코드 가장 직관적인 방법 사전 순으로 가장 빠른 방향부터 선택하도록 dx, dy를 놓고 이동 횟수가 k가 되면 return (이 때까지의 커멘드를 정답 후보에 넣는다.) 모든 탐색을 마친 뒤 정답 후보에서 사전순으로 가장 빠른 문자열을 고른다. 그러나 이 코드는 모든 방향 (4 방향)을 최대 k번 탐색하는 것을 반복해야 한다. 따라서 시간 복잡도는 O(4^k) 이며, k는 2,500 으로 시간초과가 날 수 있다. 따라서, 이 코드까지 작성 오기 전에 미리 ‘아, …

Algorithm
유기농 배추

유기농 배추

문제 링크 백준 1012: 유기농 배추 문제 분석 배추밭에서 연결된 배추 그룹의 개수를 구하는 문제 각 연결된 그룹마다 지렁이 1마리씩 필요 상하좌우로 인접한 배추들은 같은 그룹 => **Connected Components 개수 구하기 문제! 각 배추에서 시작해서 연결된 모든 배추를 탐색하면 되는 문제로, 이 때 주의할 점은 한 번 방문한 배추는 다시 방문하지 않아야 함. 이 문제는 DFS, BFS 모두 가능하나, 최단 거리가 아닌 ‘연결성만 확인하면 되는’ 문제로 DFS 가 적합함. 각 칸을 최대 한 번씩은 방문하므로, O(M x N)의 시간복잡도를 가짐. (배추가 k개라고 해도, 전체 격자를 확인해야 함.) 최대 50x50 이므로 스택 오버플로우 위험 낮음 배운 점 코딩테스트 문제를 풀 때는 최대한 전역변수를 사용해서, 간단하게 풀려고 했으나 Swift로 풀면 위와 같은 문제가 빈번하게 발생함. 처음 코드 cnt 초기화를 누락, 매개변수를 누락하거나, print 위치를 잘못설…

Algorithm
Balanced Binary Tree

Balanced Binary Tree

Problem Explanation What is a Height-Balanced Binary Tree? A height-balanced binary tree is one where for every node, the heights of its left and right subtrees differ by at most 1. Think of it like this. Imagine you’re building a tree structure, and you want it to be “stable” - not too lopsided in any direction. A balanced tree ensures that no branch is significantly longer than others. Key concept: Height of a tree Height = the longest path from that node to a left Empty tree has height 0 Sin…

Algorithm
Valid Anagram

Valid Anagram

Problem First Solution using a Dictionary Approach First, the function checks if the lengths of the two strings s and t are equal. if not, the fucntion returns false as the two strings cannot be anagrams if they have diffrent lengths. Then, the function creates an empty dictionary to store the frequency of each character in s. it loops through every character in s and increements the frequency of the character in the dictionary by 1. Next, the function loops through every character in t. For ea…

Algorithm
Invert Binary Tree

Invert Binary Tree

Problem I need to invert a binary tree by swapping the left and right children of every node. From the examples, I can see that: Each node’s left and right children are swapped This happens recursively for all nodes in the tree The root remains the same, but its entire structure is mirrored Time Complexity: O(n) Recursive: O(h) where h is the height of the tree Iterative: O(w) where w is themaximum width of the tree My Code This problem can be solved using like a BFS.

Algorithm
Valid Palindrome

Valid Palindrome

Question Today problem is 125_Valid Palindrome A phrase is a palindrome if, after converting all uppercase letters into lowercase letters and removing all non-alphanumeric characters, it reads the same forward and backward. Alphanumeric characters include letters and numbers. Given a string , return if it is a palindrome, or otherwise. Example 1: Input: s = “A man, a plan, a canal: Panama” Output: true Explanation: “amanaplanacanalpanama” is a palindrome. Example 2: Input: s = “race a car” Ou…

Algorithm
Swift Concurrency - Task 알아보기 (2)

Swift Concurrency - Task 알아보기 (2)

--- 핵심만 일단 정리하였다. Delaying an asynchronous Swift Task 사용 예제 언제 사용할까? 사용자가 무언가를 검색할 때, debouncing 을 주고, 현재까지 입력한 텍스트로 일정 시간 두었을 때? 검색 로직이 실행되게끔 하기! -> 바로 검색하게 하면, 매 텍스트마다 호출이 되기 때문. 로딩 화면을 보여줄 때! - 바로 로딩화면을 보여주지 말고, 데이터를 가져오는 시간이 일정 시간이 걸릴때부터 보여주는 것이 사용자 입장에서 더 좋음! 이때, delay Task를 사용하자. 가장 간단한 방법은 위에서 설명한 Task.sleep(nanosecond: ) 를 사용하는 방법 (이 때 await를 사용해야 함) 참고로 위 코드는 뷰컨을 빠르게 왔다갔다 하면 loading Task가 중복으로 실행되거나, 뷰를 떠났는데도 백그라운드에서 실행이 될 수 있으므로, viewWillDisAppear 에서 Task를 cancel 하는 작업이 필요하다. 간단하게 작업에…

Swift
Swift Concurrency - Task 알아보기 (1)

Swift Concurrency - Task 알아보기 (1)

본 글에서는 Swift Concurrency를 이번에 한번 제대로 배우고, 실제 프로젝트에서 사용하는 것을 목표로 한다. 최대한 Swift Concurrency를 내가 이해하기 쉽게 정리해보았다. 이러한 개념을 사용해서, 추후 프로젝트에서 정확한 방법으로 다루기 위해 정리한다. 1. Task의 역할 “act as a bridge between our synchronous, main thread-bound UI code, and any background operations” Task는 동기적인 UI 코드와 백그라운드 작업 사이의 다리 역할 2. 기존 방식과 차이점 “there are no self captures, no DispatchQueue.main.async calls, no tokens or cancellables that need to be retained” 전통적인 비동기 처리에서 필요했던 것들이 모두 불필요하다! DispatchQueue.main.async에서는 sel…

Swift
<알고리즘 노트 - LeetCode>

<알고리즘 노트 - LeetCode>

Merge Two Sorted Lists 1-1. 접근법 (Iterative) 더미 노드를 사용해서 결과 리스트를 구성하면서 두 리스트를 순회하기 더미노드를 만들어 시작점 설정 두 리스트의 현재 노드 값을 비교 더 작은 값을 결과 리스트에 연결 해당 포인터를 다음으로 이동 한 리스트가 끝나면 나머지를 모두 연결 1-2. Recursive 접근법 각 단계에서 더 작은 노드를 선택하고 나머지는 재귀 호출로 처리 Base Case: 한 리스트가 null이면 다른 리스트 반환 Recursive Case: 더 작은 노드의 next를 재귀 호출 결과로 설정 Time-Complexity O(m + n) 두 리스트의 모든 노드를 한 번씩 방문 Best Time to Buy and Sell Stock My approach Brute Force. My code has a time complexity of O(n^2) because I am using nested loops - for each sta…

Algorithm
<C++/백준 16637> 괄호 추가하기

<C++/백준 16637> 괄호 추가하기

<C++/백준 16637> 괄호 추가하기 1. 누적값 + 방향 결정 지금까지의 계산 결과를 가지고 다음에 어떤 연산을 할지 결정! -> 형태로 구현 2. 매 시점 2가지 선택 괄호 없이 그냥 계산 다음 두 수를 묶어서 계산 (인덱스 주의) 코드 수도코드 문제 해결 접근법 “누적값 + 선택” 패턴 인식하기 형태 떠올리기 매 위치에서 가능한 선택지 정리 재귀로 모든 경우 탐색 비슷한 문제 수식 계산 + 괄호 추가/삭제 매 시점 2가지 이상 선택지 이전 결과로 다음 선택하는 경우 정답 코드 1. 누적값 + 방향 결정 2. 매 시점 2가지 선택 코드 수도코드 문제 해결 접근법 비슷한 문제 정답 코드

Algorithm
<C++/백준 1992> 쿼드트리

<C++/백준 1992> 쿼드트리

코드 해당 문제의 솔루션은 주석과 함께 정리해보았다. 해당 문제를 보고, 내가 특히 부족하다고 느낀 점은. 크게 두 가지다. 이 문제를 이해하는 데 꽤 시간이 걸렸다는 것. ( 이 시간을 단축시켜야 한다. ) 문제를 이해하고 규칙도 파악했으나, 그것을 코드로 표현하지 못했다. ( 재귀 함수를 구현하는 데 아직 경험이 부족해서 이다. ) 해당 문제를 보면, ‘재귀 함수’로 풀어야지가 떠올라야 한다. 큰 문제를 동일한 형태의 작은 문제로 나눌 수 있다는 점이 재귀의 특징이다. 파라미터를 변화시키면서, (4등분으로 나누는 패턴을 반복시킬 수 있다.) 재귀 함수 구현력을 향상 시키고, 해당 문제와 비슷한 문제를 반복 연습하자! 그러면 비슷한 문제가 와도 어렵지 않게 해결할 수 있을 것이다. 코드

Algorithm
<코드트리/C++> 만나는 그 순간

<코드트리/C++> 만나는 그 순간

약 10일 전 쯤 내가 풀었던 문제 같은데, 다시 보니까 못풀고 있어서, 여기에 다시 정리해보았다. [알고리즘] 만나는 그 순간 문제 해결 방향 A와 B 각각의 매 초별 위치를 배열에 기록 시간을 1초부터 검사하면서, A와 B의 위치가 일치하는 최초의 시점을 찾기. 주의할 점 전체 이동 시간이 큰 배열을 필요로 할 수 있다. (MAX_T = 1000000) A와 B의 시작 위치는 0으로 초기화되어야 한다. 만약 움직임이 끝날 때까지 만나지 않으면 -1을 출력해야 한다. 코드 내 코드 해설 코드 ⚡️ 시간복잡도 이동 기록: O(total_time) 만나는 시점 탐색: O(total_time) 전체 시간복잡도: O(total_time) 문제 해결 방향 주의할 점 코드 내 코드 해설 코드 ⚡️ 시간복잡도

Algorithm
<알고리즘 노트> dx, dy 테크닉 기법

<알고리즘 노트> dx, dy 테크닉 기법

dx, dy 테크닉 기법 은 격자 문제나 방향 시뮬레이션 문제를 풀 때 유용하게 사용되는 기법. 방향 전환, 인덱스 고려 등을 추가로 신경 써야 하는 경우도 있다. 기본 개념 방향이 , 배열의 인덱스가 됨. 문제를 보면 먼저 격자나 그래프를 간단히 그림으로 그려보고, 각 방향에 맞는 x, y 증감값을 설정. 예시 문제 풀이 순서 , 배열을 먼저 작성. 문제의 요구사항에 맞게 방향과 이동을 구현. 방향 전환 방향 전환은 변수로 관리. 반시계 방향 90도 회전 시계 방향 90도 회전 격자 문제에서의 주의점 , 테크닉 활용하기. 인덱스가 0부터 시작인지, 1부터 시작인지 확인. 격자에서의 는 2차원 배열의 와 동일. 각각을 행(row, r), **열(column, c)**로 생각. 그림을 그려 , 를 구성. 예시: 동서남북 인덱스 범위 오류 주의! 가 격자 안에 있는지 확인하는 bool 함수 설계. 조건문에서 함수 순서를 신경 쓰기: 범위 확인 함수 예시

Algorithm
<알고리즘 노트> Carry 피하기 2

<알고리즘 노트> Carry 피하기 2

알고리즘 노트: Carry 피하기 2 문제 설명 문제 유형: 완전탐색 n개의 숫자 중 서로 다른 3개의 숫자를 선택하여, carry가 발생하지 않으면서 나올 수 있는 숫자 합의 최댓값을 계산하는 프로그램을 작성합니다. Carry란? 각 자리수를 더했을 때 10을 넘어가는 경우 carry가 발생합니다. 예를 들어: 3 + 6 = 9 (carry 발생하지 않음) 5 + 7 = 12 (carry 발생) 입력 형식 첫 번째 줄에 n이 주어집니다. 두 번째 줄부터 n개의 줄에 숫자가 주어집니다. 3 ≤ n ≤ 20 1 ≤ 숫자의 범위 ≤ 10,000 출력 형식 carry가 발생하지 않으면서 3개의 숫자의 합의 최댓값을 출력합니다. 모든 숫자쌍에서 carry가 발생할 경우 을 출력합니다. 예제 입력 출력 설명 522, 6, 7311을 선택하면, 각 자리수의 합에서 carry가 발생하지 않으므로 합은 7839입니다. 내 풀이 코드 풀이 설명 숫자를 으로 변환하여 각 자리수를 비교. 세 숫자의 …

Algorithm

UI/UX 기반 개인정보보호 실무

개인정보 교육 보고서 1. 개인정보 보호의 어려움 Quiz 1 개인정보 약관: X 개인정보 처리 방침: O [개인정보보호법] 위치정보 이용약관: O [위치정보법] Quiz 2 개인정보 필수 수집항목은 고객의 사전 동의 없이 수집 가능하다. 답: O 개정된 개인정보보호법에 따르면, 서비스 제공에 필요한 필수 개인정보는 고객의 사전 동의 없이도 수집할 수 있습니다. 단, 개인정보 처리 방침에 이 사실을 고지해야 합니다. Quiz 3 1년 동안 미접속한 휴면회원은 별도로 관리해야 한다. 답: X 2. 개인정보 해당 사례 지하철 이용 정보 블랙박스 영상 주민등록번호 연계정보(CI) 3. 개인신용정보 [신용정보법] 거래 상대방의 신용도를 판단하는 데 필요한 개인에 관한 정보로, 예를 들면 연락처나 금융거래 기록 등이 있습니다. 개인정보보호법과 신용정보법이 상충할 경우, 신용정보법이 우선 적용됩니다. Quiz 회사 건물 출입기록은 개인정보에 해당하는가? 답: O 출입 기록은 개인을 식별할 수…

UI/UX
🧪

Test Driven Development (테스트 주도 개발)

테스트 주도 개발 테스트 사용자에게 제공되기 전에 소프트웨어의 품질, 성능 등을 확립하기 위한 절차 수동 테스트의 비효율성 제품이 출시될 때 실제로 필요한 코드가 아닌 코드를 만들어야 하는 경우. 자동화된 테스트 소프트웨어로 다른 소프트웨어를 자동화 테스트 주도 개발 (Test Driven Development) 테스트 코드를 먼저 만들어놓고, 테스트하기 쉬운 소프트웨어 설계 예를 들어 개발자가 아닌 기획자도 경우의 수, 요구사항을 먼저 다 정의해놓고 시작. 필요한 모델을 먼저 구상 거기에 필요한 것을 하나씩 채워가며 ‘테스트’ 특징 단, 높은 응집력과 낮은 결합도를 가진 컴포넌트로 구성된 소프트웨어를 구축하게 됨 요구사항에 대한 이해도 향상에 도움이 됨 구현이 완료된 후 테스트를 작성하는 것보다 먼저 작성하는 것이 더 좋은데, 해당 동작에 대한 구현이 없을 때 테스트가 실패하는 것을 보면 향후 회귀를 잡아낼 수 있다는 것을 신뢰할 수 있기 때문 구현 후 테스트를 시작하면, 내가 …

TIL
🤦🏻

Core ML

애플의 머신러닝 애플의 머신러닝은 통번역, 이미지 인식 등 상당히 강력한 기능을 제공하고 있다. 특징은, 사용자의 기기 안에서만 실행되기 때문에 네트워크에 연결할 필요가 없다는 것이다. 애플의 CoreML을 사용하여, 기존 앱에 쉽게 날개를 달아줄 수 있을 것이다. CoreML 이라는 형식으로 저장된 머신 러닝 모델을 iOS 프로젝트에 추가해보자. ML 위 사이트에서 CoreML 모델을 다운받을 수 있다. 이번에는 이미지 인식기능과 자연어 언어감지 기능을 사용해보겠다. 일반적으로 .mlmodel 파일은 용량이 크기 때문에, gitignore에 추가하는 것이 일반적이다. 이미지 인식 mlmodel을 프로젝트에 추가했다면, 이제 필요한 라이브러리를 import 한다. SqueezeNet 라는 모델을 사용했으며, 코드는 다음과 같다. 모델 파일을 로드하고 MLModelConfiguration를 통해 모델을 설정한다. SqueezeNet 는 이미 제공하는 (학습이 완료된) 이미지 분류 모…

iOS
🤦🏻

얼굴인식 사용하기

얼굴 인식 기능 실습 얼굴 인식 기능은 Vision framework 를 사용한다. vision Framework 여러 명의 얼굴을 인식할 수 있는 이미지를 준비한 뒤, 이미지를 분석할 analyzeImage 함수를 정의한다 얼굴 인식 VNImageRequestHandler An object that processes one or more image analysis requests pertaining to a single image. VNImageRequestHandler에는 core graphics Image, 줄여서 cgImage라는 싱글 이미지를 파라미터로 받는다. 그렇기 때문에 UIImage를 CGImage로 변환하여 VNImageRequestHandler를 초기화 한다. 이를 통해 단일 이미지를 Vision 프레임워크에 요청을 수행할 수 있는 핸들러를 인스턴스화할 수 있다. 그리고 이미지 안에 있는 페이스를 찾기 위한 요청(얼굴인식)인 VNDetectFaceRectangl…

iOS
📀

SwiftUI + UIKit

SwiftUI와 UIKit 같이 사용하기 아직 레거시 코드가 많기 때문에, UIkit 과 SwiftUI 를 같이 사용하는 경우가 있다. SwiftUI with UIKit SwiftUI 프로젝트에 UIKit 를 같이 사용하는 방법에 대해서 알아보겠다. 예를들어 Pdf 파일을 볼 수 있는 PDFKit의 PDFView 는 UIKit으로 되어있는데, 이걸 SwiftUI 프로젝트에서 사용하려면, UIViewRepresentable 프로토콜을 사용하면 된다. 그리고 그 ViewMe 를 SwiftUI 에 추가하면 끝이다. 이번에는 WebKit에 있는, WKWebView() 를 나타내기 위해서 UIViewRepresentable를 사용해보겠다. updateUIView 에서 load(URLRequest) 까지 다 하고나서, SwiftUI 에서는 WebView를 url과 함께 호출하면 된다. UIViewRepresentableContext Contextual information about the…

iOS
🎹

Youtube API, AVFoundation, SharePlay 사용

개요 지난 AVFoundation-시작하기 포스트에 이어, 직접 앱을 개발해보기로 했다. 내가 개발하기로 한 앱의 초기 요구사항은 다음과 같다. 앱 초기 디자인은 Youtube Music App 을 클론 미디어 콘텐츠는 Youtube Search API 를 사용 AVFoundation, AVKit 등을 사용하여 미디어 플레이어 앱 개발하기 [추가] WWDC 2023에 공개된 Share Play의 기능 추가해보기 문제 해결 과정 Draggable Sheet View 구현 과정 How to create Draggable Sheet View? Youtube Music App 의 경우, Draggable Sheet View 가 존재한다. 그래서 처음에는 일반적인 sheet 모디파이어로는 구현할 수 없을 것이라 생각하고 DragGesture 를 추가하는 쪽으로 생각했다. 그러나 더욱 간단한 방법으로 시도해보았다. presentationDetants 값에서 sheet view의 최소 높이와 …

iOS
🦁

MapKit - 현재위치를 사용한 경로 탐색 앱 만들기

MapKit 을 사용한 예제 앱 개발 이번엔 최신 코드인 @Observable 매크로를 사용하여 viewModel 을 사용하였습니다. @Observable는 @Published 를 따로 쓰지 않아도 상태 추적이 가능하도록 해주는 매크로입니다. MapViewModel 생성 @Observable 를 사용한 ViewModel 은 View에서 @StateObject가 아닌, @State로 불러올 수 있습니다. 만약 하위 뷰에서 해당 viewModel 을 사용하고자 한다면? 바인딩도 필요없고, environmentObject도 사용하지 않습니다. ContentView 에서 viewModel 을 완전히 소유하고 있기 때문에, 그냥 변수를 전달하면 됩니다. Search Bar 그리고 이제 Navigation Title 과 검색바(searchable)를 추가하였습니다. 그리고 mapStyle 을 사용하기 위해서, viewModel 에 MapStyle 타입의 프로퍼티를 추가하고, mapStyle …

iOS
📱

문장모아 - (생애 첫 프로젝트)

안녕하세요. 이 글은 2023년 10월부터 시작한 첫 개발 경험과 여러 번의 시행착오를 통해 얻은 경험을 담은 회고입니다. 자유롭게 읽어주세요. 프로젝트 시작 배경 2023년 9월, 저는 대학교의 비교과 프로그램(진로탐색학점제)에 참여했습니다. 이는 학생이 흥미를 가진 주제를 자유롭게 탐색하고 활동할 수 있는 기회를 제공하는 프로그램이었습니다. 어떤 활동을 해볼까 고민하던 중, 1학기 때 제대로 배우지는 않았지만 Swift를 조금 경험해본 적이 있었습니다. 그래서 이런 생각이 들었습니다. ”이 영상을 보고, 독서를 기록하면서 효과적인 기록 방법을 그대로 구현해낸 앱은 왜 없을까?” “앱 개발을 잘 모르지만 한번 앱을 개발해보자!” 이런 마음가짐으로 도전을 시작했습니다. 개발 과정 기초가 부족했기 때문에 ‘이게 왜 되지?‘라는 생각이 많이 들었습니다. 그 때마다 최대한 그 의구심을 파헤치고자 노력하였고, 문서로 기록하는 것을 습관화 했습니다. 덕분에 100장 이상의 보고서와 함께, …

회고
🧢

2024 TIL (~24.05)

2024년 04월 06일 오늘 배운 내용 객체지향, 함수형 프로그래밍의 개념 이해 Swift 함수의 정의와 호출 오버로딩, 오버라이딩 오늘 푼 문제 짝수와 홀수 (프로그래머스) 오늘은 Swift 함수와 더불어 Swift의 언어적 특성에 대해서 기초부터 다시 공부하기 시작했다. ChatGPT에 너무 의존해서는 안된다. ChatGPT가 알려주는 정보가 틀릴 수 있기 때문이다. 나는 그 틀린정보를 구분할 수 있는 능력이 필요하고, 어떤 질문을 해야 좋을지 그 ‘바탕’이 되어줄 것이 필요하다. 좋은 코드를 짜기 위해서는 기본부터 다시 시작해서 배울 필요가 있다고 생각한다. 2024년 04월 07일 오늘 배운 내용 흐름 제어 (조건문, 반복문) 오늘 푼 문제 평균 구하기 (프로그래머스) 두 개 뽑아서 더하기 (프로그래머스) 느낀점 오늘 Swift로 문제를 풀면서 이중 반복문을 구현할 때 조금 헷갈렸다. 스위프트 프로그래밍 책을 다시 보면서 반복문, 흐름 제어 관련해서 다시 한번 꼼꼼히 공부…

TIL