본문 바로가기

전체 글

(19)
[Swift : 알고리즘] 순열과 조합 (Permutation and Combination) 코딩 테스트에서 빈번하게 사용되는 순열과 조합 알고리즘에 대해 공부해보자. 직접적으로 몇 개의 조합을 찾아라!라는 문제보다는 순열 혹은 조합을 적절히 사용해서 경우의 수를 찾는 문제들이 빈번히 출제되므로 대비해두는 것이 좋다. 1. 순열 (Permutation) '서로 다른 n 개의 원소 중에서 r 개를 골라 순서를 구분하여 나열한 경우의 수'를 의미한다. 순열은 nPr 로 표현한다. 순열의 개수를 구하는 공식은 n! / (n-r)! 이다. 순열에서 중요한 점은 순서를 구분한다는 점이다. 예를 들어 [1, 2, 3, 4]의 배열에서 순서를 구분하여 3가지 원소를 경우의 수를 나열하면 아래와 같이 24개의 경우의 수가 나온다. [1, 2, 3] [1, 2, 4] [1, 3, 2] //[1, 2, 3] 과 ..
[Swift] 순환참조에 대해 알아보자 (feat. strong, weak, unowned reference) 순환 참조란 두 가지 이상의 객체가 서로에 대한 Strong Reference(강한 참조) 상태를 가지고 있을 때 발생하며, 순환 참조가 발생하게 되면 서로에 대한 참조가 해제되지 않기 때문에 메모리에서 유지되며 이로 인해 메모리 릭이 발생하게 된다. 이러한 순환 참조를 해결하기 위해 weak, unowned reference가 사용된다. ☞ 클로저에서의 weak self 1. 하나의 인스턴스에 대한 참조 먼저, 다음과 같이 Person 클래스를 만들어 보자. import UIKit class Person { let name: String init(name: String) { self.name = name print("\(name) is being initialized") } deinit { print(..
[Swift] 클로저에서의 weak self 에 대해 알아보자 클로저를 사용하면서 weak self를 사용해본 경험이 있거나, weak self를 사용하는 코드를 본 적이 있을 것이다. weak self 를 왜 사용해야 하고, 언제 사용해야 하는지에 대해 알아보자. 1. weak self를 왜 사용하는가? Weak reference(약한 참조)는 Retain Cycle(순환 참조)로 인한 메모리 릭을 벗어나기 위해 사용한다. Swift가 Automatic Reference Counting(ARC)를 사용하면서 대두분의 참조 문제를 해결해주지만, 두 가지 이상의 객체가 서로에 대한 Strong Refrence(강한 참조) 상태를 가지고 있다면 Retain Cycle이 발생하게 되며 이때, 메모리 릭이 발생한다. 메모리 릭이 발생한다면, 앱에서 Out Of Memory..
[Swift] 코코아팟(CocoaPods) 라이브러리를 만들어 보자 직접 라이브러리를 만들어 코코아팟(cocoapods)으로 배포하는 방법에 관한 포스트입니다. 1. 라이브러리 프로젝트 생성 먼저, 터미널을 열고 프로젝트를 생성하고 싶은 위치로 이동합니다. 그 후 터미널에 $ pod lib create [프로젝트명] 을 입력하여 프로젝트를 생성해줍니다. 그후 터미널에서 보여지는 몇가지 질문에 답을 해주면 됩니다. * 이 부분은 iOS, macOS중 어느 라이브러리를 만드냐에 따라 질문이 달라집니다. 먼저, iOS용 라이브러리를 만들 경우에는 다음의 질문에 자신의 상황에 맞게 답변해주시면 됩니다. - 어떤 플랫폼으로 만들꺼니? - 어떤 언어 사용할거니? - 라이브러리에 데모용 앱 넣을꺼니? - 어떤 테스팅 프레임워크 사용할꺼니? - view기반 테스팅 할꺼니? macOS용..
[Python : 알고리즘] Queue 란? Queue(큐)란 먼저 들어온 데이터가 먼저 나가는 '선입선출'의 자료구조 입니다. Stack은 한쪽이 막힌 원통이였다면 Queue는 양쪽이 모두 뚫린 원통입니다. 위의 그림처럼 양쪽이 모두 뚫린 원통에서 파란색, 초록색 공을 오른쪽에서 집어넣고, 왼쪽에서 공을 뺄때 가장 먼저 넣었던 파란색 공이 나오게 됩니다. 이러한 형태를 Queue라고 하며, 공을 넣는 과정을 push, 공을 빼내는 과정을 pop이라고 합니다. Queue에서는 push할때 원통의 오른쪽에서 집어넣는다, pop할때는 원통의 왼쪽에서 빼낸다 라고 생각하면 이해하기 쉽습니다. 파이썬에서는 'deque' 라이브러리를 사용해서 간단하게 Queue를 구현할 수 있으며, deque의 append()를 사용하여 Queue 자료구조의 push, d..
[Python : 알고리즘] Stack 이란? Stack(스택)이란 나중에 들어온 데이터가 먼저 나가는 '후입선출'의 자료구조입니다. 한쪽이 막혀있는 원통이라고 생각하시면 이해하기 쉽습니다. 위의 그림처럼 아래가 막혀있는 원통에서 파란색, 초록색 공을 순서대로 넣은 후, 공을 빼게되면 가장 마지막에 넣은 초록색 공이 먼저 빠지게 됩니다. 이러한 형태를 stack 이라고 하며, 공을 넣는 과정을 push, 공을 빼는 과정을 pop 이라고 합니다. 파이썬에서는 Stack을 별도로 구현할 필요 없이 파이썬에서 제공하는 list자료구조를 사용하여 stack을 사용할 수 있습니다. list의 append()를 사용하여 list의 마지막에 값을 추가해 주는 것이 stack 자료구조의 push, list의 pop()을 사용하여 list의 마지막 값을 빼주는 것이..
[Python : 알고리즘] 프로그래머스 #42626 더 맵게 문제 바로가기 코딩테스트 연습 - 더 맵게 매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같�� programmers.co.kr 파이썬 풀이입니다. def solution(scoville, K): answer = 0 heap = [] for scov in scoville: heapq.heappush(heap, scov) while heap[0] < K: if len(heap) < 2: if heap[0] < K: return -1 break first_min = heap[0] heapq.heappop(heap) second_min = heap[0] heapq..
[Python : 알고리즘] 프로그래머스 #42576 완주하지 못한 선수 문제 바로가기 코딩테스트 연습 - 완주하지 못한 선수 수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수�� programmers.co.kr 파이썬 풀이입니다. def solution(participant, completion): participant.sort() completion.sort() for i in range(len(completion)): if participant[i] != completion[i]: return participant[i] return participant[i+1] 먼저, 참가자 배열과 완주자 배열을 인덱스로 비교하기 위해서 두 배..