Algorithm
-
백준 15686 치킨 배달Algorithm/BOJ 2020. 7. 13. 18:42
출처: www.acmicpc.net/problem/15686 분류: 완전탐색 접근방식 집과 치킨집이 주어지고 집에서 제일 가까운 치킨집까지의 거리가 집의 치킨거리가 됩니다. 모든 집의 치킨 거리를 합친 값이 도시의 치킨거리가 됩니다. 치킨집을 M개 만큼 선택했을 때 최소가 되는 치킨거리를 구하는 문제입니다. 우선 집과 치킨집의 위치를 먼저 저장해두고 치킨집을 M개 골랐을 때의 치킨 거리들을 구하면 됩니다. 해결방법 let nm = readLine()!.split(separator: " ").map{Int($0)!} var board = [[Int]]() for _ in 0..
-
Programmers Lv3) 방문 길이Algorithm/Programmers 2020. 7. 10. 13:54
출처: programmers.co.kr/learn/courses/30/lessons/49994 분류: Lv3 접근방식 -5 ~ 5 까지의 정사각형에서 U, D, R, L 중 하나로 이동 방향들이 주어질 때, 처음 이동한 길의 개수를 세는 문제입니다. 저는 처음에 Set 로 이루어진 11x11 맵을 만들고 각 칸에 이동한 위치를 넣는 엄청나게 무식한 방법을 사용했는데, 단순히 새로운 길의 개수만 알면 되기 때문에 이럴 필요 없이 그냥 좌표만 가지고도 해결할 수 있는 문제입니다. 갈 수 있는 길이라면 그 길을 그냥 Set 에 String 으로 때려박으면 매우 간단해집니다. 주의할 점은 (0, 0) -> (0, 1) 로 이동했다면 반대로 오는 (0, 1) -> (0, 0) 도 같은 길로 체크해야 합니다. 해결..
-
BOJ 14889 스타트와 링크Algorithm/BOJ 2020. 7. 8. 16:17
출처: www.acmicpc.net/problem/14889 분류: 완전탐색 접근방식 짝수의 사람과 두 사람이 같은 팀일 때 능력치가 주어지고, 사람들을 두 팀으로 나눌 때, 능력치의 차이를 구하는 문제입니다. 핵심 포인트는 크게 두 가지로 볼 수 있습니다. 1. 사람들을 두 팀으로 나누기 2. 각 팀의 능력치를 구하기 주의할 점은 각 팀의 능력치를 구할 때 팀원 두 쌍의 능력치를 각각 모두 더해줘야 합니다. 만약 1, 3, 6이 한 팀이고 두 사람이 팀일 때 능력치를 Sij 라고 한다면, S13 + S16 S31 + S36 S61 + S63 위 6가지 경우를 모두 더해줘야 합니다. 해결방법 팀을 나누는 건 3명을 뽑으면 나머지 팀은 자동으로 완성되므로 3명을 뽑을 때까지 재귀로 구현했습니다. func ..
-
백준 1041 주사위Algorithm/BOJ 2020. 6. 30. 15:37
출처: www.acmicpc.net/problem/1041 분류: Greedy 접근방식 주사위를 쌓아서 정육면체를 만들 때 각 주사위에서 서로 마주보는 면이 동시에 보일 수는 없습니다. 따라서 마주보는 면이 안 나오게 잘 계산해서 최소값을 구해줘야 합니다. 주어진 도면에서 각 주사위의 마주보는 면은 (0, 5), (1, 4), (2, 3) 입니다. (주사위 1개인 경우 제외) 만들어진 정육면체에서 각 주사위는 3가지 케이스 밖에 생기지 않고 각 케이스의 개수는 아래와 같습니다. 세 면이 보이는 경우 4개 ( 각 모서리 위쪽 ) 두 면이 보이는 경우 4(N-1) + 4(N-2) (옆면 모서리 + 위쪽 모서리) 한 면이 보이는 경우 4N(N-2) + (N-2)(N-2) (테두리를 제외한 옆면 + 테두리를 제..
-
BOJ 1439 뒤집기Algorithm/BOJ 2020. 6. 22. 15:42
출처: www.acmicpc.net/problem/status/1439/74/1 분류: Greedy 접근방식 0이 연속되는 구간, 1이 연속되는 구간을 계산해서 더 작은 구간을 다 뒤집으면 되니까 더 적은 구간을 출력해주면 되는 문제입니다. 해결방법 let str = readLine()! var zeroSection = 0 var oneSection = 0 var current: Character? for char in str { guard let curr = current else { current = char continue } if char != curr { if char == "0" { zeroSection += 1 } else { oneSection += 1 } current = char } }..
-
백준 2812 크게 만들기Algorithm/BOJ 2020. 6. 22. 15:27
출처: www.acmicpc.net/problem/2812 분류: Greedy 접근방식 주어진 수에서 k개를 지워서 가장 큰 수를 만들어야 하는 문제입니다. 앞에서부터 스택에 담는데, 스택의 뒤에서부터 해당 수보다 작은 수는 다 지워내고 추가합니다. 저희는 k개를 지워야 하므로 지울 때마다 k의 개수를 줄여나갑니다. k가 0이 되었다면 더이상 지울만큼 지웠으므로 그냥 스택에 담아줍니다. 정리해보면 주어진 문자열에서 현재 확인할 숫자 n을 가지고 스택을 뒤에서부터 확인하면서 크거나 같을 때까지 반복합니다. // 현재 대상이 되는 수 n // stack의 뒤에서부터 확인하는 인덱스 i while i >= 0 { if n = 0 { if cuttedNumber[idx] >= originChar { // 비교대..
-
백준 3019 빵집Algorithm/BOJ 2020. 6. 18. 15:35
출처: www.acmicpc.net/problem/3109 분류: 그리디, DFS 접근방식 첫번째 열부터 차례대로 연결할 수 있는지 탐색하면 되는 문제입니다. 처음에 그냥 풀었다가 시간초과가 나고.. dfs를 사용해서 풀었는데, 주의할 건, 다음으로 연결할 수 있는 경우는 오른쪽, 오른쪽 위, 오른쪽 아래 3가지라서 다음 경우까지 모두 해봐야 하기 때문에 dfs에서 결과를 그냥 리턴하면 안되고 true일 경우에만 리턴해야 합니다. 해결방법 let n = readLine()!.split(separator: " ").map{Int($0)!} var map = [[Bool]]() for _ in 0.. Bool { return r >= 0 && c >= 0 && r < n[0] && c < n[1] } var..
-
백준 1507 궁금한 민호Algorithm/BOJ 2020. 6. 18. 13:33
출처: www.acmicpc.net/problem/1507 분류: Greedy, Floyd Wharshall 접근방식 플로이드 와샬 알고리즘을 사용했습니다. 플로이드 와샬 알고리즘은 모든 정점에서 모든 정점으로의 최소 비용을 구하는 알고리즘입니다. 이 문제는 그 결과가 주어진 경우라고 할 수 있는데요, 주어진 간선 중에서 가중치가 가장 작은 것부터 연결해가면서 플로이드 와샬로 다시 가중치 그래프를 완성시켜 나갑니다. 연결하려고 하는 간선의 가중치가 만들고 있는 가중치 그래프와 같다면 이미 다른 경로를 통해 연결이 되어 있으므로 연결하지 않습니다. 작은 경우에만 새로 연결합니다. 불가능한 경우에는 -1을 출력하라고 했으니, 복귀를 다 마친 다음에 원본과 다르다면 -1을 출력해줍니다. 해결방법 let n =..