문제 풀이 66

[백준] 1764 (듣보잡)

#1 알고리즘#1-1 개요먼저, Input으로부터 '듣지 못한 사람'들을 읽어 들여 명단을 만든다. 그리고 '보지 못한 사람'들을 한 명씩 읽어 들이며, '듣지 못한 사람'의 명단에 존재하는지 확인한다. 존재한다면, 해당 이름을 '듣지도 보지도 못한 사람' 명단에 추가한다. 마지막으로, '듣지도 보지도 못한 사람' 명단을 (사전 순으로) 정렬한다. #1-2 배열 대신 HashSet 사용 Hash table - WikipediaFrom Wikipedia, the free encyclopedia Associative array for storing key-value pairs Hash tableTypeUnordered associative arrayInvented1953Operation Average Wor..

[백준] 1541 (잃어버린 괄호)

#1 알고리즘#1-1 하향식 동적 프로그래밍 동적 프로그래밍 (Dynamic Programming), 상향식(Bottom-up) 및 하향식(Top-down) 접근#1 알고리즘 #1-1 정의 동적 프로그래밍을 한 줄 요약하면 중복의 제거다. 정적(static)이라는 개념과 반대되는 개념으로서, 동적(dynamic)이라는 단어가 이름에 붙었다. 확실히 static이 붙을 만한 작업kenel.tistory.com하향식 동적 프로그래밍을 구현해 풀었다. Caching을 위한 객체로 HashMap를 사용했다. 예를 들어, 1 + 2 + 3 - 4 + 5 - 6 + 7라는 수식을 Caching하기 위해 makeListToKey()라는 함수를 만들었다 (#2 참조). 수식 makeListToKey()에 넣으면 "+1..

[백준] 9461 (파도반 수열)

#1 알고리즘#1-1 상향식 동적 프로그래밍 동적 프로그래밍 (Dynamic Programming), 상향식(Bottom-up) 및 하향식(Top-down) 접근#1 알고리즘 #1-1 정의 동적 프로그래밍을 한 줄 요약하면 중복의 제거다. 정적(static)이라는 개념과 반대되는 개념으로서, 동적(dynamic)이라는 단어가 이름에 붙었다. 확실히 static이 붙을 만한 작업kenel.tistory.com상향식 동적 프로그래밍을 구현해 풀었다.  #1-2 수열의 규칙(점화식) 찾기1, 1, 1, 2, 2, 3, 4, 5, 7, 9, ...문제에 제시된 위 수열은 p[n] + p[n+1] = p[n+3] 라는 간단한 점화식을 지니고 있다. #2 코드 - 코틀린/*수열 p가1, 1, 1, 2, 2, 3, ..

[백준] 5430 (AC)

#1 알고리즘배열을 실제로 뒤집거나, 원소를 삭제하는 연산은 높은 처리 시간을 요구한다. 따라서 배열을 실제로 뒤집는 대신 reversed = !reversed 연산으로 대체한다. 그리고 원소를 삭제하는 대신 reversed == false라면 startIndex++, reversed == true라면 endIndex--를 수행한다. #2 코드 - 코틀린lateinit var p: Arrayvar n: Int = -1lateinit var array: Arrayfun main() { val t = readln().toInt() for (i: Int in 0.. { val inputted = readln() val submit: Array = Array(inputted.length) ..

[백준] 2805 (나무 자르기)

#1 개요#1-1 문제 이해'나무를 자르는 높이(cuttingHeight)'가 무엇인지를 묻는 문제다. 그리고 cuttingHeight의 범위는 0 ~ 1,000,000,000이다. 따라서, cuttingHeight를 1씩 증가시켜서 일일히 확인하는 방법은 시간 관계상 힘들다. 다행인 것은 cuttingHeight가 증가함에 따라, 얻어지는 '목재의 량(woodQuantity)'의 감소한다는 사실이다. cuttingHeight가 감소하면 woodQuantity는 그대로거나 감소한다. cuttingHeight가 index고, woodQuantity는 value인 배열 woods가 있다고 가정하자. 그 배열의 모습은 아래와 같다. #1-2 가상의 배열 'woods'M이 285라고 가정한다. 그리고 M값을 만..

[백준] 1463 (1로 만들기)

#1 알고리즘 동적 프로그래밍 (Dynamic Programming), 상향식(Bottom-up) 및 하향식(Top-down) 접근#1 알고리즘 #1-1 정의 동적 프로그래밍을 한 줄 요약하면 중복의 제거다. 정적(static)이라는 개념과 반대되는 개념으로서, 동적(dynamic)이라는 단어가 이름에 붙었다. 확실히 static이 붙을 만한 작업kenel.tistory.com하향식 동적 프로그래밍을 구현해 풀었다. 이 문제가 까다로운 이유는, 하향식 동적 프로그래밍에서 캐싱(Caching)을 할 때, 어떤 값을 캐싱해야할 지 난감하다는 것이다. 여러가지 경우들 중에서 최솟값을 골라서 캐싱해야 하는데 그 구현이 처음 문제를 봤을 땐 꽤 복잡해보였다. 나는 ArrayList에 재귀호출의 return값들을 ..

[백준] 2630 (색종이 만들기)

#1 알고리즘색종이를 정직하게 가로 절반 세로 절반씩 자르기 때문에 어렵지 않은 문제다. 이 정직한 조건이 없었더라면 훨씬 까다로웠을 것이다. 아래의 재귀 함수를 이용해 문제를 풀었다. 1. 색종이가 단색인 지 확인하고, 맞다면 해당 색의 갯수를 +1 하고 함수를 종료한다.2-1. 현재 색종이를 가로 절반 세로 절반 자른 좌측 상단(↖) 색종이 범위에 대해 재귀 호출을 수행한다.2-2. 현재 색종이를 가로 절반 세로 절반 자른 좌측 하단(↙) 색종이 범위에 대해 재귀 호출을 수행한다.2-3. 현재 색종이를 가로 절반 세로 절반 자른 우측 상단(↗) 색종이 범위에 대해 재귀 호출을 수행한다.2-4. 현재 색종이를 가로 절반 세로 절반 자른 우측 하단(↘) 색종이 범위에 대해 재귀 호출을 수행한다. #2 코..

[백준] 21736 (헌내기는 친구가 필요해)

#1 알고리즘재귀 함수를 이용해 푼다. 그 함수의 시작점은 도연이의 좌표다. 함수의 내용은 아래와 같다. 1. 매개변수로 받은 좌표가 캠퍼스 영역을 벗어났거나, 값이 'X'면 함수를 종료한다.2. 해당 좌표에 새내기가 있다면 '새내기 카운트'를 +1한다.3. 이제 해당 좌표는 더 볼 일 없으므로 좌푯값에 'X'를 대입한다.4-1. 현재 좌표에서 한 칸 동쪽 좌표를 인수로 가지는 재귀 호출을 수행한다. 4-2. 현재 좌표에서 한 칸 서쪽 좌표를 인수로 가지는 재귀 호출을 수행한다.4-3. 현재 좌표에서 한 칸 남쪽 좌표를 인수로 가지는 재귀 호출을 수행한다.4-4. 현재 좌표에서 한 칸 북쪽 좌표를 인수로 가지는 재귀 호출을 수행한다. #2 코드 - 코틀린var n: Int = -1var m: Int = ..

[백준] 1074 (Z)

#1 알고리즘N = 2 이상인 큰 문제를, N = 1이 될 때까지 작은 문제로 쪼개어 푼다. 그러려면 f(큰 문제) = 작은 문제인 f(x)를 알아야 한다. 규칙을 수식으로 표현해내어야 한다. '바둑판'의 영역을 4개로 나누어보자. 그리고 각 영역의 맨 ↖에 있는, 영역의 첫 원소들을 비교한다. 영역 m ~ 영역 (m + 1) 간 첫 원소의 값 차이는 N = 1일 때 1, N = 2일 때 4, N = 3일 때 16, N = 4일 때 64 ... 다. 이를 일반화하면 영역 간 첫 원소의 값 차이(interAreaFirstElementDifference)는 2(N-1)*2이다. 즉 어떤 영역 m에 있어, 칸마다 써진 수는 (영역 0의 수) + m * 2(N-1)*2다. 보라색 글씨 부분을 축적된(accumu..

[백준] 10816 (숫자 카드 2)

#1 코드 - 코틀린import java.lang.StringBuilderfun main() {    // Initiation    val n = readln().toInt()    val cardNumberInputs = readln().split(" ")    val cardNumbers = Array(n) {0}    for(i: Int in 0..()    for(cardNumber in cardNumbers) {        if(cardCountMap[cardNumber] == null) {            cardCountMap[cardNumber] = 1        } else {            cardCountMap[cardNumber] = cardCountMap[cardNum..