문제 소개https://www.acmicpc.net/problem/27172약수면 +1 나누어 떨어졌다면 -1 점을 갖게 되는 게임에서 결과를 출력하는 문제이다.문제 풀이이중 for 문으로 풀게 된다면 시간초과가 나게 된다. 따라서 다른 방법으로 풀어야 했다. 우선 길이가 1000001 인 nums 배열을 만들고, 어떠한 수가 등장했는지를 판별한다. 그리고 주어진 숫자의 배수를 판별하여 등장했다면 주어진 숫자에 +1 을 해주고 배수의 숫자에는 -1 을 해주면 된다.import Foundation let n = Int(readLine()!)! let input = readLine()!.split(separator: " ").map { Int($0)! } var nums = Array(repeating: f..
→ Problems
문제 소개https://www.acmicpc.net/problem/2467 문제 풀이정렬이 되어있으니 투포인터 알고리즘으로 풀면 된다.import Foundation let n = Int(readLine()!)! var solutions = readLine()!.split(separator: " ").map { Int($0)! } var value = 2_000_000_000 var left = 0 var right = n-1 var answer = (solutions[0], solutions[n-1]) while left < right { let sum = solutions[left] + solutions[right] if abs(sum) < value { value = abs(sum) answer =..
문제 소개다각형의 면적을 구하는 문제이다.문제 풀이CCW 알고리즘이 문제는 CCW(Count Clockwise) 알고리즘을 사용했다. 단순히 정답만 궁금하다면 아래 정답코드를 참고하면 된다. 기하학이 나와서 문제가 골드인데 사실 공식만 안다면 단순한 구현문제이다. 솔직히 벡터의 외적을 사용하지 않고 이 문제를 쉽게 푸는 방법을 모르겠다...두 백터의 외적을 통해 벡터가 시계방향인지, 반시계방향인지 판별할 수 있는데, 아래의 코드로 CCW 를 구현할 수 있다.func ccw(_ A: Point, _ B: Point, _ C: Point) -> Int { return (B.x - A.x) * (C.y - A.y) - (B.y - A.y) * (C.x - A.x) } 이 벡터의 외적을 2로 나눈 후 절댓값이..
문제 소개문제 풀이bfs 를 두번 활용하여 구했다. 물이 퍼지는 것을 moveWater() 로 구현했고, 고슴도치가 움직이는 것도 bfs 를 활용하여 구현했다.import Foundation let rc = readLine()!.split(separator: " ").map { Int($0)! } let (r, c) = (rc[0], rc[1]) let ds = [(1, 0), (0, 1), (-1, 0), (0, -1)] var map = [[String]]() var queue: [(Int, Int, Int)] = [] var idx = 0 var widx = 0 var water: [(Int, Int, Int)] = [] var cave = (-1, -1) for i in 0.. time { bre..
문제 소개벽이 움직이는 미로를 탈출하는 문제이다.문제 풀이벽이 아래로 움직이기 때문에 i 와 j 를 바꿔서 배열에 넣어주고 round 마다 +1 을 해주어 갈 수 있는지 없는지를 판별했다.import Foundation let moves = [(1, -1), (1, 0), (0, -1), (0, 0), (-1, 0), (0, 1), (-1, -1), (-1, 1), (1, 1)] var walls = Array(repeating: [Int](), count: 8) for i in 0.. idx { let popped = queue[idx] idx += 1 if popped.0 == 0 && popped.1 == 7 { print(1) exit(0) } if visit.count == popped.2 { ..
문제 소개벽 부수기 시리즈! 이번에는 낮에만 블록을 깰 수 있다는 제약조건이 있다.문제 풀이시간 초과와 메모리 초과 때문에 좀 고생을 한 것 같다.시간 초과시간 초과의 경우 의외로 벽을 부시는 경우를 앞쪽에 둬서 해결이 되었다.메모리 초과최대한 요소를 늘리지 않으려고 했다. cost를 2로 나눈 나머지로 낮과 밤을 판별하니 메모리 초과가 나지 않았다. 큐를 구현하지 않고 풀이import Foundation let nmk = readLine()!.split(separator: " ").map { Int($0)! } let (n, m, k) = (nmk[0], nmk[1], nmk[2]) let ds: [(i: Int, j: Int)] = [(1, 0), (-1, 0), (0, 1), (0, -1)] var..
문제 소개 문제 풀이벽 부수기 4 문제랑 비슷한데 벽을 부수는 횟수가 k 로 주어진다는 차이점이 있다.import Foundation let nmk = readLine()!.split(separator: " ").map { Int($0)! } let (n, m, k) = (nmk[0], nmk[1], nmk[2]) let ds: [(i: Int, j: Int)] = [(1, 0), (-1, 0), (0, 1), (0, -1)] var map = [[Int]]() var visited = Array(repeating: Array(repeating: Array(repeating: false, count: m), count: n), count: k+1) for _ in 0.. idx { let poped = ..
문제 소개문제 풀이BFS, DFS 두가지 풀이 방법이 있다. 시간은 둘다 22ms, 24ms 로 별 차이 없는 듯 하다.BFSimport Foundation let s = readLine()! let t = readLine()! func bfs() { var queue = [s] var idx = 0 while queue.count > idx { let poped = queue[idx] idx += 1 if poped == t { print(1) exit(0) } if poped.count > 50 { break } if t.contains(poped) || t.contains(String(poped.reversed())) { queue.append(poped + "A") queue.append(Stri..