본문 바로가기

Algorithm/Greedy

(9)
볼링공 고르기 문제 N개의 볼링공을 같은 무게라도 번호가 다르면 서로 다른 공으로 간주할 때, 두 사람이 서로 다른 무게의 볼링공을 고를 수 있는 모든 경우의 수를 구하라. 아이디어 1. for, for 해서 모든 순열을 구한다. 2. 조합 - 같은 번호를 가진 볼링공 수 3. 기록을 통한 체크 입력 (1, 3, 2, 3, 2) - 출력 8 번호 : (1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 5), (3, 4), (4, 5) 무게 : (1, 3), (1, 2), (1, 3), (1, 2), (3, 2), (3, 2), (2, 3), (3, 2) - 볼링공의 조합을 생각해보면 결과적으로는 번호가 다르고 무게가 달라야한다. - 1. 번호를 고려해서 생각해보면 for 문 이외에는 생각이 ..
만들 수 없는 금액 문제 N개의 동전을 사용해 만들 수 없는 양의 정수 금액 중 최솟값을 구하는 프로그램 유형 분석 최솟값을 구하며 딱히 다른 알고리즘이 생각나지 않는다. 아이디어 주어진 숫자리스트를 작은 순서대로부터 확인을 하면서 만들 수 있는 금액 체크 여부를 1부터 시작해서 차근차근 가능한지 확인한다. 과정은 다음과 같다. 1원을 만들 수 있는가? -> 1원이 있어야만 한다. -> 없다면 종료, 있다면 현재 만들 수 있는 최대 금액은 1원디다. 2원을 만들 수 있는가? -> 1원 또는 2원이 있어야만 한다. -> 없다면 종료, 있다면 현재 만들 수 있는 최대 금액은 3원, 4원디다. ... 이런식의 아이디어를 갖는다. 예를 들어, [1, 1, 4, 5, 6] 작은거 부터 확인해보면, 1원으로 1원까지 만들 수 있다. ..
문자열 뒤집기 문제 0, 1로만 이루어진 문자열을 뒤집어 모든 숫자를 같게 만들어야한다. 연속된 하나 이상의 숫자를 뒤집을 수 있다. 1->0 or 0->1 이 때, 최소한으로 뒤집어 모두 같은 문자열을 만들어라. 유형파악 "최소한"이라는 말이 나왔기에 합리적으로 그리디 알고리즘을 의심한다. 아이디어 "결과는 항상 00000 처럼 0으로만 이루어져 있거나 11111 처럼 1로만 이루어진다." 0001001010101110 가 있다고 가정할때, 모두 1로 만들기 위해서는 6번 뒤집는다. 모두 0으로 만들기 위해서는 5번 뒤집는다. 그냥 머리속에 있는 것을 만들어보려고 한다. 결과는 항상 1로만 이루어져 있거나 0으로 이루어질 것이다. 1개 이상의 연속된 0의 수와 1의 수를 구하여 더 작은 집합의 수를 출력한다. 정당성..
곱하기 혹은 더하기 문제 0에서 9로 이루어진 문자열이 있을 때, 순서대로 곱하거나 더하여 만들 수 있는 가장 큰 수를 구하라 유형파악 가장 큰 이라는 말이 나왔고 딱히 자료구조를 사용해야할 상황이거나 게임을 만드는 것과 같은 상황이거나 정렬 상황이거나 시간 복잡도를 크게 고려해야하는 상황이 아니라면 그냥 그리디 알고리즘이지 않나 싶다. 아이디어, 정당성 우선, 가장 먼저 드는 생각은 곱하기를 많이 해야 큰 수를 만들 수 있다. 하지만 항상 그런 것은 아니고 0에 곱하기를 하면 안된다. 또한 1은 더하는게 더 큰 수를 만들 수 있다. 예를 0123456이 있을때 0+1 = 1 1+2 = 3 3*3 = 9 이런식으로 곱하기만 하면 안된다. 구현 피연산자 중 0이나 1이 있는지 체크해가며 연산을 진행하되 0, 1 이 아니면 곱..
모험가 길드 문제 공포도가 X인 모험가는 반드시 X명 이상의 길드원이 필요하다. 예를 들어, 한 모험가의 공포도가 3이면 그 사람은 3명 이상의 길드에 들어간다. 모험가들의 수, 각각의 공포도가 주어질 때, 만들 수 있는 길드의 최대 수를 구하라 (단, 모든 모험가가 길드에 속할 필요는 없다.) 유형 파악 그리디 문제들은 최소한의, 최대한의, 가장 큰, 가장 작은 등의 단어가 들어간다. 이런 단어가 나온다면 항상 그리디는 아니지만 그리디를 먼저 의심하는 습관이 필요하다. 아이디어 및 정당성 만약, 공포도가 2 3 1 2 2이라고 가정하자 이 때, 정렬하면 1 2 2 2 3 이다. 1은 혼자서도 그룹이 가능하다. 2는 둘 이상의 사람이 필요하다, 3은 세명 이상의 사람이 필요하다. "공포도가 적은 사람일 수록 많은 팀..
1이 될 때까지 문제 N이 1이될 때까지 1을빼거나 K로 나눈다. 이 때, 최소한의 연산으로 1을 만들어라. 유형파악 다른 알고리즘 연결이 안된다. 그리디 알고리즘이다. 아이디어 직관적으로 최대한 K로 나누는게 숫자 1을 만드는데 더 빨리 가까워진다. 나누어 떨어지면 K로 나누고 아니면 1을 뺸다. 정당성 직관적으로 나누는게 항상 1을 빼는거 보단 숫자가 더 빨리 작아지므로 정당하다고 볼 수 있다. 구현 - K로 나눠지는지 확인 - 나눠지면 K로 나눈다. 아니면 1을 뺀다 - 1이 될때까지 반복한다. 코드 n = int(input("입력 : ")) k = int(input("입력 : ")) count = 0 while n != 1: if n % k == 0: n /= k count += 1 else: n -= 1 cou..
숫자 카드 게임 문제 - 여러개의 숫자 카드 중에서 가장 높은 숫자가 쓰인 카드 한장을 뽑는다 - 카드는 행, 열로 구성되어 있다. - 찾는 순서는 행선택, 그 행에서 가장 숫자가 낮은 카드를 뽑는다. - 행을 선택할때 해당 행에서 가장 낮은 숫자를 뽑는 구조인데 이를 고려해, 행마다 가장 낮은 숫자 중 가장 높은 숫자를 뽑도록 해야한다. - 용량 : 128MB, 시간 : 1초 - 1
큰 수의 법칙 문제 큰수의 법칙 : N개의 다양한 수로 이루어진 배열이 있을 때 주어진 수들을 M번 더해서 가장 큰 수를 만드는 법칙 단, 배열의 특정한 인덱스에 해당하는 수가 연속해서 K번을 초과하여 더해질 수 없다. - 용량 : 128MB, 시간 : 1초 - 2