[백준] 14891 톱니바퀴
·
Algorithm/Algorithm (문제풀이)
🔒 문제 🧠 아이디어 톱니바퀴 회전 아이디어 시계 방향 반시계 방향 자료구조로 덱 사용 회전 방향을 결정하는 것은 index2, 6 🔑 Kotlin Code import java.io.BufferedReader import java.io.InputStreamReader import java.util.* import kotlin.collections.ArrayDeque private fun rotateGears(gearNum: Int, gears: Array, gearRotateDirection: IntArray) { when (gearRotateDirection[gearNum]) { -1 -> { gears[gearNum].addLast(gears[gearNum].removeFirst()) } 1 -> ..
[Kotlin] Priority Queue
·
JVM/Kotlin
언제 사용하나? 가장 큰 값이나 가장 작은 값을 빠르게 찾아내도록 만들어진 자료규조. 자료구조는? Priority Heap == Heap + Complete Binary Tree Binary Search Tree 와 달리 중복을 허용하고 같은 레벨의 노드간에는 정렬 되있지 않은 느슨한 정렬 상태를 유지한다. 주요 연산 및 시간 복잡도 Operation Time Complexity Insert (add) O (log N) Find (contains) O (N) Find2 (peek) O (1) Delete (poll, remove) O (log N) Delete2 (remove(element)) O (N) Binary Tree 인데 왜 Find 에 O(N) 이 걸리나? PriorityQueue.contai..
[백준] 2457 공주님의 정원
·
Algorithm/Algorithm (문제풀이)
🔒 문제 🧠 아이디어 1. 월-일을 모두 Days (일) 로 통일 1월 1일-> 1 12월 31일 -> 365 로 치환한다. 이를 위해 HashMap 을 생성하여 각 월마다 일수를 매핑시켜주었다. private final HashMap monthDayMap = new HashMap(); { monthDayMap.put(0, 0); monthDayMap.put(1, 31); monthDayMap.put(2, 28); monthDayMap.put(3, 31); monthDayMap.put(4, 30); monthDayMap.put(5, 31); monthDayMap.put(6, 30); monthDayMap.put(7, 31); monthDayMap.put(8, 31); monthDayMap.put(9, 3..
[Algorithm] 비트연산자
·
Algorithm/Algorithm (이론)
비트마스킹 기법을 사용하기 위해 익혀야할 비트연산자를 정리해보자. 1. 길이 N을 갖는 이진수를 모두 1 (flag on) 상태로 만들기 표현식 $$ (2 11111 // 십진수로는 2 ^ N - 1 로 표현가능하다. // 2 ^ 6 - 1 == 63 val num = (1 shl (5 + 1)) - 1 println("=============") println("All flag on") println(toDecimalString(num)) println(toBinaryString(num)) println("=============") } 결과 2. 특정 index flag bit 키기 표현식 $$ num\; or \; (1 11111 // 십진수로는 2 ^ N - 1 로 표현가능하다. // 2 ^ 6 ..
[백준] 14499 주사위 굴리기
·
Algorithm/Algorithm (문제풀이)
🔒 문제 ⚠️ 실수 노트 1번 ~ 6번에 대해 전개도가 있으므로 동서남북 이동시 오게되는 윗 칸을 저장하는 6개 면을 의미하는 객체 생성 각 객체는 값을 가지고 객체별로 동서남북으로 주사위 방향이 이동했을 때 표현하는 객체 값을 고정해둠. 총 6개 면에 대해 동서남북 주사위 굴리기시 표현되는 윗칸을 '고정'하면 안된다. 굴리면서 보는 각도가 달라질 수 있기 때문이다. // 전개도의 각 면에대해 data class 를 미리 만들고 초기화 // ⚠️ 틀린 접근 방법 data class DiceSquare(var curVal: Int = 0, var east: DiceSquare?, var west: DiceSquare?, var south: DiceSquare?, var north: DiceSquare?, ..
[백준] 11559 Puyo Puyo
·
Algorithm/Algorithm (문제풀이)
🔒 문제 🧠 아이디어 가로 6, 세로 12를 갖는 테트리스 판의 일종이다 우선 4개 이상의 뿌요 조각이 인접해있을 때만 '.'으로 대치한다. + '.'으로 대치된 조각이 있으면 아래로 뿌요조각을 당겨야한다. 뿌요 조각을 당기는 아이디어가 핵심이다. 세로 막대를 의미하는 LinkedList 를 미리 6개 생성해두고 '.'만을 모두 제거해 남은 뿌요 조각을 뿌요판에 붙여넣는다. 또, 판 크기 자체가 12 * 6 == 72회로 작으므로 전체 판을 매번 긁어도 시간 초과하지 않겠다는 직관을 가지고 풀이했다. 하나의 뿌요조각이 다음 단계로 이어지려면 매번 4조각씩 해도 총 18라운드가 최대다. 72 * 72 * 18 => 약 10만 으로 절대 시간초과가 나지않는다. 🔑 Kotlin Code import java...