본문 바로가기

전체 글

(85)
LeetCode: Plus One 문제설명 10진수로 구성된 길이가 1 이상인 배열이 주어졌을 때 이 배열은 하나의 정수로 표현된다. 이 정수의 값을 1을 더한 정수를 배열로 반환하라 최상위 수(most significant digit)는 배열의 가장 앞에 위치한다. 이 정수는 0이 아닌 경우를 제외하고, 0으로 시작하지 않는다. 문제풀이 결과를 저장할 배열을 선언한다. 이 배열에 값을 거꾸로 저장하고 뒤집어서 반환한다. 배열을 순회하며 각 위치의 값을 나타내는 val 변수와 자리 옮김 수 carry를 선언한다. val 변수는 carry값과 함께 더해져 10 이상일 수도 있다. 결과 배열에 넣기 전에 10으로 나눈 나머지 값을 넣는다. carry 변수는 10으로 나눈 몫이다. 999에 1을 더하여 1000이 되는 것처럼, 자리수가 하나 ..
LeetCode: Intersection of Two Arrays II 문제설명 두 정수 배열, nums1와 nums2가 주어졌을 때, 두 배열이 서로 교집합이 되는 부분을 반환하라. 결과 배열의 순서는 상관이 없다. 문제풀이 func intersect(_ nums1: [Int], _ nums2: [Int]) -> [Int] { guard nums1.count > 0 && nums2.count > 0 else { return [] } var nums1Dict = [Int: Int]() var result = [Int]() for num1 in nums1 { var added = 1 if let val = nums1Dict[num1] { added += val } nums1Dict.updateValue(added, forKey: num1) } for num2 in nums2 ..
LeetCode: Single Number 문제설명 크기가 1이상인 정수형 배열이 주어졌을 때, 하나의 원소를 제외하고 나머지 원소는 2번씩 나타난다. 한 번만 나타나는 원소를 찾아서 반환하라. 문제풀이 XOR 연산을 하면 중복된 값이 소거된다. O(n) 시간복잡도를 갖으며 O(1) 공간 복잡도를 갖도록 풀이할 수 있다. func singleNumber(_ nums: [Int]) -> Int { var buf = 0 for num in nums { buf = buf ^ num } return buf } print(singleNumber([4,5,1,5,1])) // 4 print(singleNumber([2,2,1])) // 1 print(singleNumber([1])) // 1
LeetCode: Contains Duplicate 문제설명 정수 배열이 주어졌을 때, 중복된 값이 존재한다면 true를 반환하고 중복된 값이 없다면 false를 반환하라. 문제풀이 값을 저장하고 빠르게 찾을 수 있는 자료구조인 Set을 사용한다. 배열을 한 번만 순회하여 값이 존재한다면 바로 true를 반환한다. 값이 없다면 set에 넣어서 다음 숫자의 검사에 사용될 수 있도록한다. func containsDuplicate(_ nums: [Int]) -> Bool { var set = Set() for num in nums { if set.contains(num) { return true } else { set.insert(num) } } return false } print(containsDuplicate([1,2,3,1])) // true print..
LeetCode: Rotate Array 문제설명 정수형 배열이 주어졌을 때, 배열의 오른쪽으로 k 만큼의 항목 까지만 회전하라 문제풀이 하나씩 꺼내어 앞으로 추가하기 배열을 linked list로 구현했을 때 적합하다. // 1. Pop and Push one by one func rotate_popAndPush(_ nums: inout [Int], _ k: Int) { for _ in 0.. 1 else { return } let k2 = k%nums.count if k2 == 0 { return } // reverse left section let leftSectionLastIndex = nums.count-k2-1 reverse(&nums, startIdx: 0, endIdx: leftSectionLastIndex) // reverse ..
HIG: Visual Design, Branding 브랜딩(Branding) 성공적인 브랜딩은 여러분의 앱에 브랜드를 추가하는 것 이상이 필요하다. 성공적인 앱은 스마트한 폰트, 컬러, 이미지를 결정함으로서 독창적인 브랜드 정체성이 표현된다. 사용자에게 여러분의 앱의 문맥을 전달하기 위해 충분한 브랜딩을 제공하라. 하지만 과도한 브랜딩은 혼란을 일으킬 수 있다는 점을 주의하라. 정제되며 겸손한 브랜딩을 첨가하라 사용자는 앱을 즐기기 위해 사용하며, 정보를 얻거나, 일을 완수하기 위해 사용하지 광고를 보기 위해 앱을 사용하지 않는다. 가장 최고의 경험을 위해서, 앱 디자인을 통해 여러분의 브랜드를 통합시켜라 여러분의 앱 아이콘의 컬러를 인터페이스 전반에 사용하는 것은 좋은 문맥을 제공하는 방법 중 하나다. 브랜딩이 앱 디자인을 해치지 않도록 하라 브랜딩이 ..
LeetCode: Best Time to Buy and Sell Stock II 문제설명 가격이 담긴 배열, prices가 주어졌을 때, prices[i]는 i번째 날의 주식의 가격을 의미한다. 주어진 배열 내에서 주식을 사고 팔 수 있는 최대 수익을 계산하라. 문제풀이 다양한 방법이 있지만, 동적 프로그래밍으로 풀 수 있다. 이전의 주식 가격과 비교하기 위해, 배열의 0번째가 아닌 1번째 부터 순회한다. 이전 주식 가격에 현재 가격을 빼서 수익이 0 이상 일 때, 이전의 수익 값과 더한다. 수익이 0 이하라면, 이전의 수익 값을 그대로 복사한다. 가장 마지막에 계산된 수익 값을 반환한다. func maxProfit(_ prices: [Int]) -> Int { var profits = [0] for i in 1.. 0 { profits.append(profits[i-1] + pro..
Swift Enum의 RawValue 제대로 사용하기 스위프트의 Enum은 다형성을 지원하는 타입이다. Enum의 rawValue를 String으로 사용할 때, 컴파일 시점에 안전하지 못하다. 예를 들어, 다양한 이미지 타입을 모델링하기 위해 다음과 같이 Enum을 정의하자. enum ImageType: String { case .jpg, .gif, .bmp, .unknown } ImageType의 rawValue를 읽어들어 어떤 적절한 값을 반환하는 함수를 정의하자. func toImageType(for type: String) -> String { guard let imageType = ImageType(rawValue: type) else { return "unknown" } switch imgeType { case .jpg : return "jpg ..