프로그래머스 30

[Swift] 프로그래머스 LV2. 모음사전

프로그래머스 LV2. 모음사전 ✅ 이 문제를 푸는데 고등학교 시절에 확률과 통계 배웠던 기억이 팍팍 났음. 근데 뭔가 바로 안풀렸는데, 이걸 또 종이에 손으로 하다 보니까 패턴을 금방 발견할 수 있었음. 🟠 패턴 1. A 2. AA 3. AAA 4. AAAA 5. AAAAA 6. AAAAE 7. AAAAI 8. AAAAO 9. AAAAU 10. AAAE _ _ _ _ _ 이렇게 다섯자리가 있다고 가정하면 맨 끝자리의 변화는 1씩 카운트 된다. 그렇다면 4번째 자리는 어떻게 일반화 할까? 5번째 자리에 올 수 있는 경우의 수가 5가지이므로 거기에 +1을 하면 된다. 따라서 문자의 index * 6이다. 그럼 3번째 자리는? 4,5 번 자리에 각각 5, 5개씩 올 수 있으므로 25개, 4번자리를 스킵하고 5..

[Swift] 프로그래머스 LV2. 튜플

프로그래머스 LV2. 튜플 ✅ 문제를 이해하기가 어려웠지 푸는데 어렵지는 않았음. 근데 왜 포스팅하냐면, 푸는데 오래걸려서. 정규 표현식으로 분리하려고 했는데, 사용하기가 불편했고, split을 통해서 "}"로 분리해서 작업을 했더니, 원하는 형태로 바꾸는데 for이 많이 들어가서 코드가 별로가 되었음. 근데 코드를 보니까 분리를 "},{"로 가능해 보여서 그렇게 설계함. 문제를 풀고난 후에 구글링을 하면서 코드 리팩토링까지 마침. component와 split에 대해서 더 자세히 알아야겠다고 다짐하며 마침. 🟠 문제에서 이해가 가지 않는 부분 해석 "{{4,2,3},{3},{2,3,4,1},{2,3}}" // [3, 2, 4, 1] {3} {2,3} {4,2,3} {2,3,4,1} 이렇게 순서로 봐야한..

[Swift] 프로그래머스 LV. 2 N개의 최소공배수

프로그래머스 LV. 2 N개의 최소공배수 ✅ 최소공배수와 최대공약수를 사용할 때는 직접 구하지 말고 유클리드 호제법을 이용하자. 호제법을 이용한다면 쉽게 풀수가 있다. struct p12953 { static func run() { print(p12953.solution([2,6,8,14])) // 168 } static func solution(_ arr:[Int]) -> Int { // 최소공배수 찾는 알고리즘 하나 마련해서 쭉 돌자 var prev = arr[0] for i in 1.. Int { return (a * b) / gcd(a, b) } // 최대공약수 static func gcd(_ a: Int, _ b: Int) -> Int { var a = a var b = b var r = 0 w..

[Swift] 프로그래머스 LV2. 삼각 달팽이

프로그래머스 LV2. 삼각 달팽이 ✅ 프로그래머스 LV2. 삼각 달팽이 아주 오래걸린 문제였다. 여러가지 방법이 있었는데, 처음에는 배열을 [ [], [], [], [] ] 이런 식으로 세팅해 두어서 insert와 append로 알고리즘을 작성하니까 너무나도 어려웠다. 근데 그냥 n = 3이라고 가정하면, [ [0,0,0], [0,0,0], [0,0,0] ] 이렇게 세팅하고 푸니까 우선 훨씬 쉬워질 수 있었다. 왜냐하면 index를 [row][col]로 접근할 수 있어서!! 문법적으로는 2가지를 보면 된다. 1. 2차원 배열을 크기를 주어서 만드는 방법과 2. flatMap을 사용한 부분 🟠 알고리즘을 떠올리는 과정 이걸 곰곰이 생각해보니까, [ 1 ] [ 2, 9 ] [ 3 ,10 ,8 ] [ 4, 5..

[Swift] 프로그래머스 LV2. 피로도

프로그래머스 LV2. 피로도 ✅ 프로그래머스 LV2. 피로도 나 이제 재귀를 조금 잘쓰는 것 같다. 물론 완전 탐색에서의 재귀이지만, dfs, bfs 등도 잘 풀 수 있어야 하니 꾸준히 노력하자 갑자기 적는거지만 알고리즘 왜 푸냐면 개인적으로 앱 개발에 있어서 어떠한 알고리즘이라 로직 처리를 할 때 매우 약하다. 그런 점을 보완하고자 알고리즘을 공부한다. import Foundation struct p87946 { static func run() { print(p87946.solution(80, [[80,20],[50,40],[30,10]])) // 3 } static var count = 0 static var results: Set = [] static func solution(_ k:Int, _ d..

[Swift] 프로그래머스 LV2. 소수 찾기

프로그래머스 LV2. 소수 찾기 ✅ 소수 찾기를 재귀를 통해서 해결하였음 걸린 시간은 거의 한 2시간 넘게 걸렸는데, 재귀를 사용해서 문제를 푼게 처음이라서 그렇다. 다른 사람들은 dfs, bfs, 순열 등등 많던데, 나는 이게 제일 간편한 것 같다. 재귀 해보니까 그렇게 어렵지 않다 ㅎㅎ import Foundation var results: Set = [] func solution(_ numbers:String) -> Int { var count = 0 for len in 1...numbers.count { reculsive(list: "", remain: numbers, len: len) } results.remove(0) results.remove(1) results.forEach { result..

[Swift] BOJ 2839 설탕 배달

BOJ 2839 설탕 배달 ✅ 그리디를 공부하면서 한번 풀어 본 문제인데, 진짜 생각보다 너무 오래 걸림. 내 문제점이 input case에 대해서 면밀히 살펴보지 않는다는 건데, 진짜 좀 살펴봐야겠음. 머릿속으로 이렇게 하면 되겠지 하고 기깔나게 풀었는데, 틀렸다길래 보ㅇ니까 그냥 틀렸더라 .. 로 직 이 .. 이걸 한시간이나 걸려 풀었다니! 문제가 무엇이었냐면 11이 들어왔을때는 (5 + 3 + 3)으로 처리가 가능했음. 근데 나는 5에서 몫을 구하고 나머지를 input에 재할당하여 사용하니까 11을 처리할 수가 없게 되었음. 근데 가만히 생각해보니, 그냥 한번 수행할 때, 한번씩 숫자를 빼면서 해도 될 것 같은 기분이 들었음. 뭔 ㄱ ㅏ 시간복잡도가 정직하게 O(N)이라서 좀 그런 기분은 있었지만,..

[Swift] 프로그래머스 LV1. 소수 찾기

프로그래머스 LV1. 소수 찾기 ✅ 소수 찾기 푸는데 나름 시간을 고려했다고 생각했는데 시간 초과가 남. 이런 친구들이 제일 화나면서 도전정신 들게 만드는데, 암튼 개선한거 같이 보자 func solution(_ n:Int) -> Int { // 소수찾는 알고리즘 var count = 0 var flag = true for target in stride(from: 3, through: n, by: 2) { // 어차피 짝수는 2말고는 다 소수 아님 flag = true // print("target \(target)") for divisor in stride(from: 3, to: target, by: 2) { // print(divisor) if target % divisor == 0 { flag = ..

[Swift] 프로그래머스 LV1. [1차] 다트 게임

프로그래머스 LV1. [1차] 다트 게임 ✅ 와 풀긴 풀었는데, 진짜 삽질 많이했네 1. 처음에는 문자열 하나하나 받아서 특정 한 스트림을 구성했을 때, 값을 계산하기로 함. - 문제점: 10의 경우에는 1, 0으로 분리되어서 로직에 문제가 발생함. 2. [개선] 그렇다면 정규표현식을 사용하고자 함. - 문제점: 이건 공부를 하고 사용해야할 것 같아서 그냥 다른 방법 ㄱ 3. [개선] split을 사용하기로 함. - 이 글을 포스팅 하는 이유임. - 문제점: 옵션의 경우에는 어떻게 처리할지 감이 잡히지 않음. - 해결했다고 생각 4. [개선] 답이 틀리다고 나옴 - 문제점: 옵션의 (*)의 경우에는 전체가 아니라 이전 점수에만 두배를 하는 로직이었음. - 알고리즘 개선 ✅ 회고 예나 지금이나 문제를 쓱..

[Swift] 프로그래머스 LV1. [1차] 비밀지도

프로그래머스 LV1. [1차] 비밀지도 func solution(_ n:Int, _ arr1:[Int], _ arr2:[Int]) -> [String] { var answer: [String] = [] for i in 0.. String in if bit == "1" { return "#" } else { return " " } } while(cherry.count < n) { cherry.insert(" ", at: 0) } answer.append(cherry.joined()) } return answer } 10진수를 2진수로 바꾸어서 해야하나..? 생각했었는데 그럴 필요가 없더라 암튼 이지 했는데, 그냥 뭔가 음 ,, 오랜만에 비트 연산자 써보는 것 같아서 이렇게도 쓸 수 있다고 포스팅!