[구현 + 재귀] 백준 골드5 14891번: 톱니바퀴(Swift)
·
코테
https://www.acmicpc.net/problem/14891 14891번: 톱니바퀴 총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴 www.acmicpc.net 풀이과정 해당 문제는 4개의 톱니바퀴가 있으며, 특정 톱니를 시계방향 또는 반시계 방향으로 회전시켰을 때 왼쪽과 오른쪽에 있는 톱니의 맞닿은 부분이 서로 다른 극이면 영향을 받아 회전한 톱니의 반대 방향으로 회전한다. 모든 회전이 끝났을 때 12시 방향의 극에 따라 점수를 계산하고 출력하는 문제이다. 톱니의 극은 배열로 주어지며, 회전을 추적하기 위해 12시 방향을 가리키는 변수를 두어 문제를..
[백트래킹 + 구현] 백준 실버1 14888번: 연산자 끼워넣기(Swift)
·
코테
https://www.acmicpc.net/problem/14888 14888번: 연산자 끼워넣기 첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱 www.acmicpc.net 문제풀이 해당 문제는 주어진 수와 연산자를 조합하여 최솟값과 최댓값을 구하는 문제이다. 최솟값과 최댓값을 구해야하므로 백트래킹 기법을 사용하여 모든 경우의 수를 탐색해야 한다. let n = Int(readLine()!)! var numArr: [Int] = readLine()!.split(separator: " ").map { Int($..
[백트래킹 + 구현] 백준 실버2 14889번 스타트와 링크(Swift)
·
코테
https://www.acmicpc.net/problem/14889 14889번: 스타트와 링크 예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다. www.acmicpc.net 문제풀이 해당 문제는 N명이 주어지면 N/2명을 뽑아 뽑힌 사람과 뽑히지 않은 사람으로 팀을 나눠 팀 간 능력치 차이의 최솟값을 구하는 문제이다. 때문에 문제의 핵심은 N/2명을 뽑아 두 그룹으로 나눠 백트래킹을 사용하여 모든 능력치의 경우의 수를 계산하고 최솟값을 구하는 것이다. 백트래킹이란? 해를 찾는 도중 해가 아니어서 막히면, 되돌아가서 다시 해를 찾아가는 기법 백트래킹은 쉽게 말해 깊이 우선 탐색(DFS)에 ..
[다이나믹 프로그래밍 + 그리디] 백준 실버5 14916번: 거스름돈(Swift)
·
코테
https://www.acmicpc.net/problem/14916 14916번: 거스름돈 첫째 줄에 거스름돈 액수 n(1 ≤ n ≤ 100,000)이 주어진다. www.acmicpc.net 문제풀이 위 문제는 거스름돈 5원과 2원으로 주어진 돈을 거슬러 줘야 하는데 이때 동전을 최소한으로 사용하여 거슬러 줘야 한다. 먼저, 15원까지 동전의 수를 나열해 보았다. 나열해 본 결과 반복되는 패턴이 있음을 알 수 있다. 주어진 돈이 5의 배수가 아니면 주어진 돈 n 원에 대한 동전의 개수는 n - 2원에 대한 동전의 개수 + 1인 것을 알 수 있었다. 때문에 위 문제는 다이내믹 프로그래밍을 활용하여 문제를 해결할 수 있다. var n = Int(readLine()!)! var result = 0 var dp..
[해시] 백준 실버4 10816번: 숫자 카드2(Swift)
·
코테
https://www.acmicpc.net/problem/10816 10816번: 숫자 카드 2 첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10, www.acmicpc.net 풀이과정 해당 문제는 Dictionary을 활용하면 문제를 해결할 수 있다. let _ = Int(readLine()!)! var nList: [Int] = readLine()!.split(separator: " ").map { Int($0)! } let _ = Int(readLine()!)! var mList: [Int] = readLine()!.split(se..
[완전 탐색] 백준 실버2 3085번: 사탕 게임(Swift)
·
코테
https://www.acmicpc.net/problem/3085 3085번: 사탕 게임 예제 3의 경우 4번 행의 Y와 C를 바꾸면 사탕 네 개를 먹을 수 있다. www.acmicpc.net 풀이과정 이번 문제는, N x N 보드에 무작위로 4가지 색의 사탕이 올라가있다. 보드에 올라가있는 사탕 중 인접한 색이 다른 사탕 2개의 자리를 바꿔 가로 혹은 세로로 연속한 같은 색의 사탕의 최댓값을 출력하는 문제이다. 문제를 처음 읽고 풀이를 생각했을 때 색이 서로 다른 인접한 사탕 2개를 탐색하여 위치를 변경하고 동일한 색의 연속한 사탕의 수를 계산하였다. // 첫 제출 let N = Int(readLine()!)! var input: [[String]] = [] var map: [[String]] = []..