본문 바로가기

Algorithm

(23)
프로그래머스 - 약수의 개수와 덧셈 문제 설명 문제 두 정수 left 와 right 가 매개변수로 주어집니다. left 부터 right 까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요. 제한 사항 1 ≤ left ≤ right ≤ 1,000 입출력 예 left right result 13 17 43 24 27 52 해결 import Foundation func solution(_ left:Int, _ right:Int) -> Int { var result: Int = 0 for n in left...right { let count = (1...n).map{$0}.filter{n%$0 == 0}.count result += count%2..
프로그래머스 - 두 개 뽑아서 더하기 문제 설명 문제 정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요. 제한 사항 numbers의 길이는 2 이상 100 이하입니다. numbers의 모든 수는 0 이상 100 이하입니다. 입출력 예 numbers result [2, 1, 3, 4, 1] [2, 3, 4, 5, 6, 7] [5, 0, 2, 7] [2, 5, 7, 9, 12] 해결 import Foundation func solution(_ numbers:[Int]) -> [Int] { var arr: Set = [] for i in 0..
BST(이진 탐색 트리) - 구현 이전 글에 이어서, 이진 탐색 트리 구조의 알고리즘을 구현해보겠습니다. 이진 탐색 트리의 특징을 활용한 알고리즘은 크게 3가지가 있습니다. >> 탐색/삽입/삭제 탐색 알고리즘 이진 탐색 트리의 특징을 이용하면 아래와 같은 개념-순서를 통해서 탐색 알고리즘을 구현할 수 있습니다. 1️⃣ 찾고자 하는 값을 루트 노드의 값과 비교합니다. 2️⃣ 찾고자 하는 값이 루트 노드의 값보다 작으면 >> 탐색은 루트 노드 기준으로 왼쪽 서브 트리를 기준으로 다시 시작합니다. 3️⃣ 찾고자 하는 값이 루트 노드의 키 값보다 크면 >> 탐색은 루트 노드 기준으로 오른쪽 서브 트리를 기준으로 다시 시작합니다. 위의 규칙을 바탕으로 swift 언어로 구현을 해보겠습니다. func search(from data: T) -> Bo..
BST (이진탐색트리) - 개념 이번 글에서는 자료구조를 공부할 때 볼 수 있는 이진트리 구조에 대해서 알아보도록 하겠습니다. 자료구조뿐 아니라 알고리즘을 공부할 때도 많이 볼 수 있죠? Tree 노드와 브랜치를 이용해서 사이클을 이루지 않도록 구성한 데이터 구조입니다. 노드 데이터 + 다음 데이터의 주소 값을 갖고 있는 형태 연결 리스트의 구조로 이루어져 있을 때 볼 수 있는 데이터의 형태 *단방향일 경우 데이터의 주소 값이 next만 / 양방향일 경우 prev, next 모두 갖고 있습니다. 트리 >> 트리도 이런 노드를 사용한 데이터 구조이기 때문에 트리 또한, 데이터와 다음 데이터의 주소 값을 갖고 있는 형태입니다. 그러나 노드와 다른점은? 데이터들 간의 연결 고리 모양이 다릅니다. 위에서 아래로 내려오는 구조를 갖고 있으며 브..
알고리즘에 많이 사용되는 Swift Basic 알고리즘을 스위프트로 풀기로 다짐하고 한 문제 풀어보았는데.. 생각보다 문법이 바로 생각나지 않아서 조금 충격 먹고 정리해보는 알고리즘 용 스위프트 문법 정리를 해봅시다!! 🤔 (이게 다 아닐 수도 있고 완전 100% 정답이 아닐 수 있습니다. 만약 잘못된 부분이 있다면 알려주세요.) 키보드 입력 받기 먼저 가장 중요한 입력값 받기 (이 부분은 사실 생략 가능할지도) let input = readLine() readLine()의 반환 값은 Optional String입니다. 강제 언래핑도 가능하지만, if let으로 옵셔널 하는 것이.. 더 좋은 것 같은 느낌이 드네요.. (논리적인 이유는 모르겠습니다.) 키보드로 입력받은 값을 공백으로 구분하기 예를 들어 입력 값이 1 2 3 4 일 경우 바로 inpu..
시간 복잡도 (+빅오 표기법) / 공간 복잡도 알고리즘을 공부했다면 한 번쯤 들어본 개념이 바로 시간/공간 복잡도, 그리고 빅오 표기법.. 이런 거 들어보셨을 겁니다. 이 개념이 도대체 무엇인지? 그리고 이걸 고려해서 어떻게 알고리즘 문제를 풀어야 할지 생각해봅시다!! 시간 복잡도 시간 복잡도 개념은 알고리즘의 실행 속도를 의미합니다. 알고리즘 문제의 경우, 결국 하나의 결괏값을 도출하는 코드를 작성하는 작업입니다. 하나의 문제에 대해서 (예를 들어 1에서 10까지 계산하는 것에 있어서 1부터 10까지 반복문을 통해서 계산할 수 있고 / 수식을 사용해서 계산할 수 있습니다. 이외에도 다양한 방법이 있겠죠?) 여러 가지 코드를 이용해서 풀 수 있습니다. 이때, 방법은 여러 가지라고 해도 가장 실행 속도가 적은 최적의 코드가 있습니다. 그리고 결국 이것..
Swift Algorithm 스위프트로 알고리즘을 공부하기로 마음을 먹었습니다. 근데 이제 환경을 어떻게 해야 하는가? 에 대한 의문이 들어 구글링을 해본 결과 playground에서는 입력값을 받지 못해서 입력을 받고 싶다면, actual application인 Command Line Tool을 이용해야 한다고 합니다. 🤔 왜 playground는 안되는건데? 플레이그라운드는 샌드박스이므로 input이 없습니다. *샌드박스 : 외부로부터 들어온 프로그램이 보호된 영역에서 동작하도록 해서 시스템이 안 좋게 조작되는 것을 막는 보안 형태를 취하는 프로그램입니다. Command Line Tool 그렇다면 Command Line Tool을 어떻게 사용하는지 알아보도록 하겠습니다! 1. 먼저, 엑스 코드를 실행합니다. 2. macOS >>..