문제 소개문제 자체는 아주 간단하지만 N이 10억이하의 자연수라는 조건이 있기 때문에 1부터 숫자를 늘려가며 판별하면 무조건 시간 초과가 걸린다. 문제 풀이let input = readLine()! let a = Array(input.reversed()).map { Int(String($0))! } let n = Int(input)! var ans = Array(repeating: 0, count: 10) for (i, e) in a.enumerated() { let p = Int(pow(10.0, Double(i))) for j in 0...9 { ans[j] += n / (p * 10) * p } if e > 0 { for j in 1..
분류 전체보기
문제 소개도넛 모양 그래프, 막대 모양 그래프, 8자 모양 그래프들이 있습니다. 이 그래프들은 1개 이상의 정점과, 정점들을 연결하는 단방향 간선으로 이루어져 있습니다. 크기가 n인 도넛 모양 그래프는 n개의 정점과 n개의 간선이 있습니다. 도넛 모양 그래프의 아무 한 정점에서 출발해 이용한 적 없는 간선을 계속 따라가면 나머지 n-1개의 정점들을 한 번씩 방문한 뒤 원래 출발했던 정점으로 돌아오게 됩니다. 도넛 모양 그래프의 형태는 다음과 같습니다.크기가 n인 막대 모양 그래프는 n개의 정점과 n-1개의 간선이 있습니다. 막대 모양 그래프는 임의의 한 정점에서 출발해 간선을 계속 따라가면 나머지 n-1개의 정점을 한 번씩 방문하게 되는 정점이 단 하나 존재합니다. 막대 모양 그래프의 형태는 다음과 같습..
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..