Algorithm

Algorithm/프로그래머스

[프로그래머스 스위프트] 타겟넘버

문제 요약 숫자가 있는 배열이 주어지고 타겟넘버가 주어진다. 이 상황에서 배열 안의 숫자를 더하거나 빼서 타겟넘버와 일치하는 경우가 있을 텐데 모든 경우의 수에서 타겟넘버와 연산 결과가 일치하는 경우를 리턴해야 한다. 해답 func solution(_ numbers:[Int], _ target:Int) -> Int { // 횟수를 세기 위한 cnt 변수 var cnt = 0 func dfs(index: Int, sum:Int) { if index == (numbers.count - 1) && sum == target { // 현재 +나 - 연산이 모두 끝나고 결과값이 target과 일치할 경우에만 cnt 증가 cnt += 1 // return으로 탈출 return } // index 에러가 발생하는 것을..

Algorithm/자료구조

[Swift Queue] 스위프트에서 큐를 구현할 때 고려해야 하는 것

스위프트에서 큐를 구현해서 쓰려고 할 때, 기존에 편하게 쓰는 방법으로 removeFirst를 사용해서 pop을 구현해도 된다. 하지만 커서 큐나 더블 스택 큐를 구현해서 사용하면 훨씬 성능상의 이점을 가져올 수 있기 때문에 이를 이용하면 될 듯하다. 개인적으로는 더블 스택 큐가 구현이 어렵지 않으면서도 성능상으로 뛰어나다는 점, 그리고 콘셉트 자체가 마음에 들어서 선호하는 방법이다. 구글링을 하다보면 큐를 어떻게 구현하는지에 대해 써져 있는 다양한 글이 있는데 나 같은 바보에게 적합한 글이 없었다. 내가 헷갈리는 방향은 실제로 class와 제네릭을 이용하여 구현하는 것은 좋은데 구체적으로 그걸 어떻게 쓸지에 대해 안 써져 있는 것이었다. 거두절미하고 큐를 사용하고자 한다면 다음과 같은 방법을 생각할 수..

Algorithm/프로그래머스

[프로그래머스 스위프트] 올바른 괄호

문제 요약 스택/큐 문제이다. "()()" 식으로 올바른 형태를 가진 괄호일 때만 true를 리턴하고 ")("와 같이 역순이면 false를 리턴해야 합니다. 해답 첫 번째 시도 func solution(_ s:String) -> Bool { var cnt: Int = 0 for c in s { if c == "(" { cnt += 1 } else { cnt -= 1 } if cnt < 0 { return false } } if cnt == 0 { return true } else { return false } } 가장 먼저 둔 생각은 이걸 굳이 스택이나 큐로 풀어야 하나? 해서 푼 방식입니다. 하지만 이 방법으로 진행할 시 효율성 테스트 2번째를 통과하지 못합니다. 두 번째 시도 func solution..

Algorithm/프로그래머스

[프로그래머스 스위프트] 위장

문제 요약 해시 중에서는 처음 스위프트 문제입니다. 지난번에 푼 문제와 같이 해시 카테고리이니 단순하게 for문으로 풀면 안 될 거 같습니다. 해답 딕셔너리에 대한 이해와 key, Value를 다룰 줄 알면 쉽게 풀 수도 있었던 문제였습니다. 전 결국 다른 사람들의 답을 보고 풀었네요.. func solution(_ clothes:[[String]]) -> Int { var clothTypeSum: [String:Int] = [:] for cloth in clothes { if !clothTypeSum.keys.contains(cloth[1]) { clothTypeSum[cloth[1]] = 0 } clothTypeSum[cloth[1]]? += 1 } var cnt = 1 for num in cloth..

Algorithm/프로그래머스

[프로그래머스 스위프트] 콜라츠 추측

문제 요약 1-1. 입력된 수가 짝수라면 2로 나눕니다. 1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다. 2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다. 여기에 주어진 수가 1이면 0 그리고 500번 반복해도 답이 없으면 -1 반환하면 됩니다. 굉장히 간단한 문제네요 해답 func solution(_ num:Int) -> Int { var tmp = num var cnt = 0 if tmp == 1{ return 0 } while true { guard cnt < 500 else { return -1 } if tmp % 2 == 0 { tmp = tmp / 2 cnt += 1 } else if tmp % 2 == 1 { tmp = tmp*3 + 1 cnt += 1 } if tm..

Algorithm/프로그래머스

[프로그래머스 스위프트] 폰켓몬

문제 요약 사실 이 문제는 스위프트를 지원하지 않습니만 그냥 파이썬으로 풀어봤고 스위프트 버전으로 풀어보려고 합니다. 중복이 허용되는 배열이 있고, 배열은 총 갯수가 항상 짝수입니다. 여기서 사용자는 배열의 반만큼만 선택하여 가질 수 있는 상황에서 최대한 다양한 숫자를 가지려고 합니다. 해답 import Foundation func solution(nums: [Int]) -> Int { if Set(nums).count > nums.count / 2 { return nums.count/2 } else { return Set(nums).count } } 한줄로 풀려면 func solution(nums: [Int]) -> Int { return [Set(nums).count, nums.count / 2].m..

Algorithm/프로그래머스

[프로그래머스 스위프트] 음양더하기

문제 요약 절대값이 들어가 있는 배열이 주어지고 음수인지 양수인지를 알려주는 배열이 주어집니다. 세련된 방법도 있겠지만 아직 문법 지식이 빈약해서 일단은 쉽게 풀겠습니다. 해답 import Foundation func solution(_ absolutes:[Int], _ signs:[Bool]) -> Int { var result: Int = 0 for idx in 0 ..< absolutes.count { if signs[idx] == true { result += absolutes[idx] } else { result -= absolutes[idx] } } return result } 설명도 필요 없이 간단해서 생략하겠습니다. 다른 사람들 풀이를 보면 고차함수를 이용해서 풀었던데 향후 난이도가 올라가..

Algorithm/백준

[백준 스위프트] 1764번 듣보잡

요약 진영 씨는 듣지도 못한 사람과 보도 못한 사람을 구분하는 걸까.. 듣도 못한 사람을 먼저 입력받고 바로 보도 못한 사람을 입력하면 된다. 그 후 두 집단의 교집합을 구하면 된다. 해답 교집합을 코드로 구현하다가 Set에는 교집합을 구하는 함수가 있다는 것을 알았다. Codility 문제인가 교집합을 코드로 구현해서 풀었던 거 같은데 그게 그렇게 푸는 게 아니었을지도 모르겠다. let NM = readLine()!.split(separator: " ").map({Int(String($0))!}) let N = NM[0] let M = NM[1] var noHeard = Set() var noSaw = Set() for _ in 0..

Algorithm/백준

[백준 스위프트] 11399번 ATM

문제 요약 언뜻 읽었을 때 이해가 되지 않았다. 어차피 마지막 사람이 인출하는것까지 카운트하면 전체 소요되는 시간은 똑같은거 아닌가? 이 문제는 각 사람이 대기한 시간까지 포함하는 문제다. 3, 2, 1의 시간이 걸린다치면 123 순으로 하면 1 + 3+ 6으로 10이 나오지만 321순으로 인출을 하면 3+ 5+ 6으로 14가 나오기 떄문에 최솟값을 구할수 없다. 해답 let N = Int(readLine()!)! var array = readLine()!.split(separator: " ").map({Int(String($0))!}) var sum:Int = 0 var result:Int = 0 array.sort() for idx in array { sum = idx + sum result = su..

Algorithm/Cordiality

[Codility] Lesson 2) OddOcurrencesInArray

코딜리티의 문제들은 무단 복제, 전재와 공개가 금지되어 있습니다. 때문에 문제의 개요와 제 코드만을 공개합니다. 풀이는 스위프트로 진행하였습니다. 문제의 개요 배열은 홀수로 구성되어 있고 각 요소는 자신과 같은 값을 가진 요소가 있습니다. 하나만 빼고요. 그 한 수를 리턴하면 됩니다. 이때, 자신과 같은 값을 가진 요소가 무조건 하나로 제한되는 건 아닙니다. 예를 들어 [1, 2, 3, 2, 1]이면 3이고 [1,1,1,1,2]면 2입니다. 해답 1차 시도 public func solution(_ A : inout [Int]) -> Int { while true { if let pairIndex = A.lastIndex(of: A[0]) { A.remove(at: pairIndex) A.removeFir..

devKen
'Algorithm' 카테고리의 글 목록 (5 Page)