Algorithm

Algorithm/프로그래머스

[프로그래머스 파이썬] 숫자 변환하기

def solution(x, y, n): answer = 0 dp = [1e9 for _ in range(y+1)] dp[x] = 0 for i in range(x + 1, y + 1): if i//3 >= x and i % 3 == 0 and dp[i//3] != 1e9: dp[i] = min(dp[i], dp[i//3]+1) if i//2 >= x and i % 2 == 0 and dp[i//2] != 1e9: dp[i] = min(dp[i], dp[i//2]+1) if i-n >= x and dp[i-n] != 1e9: dp[i] = min(dp[i], dp[i - n]+1) answer = dp[y] if answer == 1e9: answer = -1 return answer 아이디어 처음에는 ..

Algorithm/백준

[백준 스위프트] 11724번 연결 요소의 개수

아이디어 핵심 키워드를 모르면 못 푼다. 방향 없는 그래프와 연결 요소가 무엇인지 알아야 한다. 먼저 다른 문제와 같이 그래프를 만들고 dfs를 이용해서 풀었다. check 혹은 visited를 만들고 for문에서 순회하면서 방문하지 않았다면 연결 요소 수치인 result를 증가시키고 방문 처리를 한다. 다음으로 dfs 함수를 돌리는데 여기서는 해당 행에서 방문하지 않은곳을 찾는다. 마지막으로 자기 자신을 재귀로 호출하면 끝에서 타고 올라가며? 처리를 한다. 해답 let input = readLine()!.split(separator: " ").map { Int(String($0))!} let N = input[0] let M = input[1] var graph = Array(repeating: Arr..

Algorithm/프로그래머스

[프로그래머스 스위프트] 프린터

아이디어 푸는데 정말 오래 걸린 문제이다. 난이도 자체는 어렵지 않고 어떻게 풀어야 할지 생각도 빨리 났다. 하지만 내가 큐라는 개념을 직접 구현해서 풀려고 했고 그걸 다 암기해야 한다는 강박관념 때문에 미루고 있었다. 이 문제는 더블 스택으로 큐를 구현해서 풀면 더 빨리 구현이 가능하지만 스위프트 언어의 특성상 array를 큐처럼 사용할 수 있다. 너무 쓸데없는 포인트에 집착할 필요도 없는 거 같다. 해답 func solution(_ priorities:[Int], _ location:Int) -> Int { var priorities = priorities var location = location var result = 0 while !priorities.isEmpty { let currentMax..

Algorithm/프로그래머스

[프로그래머스 스위프트] 키패드 누르기

아이디어 왼손과 오른손을 결정짓는 규칙을 생각하지 못해서 검색으로 힌트를 얻었다. 이중 배열로 그래프를 만든 후 한 칸씩만 움직일 수 있다는 점을 이용해서 풀 생각이었지만 레벨 1이라는 점과 인턴 문제라는 점에서 조금 더 쉽게 풀 수 있을 거라는 걸 예상하지 못했다. 테스트 케이스를 두어 개 더 작성했다면 혼자 풀 수도 있었을 거 같다. 해답 import Foundation func solution(_ numbers:[Int], _ hand:String) -> String { var locationLeft = 10 var locationRight = 12 var result: String = "" for number in numbers { var number = number if number == 1 |..

Algorithm/프로그래머스

[프로그래머스 스위프트] 시저암호

아이디어 스위프트의 문자열이 복잡하다고 알고 있다면 조금 어폐가 있다. 쉽게 쓸 수 있는 방법도 존재한다. 파이썬으로 한번 풀었던 거라 어떻게 풀지는 이미 알았던 문제였다. 무자가 총 26개라는 것에 주목하여 글자의 인덱스 번호와 n의 덧셈이 26을 넘을 때 동작하게 만든다. 해답 func solution(_ s:String, _ n:Int) -> String { let upper = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZ") let lower = Array("abcdefghijklmnopqrstuvwxyz") var result = "" for ch in s { if upper.contains(ch) { var index = upper.firstIndex(of: ch)! + n i..

Algorithm/프로그래머스

[프로그래머스 스위프트] 최소직사각형

아이디어 해당 문제는 복잡하게 생각하면 안 되는 문제였다. 간소한 풀이법을 적는다. 변수명을 big, small로 적긴 했지만 뭐든 상관없다. sizes에서 size가 들어올 때마다 정렬을 한다. 정렬을 하는 이유는 안에 있는 게 뭐든지 순서를 부여하여 끼리끼리 모으고 작은 것 중에 큰 거, 큰 것 중에 큰 거를 뽑아오기 때문이다. 아마 명함이므로 너비가 small에 속하게 되겠지만 뭐든 무슨 상관인가 직사각형인 것만 알고 있으면 됐다. 사고를 조금만 전환해도 쉽게 풀리는 거 같다. 애초에 쉬운 문제기도 했고.. 해답 import Foundation func solution(_ sizes:[[Int]]) -> Int { var big:[Int] = [] var small:[Int] = [] for siz..

Algorithm/프로그래머스

[프로그래머스 스위프트] 숫자 문자열과 영단어

아이디어 replacingOccurrences(of: "old", with: "new") 메서드를 알고 있냐 모르냐가 난이도를 결정짓는 문제이다. 다소 품위없게 if를 도배하면서 풀었는데 풀고 나서 다른 사람들의 풀이를 보니까 굳이 이렇게 풀 필요가 없었다. replacingOccurrences 메서드의 of에 해당 문자열이 없으면 변환을 진행시키지 않는다. 또한 .으로 연속해서 변환을 수행할 수도 있었다. 해답 import Foundation func solution(_ s:String) -> Int { var s = s if s.contains("zero") { s = s.replacingOccurrences(of: "zero", with: "0") } if s.contains("one") { s =..

Algorithm/프로그래머스

[프로그래머스 스위프트] 멀리 뛰기

아이디어 단순히 순열이나 조합을 구현하는 방법을 알면 자동으로 풀리지 않을까 생각했던 문제였다. 하지만 잘 생각해보니까 이 문제는 단순히 순열이나 조합으로 풀릴 문제가 아니다. 왜냐면 모든 경우의 수가 중요한 것이 아니라 오직 1과 2로 구성되어 있으므로 [1, 1, 2]이 있다면 여기서 서로 1의 위치가 서로 바뀌는 경우를 산정할 필요가 없기 때문이다. 결과적으로 이 문제는 피보나치수열이었다.. 즉 N = N - 1 + N - 2 인 것이다. 해결법이 안 보일 때는 노트에 손으로 쓰면서 법칙을 찾아내는 것이 중요하다는 생각이 들었다. 오답 테스트 케이스 7번부터 끝까지 "실패 (signal: illegal instruction (core dumped))가 발생한다. 인덱스 문제인가 하고 보니 그럴리는 ..

Algorithm/백준

[백준 스위프트] 1697번 숨박꼭질

아이디어 처음에 BFS 문제라 생각했다가 생각보다 조건이 간단하여 굳이 bfs로 안 풀어도 된다고 생각했다. 문제를 오독한 탓인데 수빈이의 동생이 수빈이보다 더 왼쪽 (K < N)일 가능성을 판단하지 못하고 생각보다 while로 푸는 것이 복잡하고 단계를 많이 거쳐야 했던 탓으로 생각한다. 오답 오답을 굳이 적어야 하나 싶었지만 머리속에서 5 17이라는 예시 조건에서 어떻게 문제를 풀어가는지를 생각했었다. 힌트에서 내가 생각한 것과 똑같은 방향으로 풀렸기 때문에 더욱 그렇게 착각한듯하다. 순간이동으로 단숨에 좁히는 것이 유리하므로 순간 이동하고 x-1, x+1 좌표에 동생이 있는지 확인하게 하였다. 아니면 K가 N의 2배 이상이 아닐 경우에만 순간 이동하고 아닌 경우에는 그냥 한 칸 N-1 하여 다시 순..

Algorithm/프로그래머스

[프로그래머스 스위프트] 약수의 개수와 덧셈

아이디어 left부터 right까지 숫자를 추출하고 약수인지 판단한 후 개수에 따라서 result를 더하거나 뺀다. 간단 해답 import Foundation func solution(_ left:Int, _ right:Int) -> Int { var result = 0 for num in left ... right { var cnt = 0 for i in 1 ... num { if num % i == 0 { cnt += 1 } } if cnt % 2 == 0 { result += num } else { result -= num } } return result }

devKen
'Algorithm' 카테고리의 글 목록