알고리즘 문제 풀이 73

[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 11726 2 x n 타일링

BOJ 11726 2 x n 타일링 ✅ BOJ 11726 2 x n 타일링 이 문제는 생각보다 어려웠다. 사실 나동빈 알고리즘 dp편에서 본 기억이 있는데, 이를 직접 풀어보려니까 도저히 생각이 나지 않았다. 사실 책의 해설도 잘 이해가 가지 않았는데, dp를 보면 볼수록 수학적인 사고가 강력하게 필요한 것 같다. 풀이와 해설이 이해가 가지 않아서 다른 분의 블로그를 참고하였다. 1x2, 2x1 두개의 타일이 있다. n = 1 : | 1개 n = 2 : ||, = 2개 n = 3 : |||, =l, l= 3개 n = 4 : llll, ll=, l=l, =ll, == 5개 n = 5 : lllll, lll=, ll=l, l=ll, =lll, l==, =l=, ==l 8개 이런 패턴을 찾을 수 있다. 참고한..

[Swift] BOJ 10610번 30

BOJ 10610번 30 ✅ 후 오랜만에 생각보다 어려웠음 처음에 문제보고 잘 이해가 안가서 문제 설명 다른 사람이 해둔거 쓱 본다음에 풀려고 했는데, 어떻게 해야할 지 몰라서 재귀를 돌렸음 🟠 [처음 내 접근 방식] 1. 인풋을 String으로 받는다. 2. 받은 String을 [Int] 배열로 만든 후 내림차순으로 정렬한다. 3. 0이 포함되어 있지 않다면, 30의 배수가 될 수 없음으로 바로 "-1"을 리턴하고 종료한다. ex) "2931" -> [9, 3, 2, 1] 4. 재귀를 통해서 9xxx, 3xxx 등 조합 가능한 네자리 수를 전부 만들어 낸다. 4-1. 이때 재귀의 종료 조건에서 4자리 수가 완성되면, 30으로 나누어서 30의 배수인지 아닌지 판단하고, 이 값들 중에서 max값을 갖고 있..

[Swift] BOJ 1931회의실 배정

BOJ 1931회의실 배정 ✅ 알고리즘 자체는 쉬웠음 먼저 정렬을 해야하는데, 끝나는 시간을 기준으로 수행하며 만약 그 끝나는 시간이 같다면 시작 시간이 빠른 것을 앞에다가 배치함. 그 이후로는 그리디(그냥 for문 다 돌리라는 말)로 풀면 되는데, 현재 시간과 시작시간을 비교해서 시작시간이 같거다 더 뒤에 있으면 카운트를 증가시키고 현재 시간을 끝나는 시간으로 바꿔주면 된다. 포스팅을 한다는 건 생각보다 오래 걸렸단 말이겠지? 백준 문제가 너무 불친절해서,, 테스트 케이스가 하나만 있던데, 당연히 정렬이 되어있는줄 알았음. 정렬이 안되어 있어서 그래서 정렬하니까 완료 나는 처음에 85%쯤에서 막혔는데 반례를 찾았음 [반례] 3 3 3 2 3 3 3 올바른 답: 3 let iterator : Int! =..

[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진수로 바꾸어서 해야하나..? 생각했었는데 그럴 필요가 없더라 암튼 이지 했는데, 그냥 뭔가 음 ,, 오랜만에 비트 연산자 써보는 것 같아서 이렇게도 쓸 수 있다고 포스팅!

[Swift] 프로그래머스 LV1. 최소직사각형

[Swift] 프로그래머스 LV1. 최소직사각형 ✅ [Swift] 프로그래머스 LV1. 최소직사각형 func solution(_ sizes:[[Int]]) -> Int { var long = 0 var short = 0 sizes.forEach { size in let tempLong = max(size[0], size[1]) let tempShort = min(size[0], size[1]) long = max(long, tempLong) short = max(short, tempShort) } return long * short } 이걸 포스팅 하는 이유는! 푸는데 오래걸렸다.. ✅ 알고리즘 큰 길이는 큰 길이대로 모아서 비교하고 짧은 길이는 짧은 길이대로 모아서 비교한다. 가로 세로에 얽매이면 안돼..