본문 바로가기

코딩테스트/알고리즘

(10)
숫자 야구게임 만들기 Swift 기능 설명중복되지 않는 3자리 숫자를 맞추는 게임입니다.각 자리수는 서로 중복되지 않고, 앞자리에는 0이 올 수 없습니다.  입력입력은 문자열을 포함하지 않은 숫자 3자리를 입력받습니다.아래와 같이 올바르지 않는 입력 경우의 수는 다음과 같습니다.- 빈 문자열- 중복된 값이 존재하는 3자리 문자열- 3자리가 아닌 문자열- String값이 섞인 문자열- 0으로 시작하는 문자열// 올바르지 않는 입력값input1 = ""input2 = "122"input3 = "12"input4 = "12e"input5 = "dfe"input6 = "012" 이를 아래와 같이 필터링하는 메서드를 만들었습니다.private func isCorrectInput(input: String) -> Bool { // 문자열의 앞 문자..
분할 정복 Swift 분할정복분할 정복은 문제를 부분문제로 나누어 문제를 해결할 수 있는단위까지 나눈 후, 해결하고 다시 조합하는 방법이다.분할정복은 세단계로 구성되어있다. 분할: 문제를 분할할 수 있을 만큼 같은 유형의 문제로 분할한다.정복: 분할된 작은 문제를 해결한다.조합: 해결된 작은 부분문제들을 조합하여 정답을 출력한다.  ※ 분할정복과 동적 계획법 차이:분할정복은 큰 문제를 여러개의 작은 문제로 나누어 해결하고, 이를 모두 조합한다.동적계획법은 작은 문제부터 해결하여 기록하고, 기록된 정보를 통해 큰문제를 해결해나간다. 분할정복은 대표적으로 합병정렬과 퀵 정렬이 있다.  합병정렬분할정복의 대표적인 정렬 알고리즘이다. 합병정렬의 단계1. 주어진 배열의 크기가 0또는 1이라면 이미 정렬이 되있다고 간주하고, 그렇지 않..
플로이드-워셜 알고리즘 Swift 플로이드-워셜 알고리즘그래프에서 최단거리를 구할때, 여러가지 알고리즘이 있고, 우리는 선택할 수 있다.플로이드-워셜 알고리즘은 주어진 모든 노드쌍의 최단거리를 구하는 알고리즘이다.이 알고리즘은 다익스트라와는 다르게 음의 가중치가 있는 그래프에서도 사용이 가능하며, 시간복잡도는 O(N^3)이다. 플로이드-워셜 알고리즘 과정이 알고리즘은 노드 a에서 b까지 가는 최단거리를 구하기 위해, 두 노드 사이의 중간노드인 m을 이용하여 구한다.m을통해 a에서 m까지의 최단거리와 m에서 b까지의 최단거리를 구하고 더하면 a에서 b까지의 최단거리가 된다.그래프의 모든 노드를 중간노드로 설정해주며, 최단거리를 구해내간다. 아래 그래프로 플로이드 워셜 알고리즘을 이용해 최단거리를 구해보자. 이 그래프를 인접행렬로 나타내면 ..
다익스트라 알고리즘 Swift var omitformtags=["input", "textarea", "select"]omitformtags=omitformtags.join("|")function disableselect(e){if (omitformtags.indexOf(e.target.tagName.toLowerCase())==-1)return false}function reEnable(){return true}if (typeof document.onselectstart!="undefined")document.onselectstart=new Function ("return false")else{document.onmousedown=disableselectdocument.onmouseup=reEnable}..
투포인터 알고리즘 Swift 투포인터 알고리즘 - 리스트에 순차적으로 접근할 때 두 원소의 위치를 기록하는 알고리즘 - 일반적으로 정렬된 리스트나 배열에서 사용한다. - 보통 정해진 두 위치(첫번째: start, 마지막:end)는 start
순열과 조합 Swift 순열 Permutation 서로다른 n개의 원소에서 r개를 중복 없이 순서와 상관있게 선택 혹은 나열하는것이다. ex) [1, 2, 3]의 배열에서 두개의 원소를 뽑는다고 한다면 [1,2], [1,3], [2,1], [2,3], [3,1], [3,2]이 된다. 여기서 [1,2] 와 [2,1]은 들어있는 원소는 같지만, 순서가 다르기때문에 다른 경우의수로 판단한다. import Foundation // 순열 func permutation(_ targetArr: [Int],_ targetNum: Int,_ arr: [Int]) { // 뽑으려는 갯수와 동일한경우 if arr.count == targetNum { print(arr) return } // 순열은 순서가 상관있는 뽑기방식으로, [2,1] != [..
깊이 우선 탐색(DFS)과 너비 우선 탐색(BFS) Swift 깊이 우선 탐색(DFS) - 루트노드에서 시작하여 다음 분기로 넘어가기전 해당 분기를 완벽하게 탐색하는 방법. - 해당 분기를 모두 탐색한 후, 이 분기는 이미 탐색함을 기록하고 다음분기로 넘어감 - 백트래킹으로 이용한다. - 스택 또는 재귀함수로 구현한다. -> 모든 노드를 방문하고자 할때 주로 사용함 -> BFS에 비해 상대적으로 검색속도가 느림 -> 구현은 DFS가 더 간단하다. 너비 우선 탐색(BFS) - 루트노드 혹은 임의노드부터 시작하여 인접한 가까운 노드부터 탐색하고 마지막으로 가장 먼 노드를 탐색하는 방법 - 주로 노드사이의 최단거리를 계산할때 사용한다. - 큐로 구현한다. ex) 지구상의 모든 관계를 그래프로 표현했을때, 철수와 영희와의 관계를 찾는다면 깊이 우선탐색: 모든 관계를 탐색하..
이분탐색 Swift 유명한 이분탐색 이미지다. 위와 같이 완전탐색과 다르게 이분탐색은 훨씬 빠르게 데이터를 찾을 수 있다. -> 이분탐색은 정렬된 리스트안에서 탐색범위를 절반씩 좁혀가며 데이터를 찾는 방식이다. -> 배열의 내부가 정렬되어있어야 사용가능하다. -> 세가지 변수 (start, end, target) 을 사용하며, 반복적 또는 재귀호출로 데이터를 찾는다. 재귀 호출을 이용한 이분탐색 import Foundation // 이분탐색 func binarySearch(arr: [Int], start: Int, end: Int, target: Int) -> Int { // startIndex 가 endIndex를 넘으면 종료 if start > end { return -1 } let mid = (start + end) ..