문제 풀이 66

[백준] 18111 (마인크래프트)

#1 알고리즘#1-1 입력 읽기N개의 행과 M개의 열을 가진 2차원 배열 blockHeights를 선언한다. blockHeights 각 원소의 값에는 해당 위치의 높이를 할당한다. #1-2 문제풀이 개요땅이 고른 상태의 블록 갯수는 0, (N*M), (N*M)*1, (N*M)*2, (N*M)*3, ..., (N*M)*256 중 하나다. 이 중에서, (현재 놓여진 블록의 갯수) + (인벤토리 속 블록의 갯수)보다 작거나 같은 갯수들 중 최대값인 갯수를 구한다.그 갯수를 (N*M)로 나누면, 땅을 고르게 만들 수 있는 최대 높이가 된다. 0부터 해당 높이까지의 정수 범위를 내림차순으로 순회(인덱스 i)한다. 내림차 순인 이유는 문제의 조건에서, 같은 소요 시간일때는 더 큰 높이를 정답으로 제출하라고 했기 때..

[백준] 2579 (계단 오르기)

#1 알고리즘#1-2계단을 오르는 사람 입장에선, 땅에서부터 시작해 1칸 또는 2칸을 오르는 선택지만이 존재한다. 따라서 위와 같은 재귀함수의 형태를 잡을 수 있다.  #1-2또, 문제의 조건에서 밟은 계단이 3연속되면 안된다고 했으므로 해당 조건을 고려해 과 같이 구조를 짤 수 있다. #1-3하지만, stepOnStair()는 재귀호출을 2번 하므로 계단이 많아지면 처리량이 매우 커져버린다. 따라서, 재귀호출 과정에서 가지치기를 할 필요가 있다. 경우 a와 경우 b를 비교해보면, 4번 계단에서 b가 a보다 더 큰 점수를 가진다. 2579번 문제는 마지막 계단까지 누적된 최고 점수를 구하는 것이기에, 경우 b가 존재하는 이상 경우 a와 a에서 파생될 수 많은 경우의 수는 계산할 필요가 없다.또, 경우 b..

[백준] 2606 (바이러스)

#1 알고리즘 #2 코드 - 코틀린fun main() { readln() // 컴퓨터의 갯수는 풀이에 사용하지 않는다. val connectionCount = readln().toInt() val connections : ArrayList> = ArrayList() for(i : Int in 0.. = ArrayList() recursiveFindNextHost(connections, 1, virusHosts) println(virusHosts.size - 1) // 1번 컴퓨터 제외}fun recursiveFindNextHost(connections : ArrayList>, computerNumber : Int, virusHosts : ArrayList) { vir..

[백준] 1920 (수 찾기)

#1 알고리즘#1-1 이진 탐색 (Binary search)#1 알고리즘 #1-1 #1-2 이렇게 해서 x의 인덱스 i를 찾으면 좋겠지만, 이 x가 배열 values 어디에도 존재하지 않는 경우도 있을 것이다. 이 경우엔 어떻게 처리해야 할까? #1-3 업 앤 다운 게임은 우리나kenel.tistory.com시간 초과가 뜨지 않게 하기 위해서 배열에 이진 탐색을 수행한다.  #1-2 힙 정렬 (Heap Sort)#1 알고리즘 #1-1 힙(heap)이라는 영어 단어의 사전적 의미는 쌓아 놓은 무더기다. 그리고 이 단어는 프로그래밍에서도 사용된다. 첫째로 메모리 영역에서, 둘째로 자료구조에서다. 이 둘은 서로 다kenel.tistory.com이진 탐색을 수행하려면 먼저, 배열이 정렬되어있어야 한다. 나는 이..

[백준] 11723 (집합)

#1 알고리즘#1-1문제의 조건 자체는 쉽지만, 테스트 케이스가 아주 많다. 따라서 빨리 계산해야 한다. 그렇게 하기 위해서 비트 연산을 이용한다. 먼저, 십진수로 값이 0인 변수를 선언하고, 그 변수에 0비트가 20개 있다고 친다. 오른쪽에서부터 n번째 자리에 있는 비트가 n이 '집합'에 존재하는지의 유무를 표시한다고 생각한다. 1이면 존재하고, 0이면 존재하지 않는다. #1-2이 문제의 풀이를 위해 주요하게 사용할 비트 연산은 left shift 연산)이다. 코틀린에서는 해당 연산을 shl라는 연산자로 지원한다. 1 shl a는 2진법으로 (a + 1)번째 자리가 1이고 나머지는 0인 수를 도출한다. 따라서 (1 shl (a - 1))로 a라는 값을 가지는 수가 '집합'에 존재함을 나타낼 수 있다. ..

[백준] 2108 (통계학)

#1 알고리즘한 번의 for문으로 모든 걸 다 구하고 싶었다, 그 편이 성능에서 더 좋을 것이라는 생각에서였다. 하지만, 코드가 심각하게 길어지거나 코드가 짧은 대신 가독성이 좋지 않았다. 그래서 for문을 2번 쓰는 코드를 짰다. 첫번째 for문은 N개의 수를 읽어, 배열 valueCounts를 완성한다. 두번째 for문에선 완성된 배열 valueCounts를 순회하며 산술평균, 중앙값, 최빈값, 범위를 도출한다. #2 코드 - 코틀린import java.util.Queueimport java.util.LinkedListimport kotlin.math.roundToInt/*(1) 산술평균: Arithmetic mean(2) 중앙값: Median(3) 최빈값: Mode(4) 범위: Range*/fun ..

[백준] 10845 (큐)

#1 알고리즘java.util.Stack과는 달리 java.util.Queue는 클래스가 아니라 인터페이스다. 나는 java.util.Queue 인터페이스를 구현한 클래스인 LinkedList를 Queue로서 사용했다. last()는 확장 함수(Extension functions)다. #2 여담확장 함수 Iterable.last()가 기술된 _Collections.kt는 실제 위치가 kotlin-stdlib.jar/kotlin/collections에 있지는 않지만, 논리적인 구조상 파일 첫머리의 pakage에 kotlin.collections로 선언되어 있다. 참고로, _Collections.kt와 Collections.kt는 다른 파일이며 후자는 해당 디렉토리에 실제로 존재한다. 물론, 패키지 선언은 ..

[백준] 28417 (스케이트보드)

#1 알고리즘 퀵 정렬 (Quick Sort)#1 알고리즘 어떤 원소를 기준으로 잡을 것이냐는 아무래도 상관없다. 여기에서는 각 배열의 맨 끝 원소를 기준으로 잡기로 한다. 혹시라도 기준을 대략적으로라도 원소들의 평균값에 가깝게 잡kenel.tistory.com정렬 알고리즘은 여러 가지가 있다. 상황에 맞추어 가장 적절한 알고리즘을 골라야 하지만, 나는 알고리즘을 공부 중이므로 사용해 보지 않은 정렬 알고리즘 중에 아무거나 골라서 사용한다. 이 문제에 사용할 알고리즘은 퀵 정렬(Quick Sort)이다. #2 코드#2-1 자바import java.util.Scanner;public class Main { public static void main(String[] args) { Scann..