All
18 posts
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
<C++/백준 16637> 괄호 추가하기

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

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

Algorithm
<알고리즘 노트 - 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++/백준 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를 조금 경험해본 적이 있었습니다. 그래서 이런 생각이 들었습니다. “잘 모르지만 한번 앱을 개발해보자!” 이런 마음가짐으로 도전을 시작했습니다. 개발 과정 기초가 부족했기 때문에 ‘이게 왜 되지?‘라는 의문도 많이 들지 않았습니다. 그저 처음 기획한 기능을 개발하고 성공적으로 빌드하는 것을 목표로 잡았습니다. 여러 번의 시도 끝에 드디어 원하는 모든 기능을 개발할 수 있었습니다. 앱스토어 출시 준비 앱스토어 출시 가이드라인을 꼼꼼히 살펴보고, 처음부터 리젝을 받지 않…

회고
🧢

2024 TIL (~24.05)

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

TIL