Bitmask란?Bitmask는 단어 그대로 비트에 마스킹을 한다라는 뜻인데, 비트 연산을 활용하여 데이터를 효율적으로 저장하고 조작하는 방법이다. 비트(Bit)는 컴퓨터 과학에서 정보의 가장 작은 단위이다. 비트는 이진법(Binary System)을 기반으로 하며, 두 가지 값(0, 1) 중 하나를 가질 수 있다. 비트연산Bitmask를 하기 전에 비트 연산에 대해서 알아야 한다. 비트 연산에는 AND, OR, XOR, NOT, Shift연산이 있다. 아래와 같은 게이트들을 접해봤을 것이다. (직접 그려봤는데 생각보다 그리기 힘들다 😅)처음에는 OR과 XOR이 약간 헷갈렸는데 아래의 개념으로 생각한다면 아주 이해가 쏙쏙 된다.AND 연산 ( & )1101 & 1011 을 하게 되면 두 비트가 모두 1..
전체 글
문제 소개https://www.acmicpc.net/problem/14891 엄청난 구현문제... (?) 문제 풀이톱니바퀴 돌리기큐로 구현하는것이 일반적이지만 여기서는 배열의 갯수와 성분들이 작아서 간단하게 removeLast, removeFirst 메서드로 구현했다.func rotateGear(_ i: Int, _ isClockwise: Bool) { if isClockwise { gears[i].insert(gears[i].removeLast(), at: gears[i].startIndex) } else { gears[i].append(gears[i].removeFirst()) } } 같이 돌아가는 톱니바퀴 그룹화union, find 알고리즘을 사용했다. 결국 같은 그룹안에 있어야 톱니바퀴가 돌아가는..
알고리즘뿐만 아니라 유용하게 쓰일만한 고차함수들을 여러 개 정리해 보았다. map컬렉션의 각 요소에 동일한 변환을 적용하고, 변환된 요소들로 새로운 배열을 생성한다. 아래와 같이 사용이 가능하다. name in을 $0로 바꿔서 대신할 수 있다.let names = ["Kim", "Lee", "Park", "Choi"]let lowercaseNames = names.map { name in name.lowercased()}let lowercaseNames = names.map { $0.lowercased() }let letterCounts = names.map { $0.count }print(lowercaseNames) // ["kim", "lee", "park", "choi"]print(letter..
문제 소개정말 정말 간단한 문제라서 10분도 안 걸릴 줄 알았지만 생각보다 시간을 쓴 문제... 너무 어려운 거에만 집중하지 말고 이런 단순한 문제에도 집중해야 한다는 것을 깨달았다. 문제 풀이정답 코드는 아래와 같이 단순하다.while let n = readLine(), let div = Int(n) { var num = 1, count = 1 while num % div != 0 { num = (num * 10 + 1) % div count += 1 } print(count) } 입력값여러개의 테스트 케이스로 이루어져 있기 때문에 while을 통해서 readLine()을 사용해 입력값을 계속 받도록 해야 했다.while let n = readLine(), let div = Int(n) { ... } ..
문제 소개주사위를 어떻게 굴릴것인지가 관건.문제 풀이이렇게 주사위가 동서남북으로 굴러간것을 표시하면 이렇게 된다. [위, 북, 동, 서, 남, 아래] 순으로 표시하면 위처럼 나타낼 수 있다. 나머지는 구현문제이다.import Foundation let nmxyk = readLine()!.components(separatedBy: " ").map { Int($0)! } let (n, m, x, y, k) = (nmxyk[0], nmxyk[1], nmxyk[2], nmxyk[3], nmxyk[4]) var map = Array(repeating: [Int](), count: n) for i in 0..
문제 소개 문제 풀이위상정렬을 활용하였다. Kahn 알고리즘과 DFS를 활용한 위상정렬이 있다.Kahn 알고리즘Kahn 알고리즘은 진입차수를 계산하면서 진입차수가 0인 것을 queue에 차례로 넣는다. 진입차수라고 하면 아래와 같이 들어오는 화살표의 갯수이다.DFS 알고리즘dfs 탐색을 거꾸로 하면 위상정렬이 된다. dfs 탐색을 하는데 dfs 를 한 뒤 마지막 정점을 stack에 저장해둔뒤 마지막 요소부터 꺼내면 그것이 위상정렬이 되는 것이다.여기서 6 5 3 4 2 1 을 거꾸로 한 1 2 4 3 5 6 이 위상정렬을 한 결과가 된다. 문제 풀이 코드Kahn 알고리즘 활용import Foundation let nm = readLine()!.split(separator: " ").map { Int($0..
문제 소개자연수 N 이 주어지면 N 보다 작은 연속된 소수의 합으로 나타낼 수 있는 경우의 수를 출력하는 문제. 문제 풀이소수는 에라토스테네스의 체를 통해서 구했고, 연속된 소수의 합은 투포인터 알고리즘을 사용하였다.import Foundation let n = Int(readLine()!)! // 입력값이 1일경우 빠른 처리 if n == 1 { print(0) exit(0) } // 에라토스테네스의 체 var isPrimeNumber = Array(repeating: true, count: n+1) var primeNumber = [Int]() let sqrtN = Int(sqrt(Double(n))) for i in 2..