[완전 탐색] 백준 실버4 1018번: 체스판 다시 칠하기(Swift)
·
코테
https://www.acmicpc.net/problem/1018 1018번: 체스판 다시 칠하기 첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다. www.acmicpc.net 풀이과정 위 문제는 검정색(B)과 흰색(W)이 무작위로 색칠되어 있는 체스판을 8x8로 잘라 올바르게 다시 색을 칠할 때 칠해야 하는 정사각형의 최소 개수를 출력하는 문제이다. 위 조건에 올바른 체스판의 경우는 두 가지이다. 왼쪽 상단이 W로 시작하는 체스판과 B로 시작하는 체스판이다. 두 올바른 체스판과 임의로 잘라낸 8x8의 체스판과 비교하여 색이 다른 정사각형의 수를 찾으면 된다. l..
[구현] 백준 실버3 2503번: 숫자 야구(Swift)
·
코테
https://www.acmicpc.net/problem/2503 2503번: 숫자 야구 첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트 www.acmicpc.net 문제 풀이 위 문제는 영수의 질문 결과를 통해 조건에 만족하는 수의 개수를 찾아 출력하는 문제이다. 먼저, 입력값과 탐색 값을 비교하여 스트라이크와 볼의 스코어를 계산하는 메서드를 구현해 준다. func checkScore(_ target: [Character], _ num: [Character]) -> (Int, Int) { var sScoer = 0 var bScoer = 0 for i in ..
[백트래킹 + 구현] 백준 실버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..