→ Problems

· → Problems
🧐 문제🧙 문제풀이만만하게 봤지만(?) 생각할 거리가 꽤 있는 문제였다. 첫번째는 일단 무식하게 풀어보자였다. Array를 내 위치부터 잘라서 그 뒤로 해당 숫자보다 큰 숫자를 찾아서 반환해줬다. 하지만 당연하게도 시간초과가 났다. numbers의 길이가 최대 1,000,000이기 때문에 아래와 같은 풀이 방법은 결국 O(n^2)으로 시간초과가 나게 된다.func solution(_ numbers: [Int]) -> [Int] { var answer: [Int] = [] for i in numbers.indices { let first = numbers[i...].first { $0 > numbers[i] } ?? -1 answer.append(first) ..
· → Problems
🤓 문제https://www.acmicpc.net/problem/16638🧙 풀이과정우선 아래의 문제와 비슷하고, 이번에는 괄호를 아무렇게나 씌울 수 있다는 조건이 추가되었다. [Algorithm] 백준 - 16638번 괄호 추가하기2 (Swift)🧐 문제https://www.acmicpc.net/problem/16638✨ 풀이괄호, 곱하기, 그외 연산자 순으로 연산을 진행하면 되겠다라고 생각했다. 그리고 괄호는 중복되면 안되기 때문에 오른쪽부터 괄호를 씌우게 하지만swift-library.tistory.com✨ 첫 번째 풀이 (단순하게)첫 번째는 아주 간단하게 접근했다. 그냥 모든 경우를 계산했다. let n = Int(readLine()!)!let expression = Array(readLin..
· → Problems
🧐 문제https://www.acmicpc.net/problem/16638✨ 풀이괄호, 곱하기, 그외 연산자 순으로 연산을 진행하면 되겠다라고 생각했다. 그리고 괄호는 중복되면 안되기 때문에 오른쪽부터 괄호를 씌우게 하지만 이전에 괄호가 있다면 무조건 한칸 건너띄게 괄호를 넣을 수 있게 했다.let n = Int(readLine()!)!let math = Array(readLine()!).map { String($0) }var cap = Array(repeating: false, count: n)/// ["숫자", "부호", "숫자"] 연산func operation(_ array: [String]) -> String { let left = Int(array[0])! let right = In..
· → Problems
🤓 문제https://www.acmicpc.net/problem/1700✨ 풀이캐싱과 느낌이 정말 비슷하다. 왜냐하면 멀티탭에 꽂혀있느면 바로 사용이 가능한 것이고(Hit), 멀티탭에 없으면 플러그를 꽂아야 한다. 하지만 코드는 한정적이기 때문에 효과적으로 멀티탭을 관리해야 한다. 첫번째 풀었던 방법은 캐싱을 생각하면서 가장 사용이 많이 된 것을 남기고 나머지를 교체하는 알고리즘을 사용했지만 이 문제의 중요한 점은 미래를 안다는 것이다. 미래를 모르는 상황에서는 가장 사용이 많이 되거나 가장 최근에 사용한 것을 살리는 식으로 캐싱을 하면 되지만 미래를 아는 순간 이야기는 달라진다. 멀티탭이 꽉차게 되면 가장 늦게 쓰는 플러그를 빼면 된다. 어자피 가장 최근에 쓰는건 결국 사용하기 때문에 일단 넣어두어야..
· → Problems
🥸 문제 소개🧑🏻‍💻 문제 풀이사전을 순서대로 만들어 나가면서 target이 현재 추가된 단어와 같다면 값을 리턴하게 만들었다. 사전을 만들어 나가는 과정은 재귀함수를 활용하여 구현했다.func solution(_ target: String) -> Int { let vowels = ["A", "E", "I", "O", "U"] var found = false var answer = 0 func dfs(_ word: String) { if word.count > 5 || found { return } answer += 1 if word == target { found = true ..
· → Problems
🏁 문제 소개💡 문제 풀이가장 먼저 문제를 보고 생각난건 트리구조였다. 결국 -1, +1 두개의 자식노드로 numbers의 크기의 깊이만큼 들어가는 트리구조로 생각했다. [4, 1, 2, 1] 같은 경우는 아래 상태로 나타낼 수 있을 것 같다.DFS재귀함수를 활용하여 깊이우선탐색을 구현했다.func solution(_ numbers: [Int], _ target: Int) -> Int { dfs(numbers, target, 0, 0)}func dfs(_ numbers: [Int], _ target: Int, _ sum: Int, _ depth: Int) -> Int { if depth == numbers.count { return sum == target ? 1 : 0 ..
· → Problems
🥸 문제 소개오랜만에 코딩테스트 연습을 해보려고 아래의 문제를 간단하게 풀어보기로 했다.🤔 문제 풀이오랜만에 행렬을 마주하니 생각보다 시간이 조금 걸렸던듯... 행렬이 가물가물 했었다. 아래의 식을 활용하여 간단하게 코드를 작성할 수 있었다.func solution(_ a: [[Int]], _ b:[[Int]]) -> [[Int]] { let m = a.count let n = a[0].count let p = b[0].count var ans = Array(repeating: Array(repeating: 0, count: p), count: m) for i in 0..🔥 추가 학습아니 행렬은 너무너무너무나도 유용하고 유명한 수학 연산인데 Swift에서 기..
· → Problems
문제 소개난이도가 어려워질수록 문제 자체는 간단해지는 느낌이 든다. 히스토그램이 주어지고 넓이가 가장 큰 직사각형을 구하는 프로그램을 작성하는 문제이다.문제 풀이나는 스택을 활용하여 풀었다. 아래와 같은 히스토그램이 있다고 생각해보자.아래와 같이 stack의 마지막 요소의 높이가 추가하려는 높이보다 작다면 stack에 append해준다.마지막은 이제 4번째 인덱스가 3번째 인덱스의 높이 4보다 낮은 상황이다. 이제 이 상황에서 로직을 사용하게 된다. 넣으려는 요소의 -1을 하면 앞에 쌓인 블록들의 width가 나온다. 이것을 현재 블록의 높이, 블록의 인덱스의 차이를 이용하여 넓이의 최댓값을 갱신해준다. 만약 pop하고 마지막 값이 없다면 그냥 width를 곱해주면 된다.pop하는 값의 높이가 추가하려는..