문제 요약 숫자가 있는 배열이 주어지고 타겟넘버가 주어진다. 이 상황에서 배열 안의 숫자를 더하거나 빼서 타겟넘버와 일치하는 경우가 있을 텐데 모든 경우의 수에서 타겟넘버와 연산 결과가 일치하는 경우를 리턴해야 한다. 해답 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 에러가 발생하는 것을..
스위프트에서 큐를 구현해서 쓰려고 할 때, 기존에 편하게 쓰는 방법으로 removeFirst를 사용해서 pop을 구현해도 된다. 하지만 커서 큐나 더블 스택 큐를 구현해서 사용하면 훨씬 성능상의 이점을 가져올 수 있기 때문에 이를 이용하면 될 듯하다. 개인적으로는 더블 스택 큐가 구현이 어렵지 않으면서도 성능상으로 뛰어나다는 점, 그리고 콘셉트 자체가 마음에 들어서 선호하는 방법이다. 구글링을 하다보면 큐를 어떻게 구현하는지에 대해 써져 있는 다양한 글이 있는데 나 같은 바보에게 적합한 글이 없었다. 내가 헷갈리는 방향은 실제로 class와 제네릭을 이용하여 구현하는 것은 좋은데 구체적으로 그걸 어떻게 쓸지에 대해 안 써져 있는 것이었다. 거두절미하고 큐를 사용하고자 한다면 다음과 같은 방법을 생각할 수..
문제 요약 스택/큐 문제이다. "()()" 식으로 올바른 형태를 가진 괄호일 때만 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..
문제 요약 해시 중에서는 처음 스위프트 문제입니다. 지난번에 푼 문제와 같이 해시 카테고리이니 단순하게 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..
문제 요약 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..
문제 요약 사실 이 문제는 스위프트를 지원하지 않습니만 그냥 파이썬으로 풀어봤고 스위프트 버전으로 풀어보려고 합니다. 중복이 허용되는 배열이 있고, 배열은 총 갯수가 항상 짝수입니다. 여기서 사용자는 배열의 반만큼만 선택하여 가질 수 있는 상황에서 최대한 다양한 숫자를 가지려고 합니다. 해답 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..
문제 요약 절대값이 들어가 있는 배열이 주어지고 음수인지 양수인지를 알려주는 배열이 주어집니다. 세련된 방법도 있겠지만 아직 문법 지식이 빈약해서 일단은 쉽게 풀겠습니다. 해답 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 } 설명도 필요 없이 간단해서 생략하겠습니다. 다른 사람들 풀이를 보면 고차함수를 이용해서 풀었던데 향후 난이도가 올라가..
요약 진영 씨는 듣지도 못한 사람과 보도 못한 사람을 구분하는 걸까.. 듣도 못한 사람을 먼저 입력받고 바로 보도 못한 사람을 입력하면 된다. 그 후 두 집단의 교집합을 구하면 된다. 해답 교집합을 코드로 구현하다가 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..
문제 요약 언뜻 읽었을 때 이해가 되지 않았다. 어차피 마지막 사람이 인출하는것까지 카운트하면 전체 소요되는 시간은 똑같은거 아닌가? 이 문제는 각 사람이 대기한 시간까지 포함하는 문제다. 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..
코딜리티의 문제들은 무단 복제, 전재와 공개가 금지되어 있습니다. 때문에 문제의 개요와 제 코드만을 공개합니다. 풀이는 스위프트로 진행하였습니다. 문제의 개요 배열은 홀수로 구성되어 있고 각 요소는 자신과 같은 값을 가진 요소가 있습니다. 하나만 빼고요. 그 한 수를 리턴하면 됩니다. 이때, 자신과 같은 값을 가진 요소가 무조건 하나로 제한되는 건 아닙니다. 예를 들어 [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..