본문 바로가기

전체보기

(450)
[450] 백준 15486번 - 퇴사 2(DP 역순) 1. 문제https://www.acmicpc.net/problem/154862. 문제 이해상담원에게 상담을 할 수 있는 기간, 그리고 그 기간동안 매일 하나씩 상담이 주어집니다.각 상담은 완료까지 며칠이 걸리는지가 주어지고, 완료했을 때 가치가 주어집니다.상담원은 상담을 선택할 수도 있고 안 할 수도 있습니다.대신 상담이 진행 중이라면 새로운 상담을 선택할 수 없습니다.이 때 상담원이 얻을 수 있는 최대 가치를 구하는 문제입니다.각각 n개의 칸에서 시작하는 적당한 길이(T)의 막대가 있고, 막대에 값(P)이 정해져 있는 상황으로 바꾸어 생각할 수 있습니다.겹치지 않게, 그리고 n을 넘지 않게 막대를 적당히 골라, 값의 합을 가장 크게 하는 문제로 바꾸어 이해할 수 있습니다.3. 해결 방법막대를 순서대로..
[449] 완전수 쉽게 배우기 1. 완전수란 무엇일까?완전수는 자신을 제외한 모든 약수의 합이 자기 자신과 같은 수를 말해.먼저, 진약수라는 개념을 알아보자.진약수는 자기 자신을 제외한 약수를 뜻해.예를 들어, 숫자 6의 약수는 1, 2, 3, 6인데, 이 중 6을 뺀 1, 2, 3이 바로 6의 진약수야.진약수의 합에 따라 숫자는 세 가지로 나눌 수 있어. 완전수: 진약수의 합이 자기 자신과 같은 수예: 6의 진약수는 1, 2, 3이고, 이걸 더하면 6이 돼. 그래서 6은 완전수야! 부족수: 진약수의 합이 자기 자신보다 작은 수예: 8의 진약수는 1, 2, 4이고, 이걸 더하면 7이야. 7은 8보다 작으니까, 8은 부족수야. 과잉수: 진약수의 합이 자기 자신보다 큰 수예: 12의 진약수는 1, 2, 3, 4, 6이고, 이걸 더하면 1..
[448] 약수 학습하기 1. 개념 소개여러분, 약수라는 말을 들어본 적이 있나요? 약수란 어떤 수를 나누어떨어지게 만드는 숫자입니다. 쉽게 말하면, 어떤 수를 나누었을 때 나머지가 0이 되면, 그 숫자는 약수라고 할 수 있습니다. 예를 들어, 12라는 숫자를 생각해 보겠습니다. • 1로 나누면 12 ÷ 1 = 12 (나머지 0, 약수입니다!) • 2로 나누면 12 ÷ 2 = 6 (나머지 0, 약수입니다!) • 3로 나누면 12 ÷ 3 = 4 (나머지 0, 약수입니다!) • 4로 나누면 12 ÷ 4 = 3 (나머지 0, 약수입니다!) 이렇게 12를 나누었을 때 나머지가 0이 되는 숫자들은 모두 12의 약수입니다.2. 실생활 예제 약수는 우리 일상에서도 쉽게 찾아볼 수 있습니다. 예를 들어, 초콜릿 12개가 들어 있는 상자가 있다..
[447] 메르센 수, 메르센 소수 1. 메르센 수\(2^n-1\) 의 꼴의 수를 메르센 수라고 합니다.메르센 수를 이진수로 나타내면 모든 자리가 1인 수입니다.2. 하노이의 탑\(n\)층의 하노이의 탑을 옮기는 횟수를 \(f(n)\)이라고 했을 때, 1층인 하노이의 탑을 옮기는 것은 1회이므로  \(f(1) = 1\)입니다.\(n\)층의 하노이의 탑을 옮기려면 다음과 같은 과정을 거칩니다.맨 밑의 한 개를 제외하고 \(n-1\)층을 일단 옮겨놓습니다. (\(f(n-1)\))맨 밑의 한 개를 옮깁니다. (\(f(1)\))다시 그 위에 \(n-1\)층을 옮겨놓으면 됩니다. (\(f(n-1)\))이 식을 정리하면 다음과 같습니다.\[\begin{aligned}f(n) &= f(n-1) \times 2 + 1 \\     &= \big(f(n-..
[446] 느리게 갱신되는 세그먼트 트리(lazy propagation) 1. 세그먼트 트리 동작 과정세그먼트 트리는 루트 노드에서 리프 노드까지 범위를 나누어 가며 통일된 연산값을 유지해야 합니다.따라서 자식 노드에서 부모 노드로 올라가더라도 더 넓어진 범위에 대해 연산 결과를 유지할 수 있어야합니다.이게 가능한 연산은 최대, 최소, 덧셈, 곱셈 등 일부의 결과로 전체 범위에 적용이 가능한 연산을 세그먼트 트리에 적용할 수 있습니다. 8 크기의 배열에서 3, 2, 5, 3, 5, 2, 3, 4의 값을 가지고 있고, 구간합을 관리하는 세그먼트 트리는 다음과 같습니다. 이 세그먼트 트리에서 2 ~ 8 범위의 구간합을 구하고 싶다면 다음과 같이 구합니다. 찾고자 하는 범위 안에 포함될 때까지 자식으로 내려가며 합을 구하면, 2+8+14로 24라는 것을 알 수 있습니다.다음으로 세..
[445] 다익스트라 알고리즘으로 최단경로의 모든 정점 찾기 1. 다익스트라 알고리즘다익스트라 알고리즘을 순서대로 나타내면 다음과 같습니다.단순한 최단경로 찾기는 위와 같이 풀 수 있습니다.하지만 최단경로 상의 모든 정점을 찾고 싶을 때는 위의 과정 중에 추가적인 알고리즘이 필요합니다.2. 다익스트라 알고리즘으로 최단경로의 정점 찾기우선순위 큐에 다음 정점에 대한 정보를 추가할 때, 가중치를 더 작은 값으로 하는 간선 정보를 저장합니다.최단경로 탐색이 종료되면, 간선 정보를 담은 표를 가지고 역으로 거슬러 올라가며 최단경로 상의 모든 정점을 순서대로 확인할 수 있습니다.
[444] 부동소수점의 오차 이야기 1. 부동소수점(浮動小數点)부동소수점 방식은 고정소수점 방식과 함께 컴퓨터로 소수(小數)를 나타내기 위한 방법입니다.부동소수점의 부는 不(아닐 부)가 아니라 浮(뜰 부)입니다.고정되어 있지 않고 움직인다는 뜻입니다.부동자세에서 부동은 움직이지 않는다는 뜻인데, 부동소수점의 부동은 움직인다는 뜻입니다.(연패처럼...) 십진수 \(14.2\)를 \(1.42 \times 10^1\) 처럼 나타내는 방식입니다.같은 방식으로 이진수 \(101.01\)를 부동소수점 방식으로 나타내면 \(1.0101 \times 2^2\)  입니다.https://ko.wikipedia.org/wiki/부동소수점 부동소수점 - 위키백과, 우리 모두의 백과사전위키백과, 우리 모두의 백과사전. 초기의 전기기계식 프로그래밍 가능한 컴퓨터..
[443] 순열, 조합, 중복순열, 중복조합 구현하기(파이썬 코드) - itertools 없이 1. 순열arr = [1, 2, 3]used = [False] * len(arr)def perm(arr, r): for i in range(len(arr)): if not used[i]: used[i] = True if r == 1: yield [arr[i]] else: for nxt in perm(arr, r-1): yield [arr[i]] + nxt used[i] = False print(*perm(arr, 3), sep="\n")# [1, 2, 3]# [1, 3, 2]# [2, 1, 3]# [2,..