알고리즘 42

[그리디] 이코테 (파이썬) 큰 수의 법칙

[문제] '큰 수의 법칙'은 일반적으로 통계 분야에서 다루어지는 내용이지만 동빈이는 본인만의 방식으로 다르게 사용하고 있다. 동빈이의 큰 수의 법칙은 다양한 수로 이루어진 배열이 있을 때 주어진 수들을 M번 더하여 가장 큰 수를 만드는 법칙이다. 단, 배열의 특정한 인덱스(번호)에 해당하는 수가 연속해서 K번을 초과하여 더해질 수 없는 것이 이 법칙의 특징이다. 예를 들어 순서대로 2, 4, 5, 4, 6으로 이루어진 배열이 있을 때 M이 8이고, K가 3이라고 가정하자. 이 경우 특정한 인덱스의 수가 연속해서 세 번까지만 더해질 수 있으므로 큰 수의 법칙에 따른 결과는 6 + 6 + 6 + 5 + 6 + 6 + 6 + 5 인 46이 된다. ... ... 생략 ... 배열의 크기 N, 숫자가 더해지는 횟..

[그리디] 이코테 (파이썬) 1이 될 때까지

[문제] 어떠한 수 N이 1이 될 때까지 다음의 두 과정 중 하나를 반복적으로 선택하여 수행하려고 한다. 단, 두 번째 연산은 N이 K로 나누어떨어질 때만 선택할 수 있다. 1. N에서 1을 뺀다. 2. N을 K로 나눈다. 예를 들어 N이 17, K가 4라고 가정하자. 이때 1번의 과정을 한 번 수행하면 N은 16이 된다. 이후에 2번의 과정을 두 번 수행하면 N은 1이 된다. 결과적으로 이 경우 전체 과정을 실행한 횟수는 3이 된다. 이는 N을 1로 만드는 최소 횟수이다. N과 K가 주어질 때 N이 1이 될 때까지 1번 혹은 2번의 과정을 수행해야 하는 최소 횟수를 구하는 프로그램을 작성하시오. [입력 조건] 첫째 줄에 N(2

[파이썬] collections 모듈(deque, Counter)

collections 모듈은 파이썬의 내장 모듈인데, 다양한 자료구조인 list, tuple, dictionary 등을 확장하여 제작된 모듈이다. 기본적으로 collections 모듈은 deque, Counter, namedtuple, defaultdict, OrderedDict 등을 제공한다. deque는 연속적으로 나열된 데이터의 시작 부분이나 끝 부분에 데이터를 삽입하거나 삭제할 수 있다. 또한, deque는 stack이나 queue 자료구조의 대용으로 사용될 수 있다. 아래의 표는 deque를 통해 원소를 삽입하거나 삭제하는 메서드이다. 메서드 설명 시간 복잡도 appendleft(a) 원소 a를 첫 번째 인덱스에 삽입 O(1) append(a) 원소 a를 마지막 인덱스에 삽입 O(1) pople..

[파이썬] 리스트 기본 메서드

리스트에서 사용할 수 있는 기본적인 메서드들은 다음과 같다. 메서드 사용 방식 설명 시간 복잡도 append( ) 변수명.append( ) 리스트에 원소를 하나 삽입한다. O(1) sort( ) 변수명.sort( ) 오름차순으로 정렬 O(NlogN) 변수명.sort(reverse = True) 내림차순으로 정렬 reverse( ) 변수명.reverse( ) 리스트의 원소 순서를 뒤집는다. O(N) remove( ) 변수명.remove(특정 값) 특정 값을 갖는 원소를 제거한다. O(N) insert( ) 변수명.insert(삽입할 위치 인덱스, 삽입할 값) 특정한 인덱스에 원소를 삽입한다. O(N) count( ) 변수명.count(특정 값) 리스트에서 특정 값을 가지는 데이터의 개수 O(N) 여기서 r..

[파이썬] round( ) 함수

컴퓨터 시스템은 수 데이터를 처리할 때 2진수를 사용하고, 부동 소수점 방식을 이용하여 실수를 처리한다. 하지만, 실수형을 저장하기 위해 4byte나 8byte의 고정된 크기의 메모리를 할당하기 때문에 대개 실수 정보를 표현하는 정확도에 한계를 가진다. 예를 들어, 0.7 + 0.2의 결과값은 0.9이지만, 컴퓨터 시스템 내에서 수행해보면 0.8999999999999999 의 값이 나온다. 이러한 문제를 해결하기 위해 round( ) 함수를 사용할 수 있다. round( ) 함수 사용법 >> round(실수형 데이터, 반올림하고자 하는 위치 -1 ) [예제] a = 0.7 + 0.2 print(a) print(round(a, 4)) [결과]

백준(C) 2437번 저울 풀이

C로 구현한 2437번 저울 문제 풀이입니다. https://www.acmicpc.net/problem/2437 2437번: 저울 하나의 양팔 저울을 이용하여 물건의 무게를 측정하려고 한다. 이 저울의 양 팔의 끝에는 물건이나 추를 올려놓는 접시가 달려 있고, 양팔의 길이는 같다. 또한, 저울의 한쪽에는 저울추들만 놓 www.acmicpc.net #include int main() { int n, temp, target=1; int input[1001]; scanf("%d", &n); for(int i=0; i

백준(C) 11047번 동전 0 풀이

C로 구현한 11047번 동전 0 구하기 문제 풀이입니다. https://www.acmicpc.net/problem/11047 11047번: 동전 0 첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수) www.acmicpc.net #include int main() { int n, k, result=0; int stat[11]; scanf("%d %d", &n, &k); for(int i=n-1; i>=0; i--) { scanf("%d", &stat[i]); } for(int i=0; i

백준(C) 5585번 거스름돈 풀이

C로 구현한 5585번 거스름돈 구하기 문제 풀이입니다. https://www.acmicpc.net/problem/5585 5585번: 거스름돈 타로는 자주 JOI잡화점에서 물건을 산다. JOI잡화점에는 잔돈으로 500엔, 100엔, 50엔, 10엔, 5엔, 1엔이 충분히 있고, 언제나 거스름돈 개수가 가장 적게 잔돈을 준다. 타로가 JOI잡화점에서 물건을 사 www.acmicpc.net #include int main() { int input, money, result=0; scanf("%d", &input); money = 1000 - input; result += money / 500; money %= 500; result += money / 100; money %= 100; result += mo..

그리디 알고리즘(Greedy Algorithm)

그리디 알고리즘은 매 선택에서 당장 눈 앞에 보이는 최적인 답을 선택하도록 하는 알고리즘이다. 대표적인 예제로는 거스름 돈 문제가 있다. 예를들어, 거스름 돈 1260원을 내주어야할 때 10원짜리 동전을 126개 내어주는 것보다는 500원짜리 동전 2개, 100원짜리 동전 2개, 50원짜리 동전 1개, 10원짜리 동전 1개로 총 6개의 동전을 내어주는 것이 더욱 편리하다. 그러므로 그리디 알고리즘은 무조건 큰 경우 혹은 무조건 작은 경우대로 문제에 접근하여 수행된다. [예제] #include int main() { int input, result = 0; scanf("%d", &input); result += input / 500; input %= 500; result += input / 100; inp..