12월, 2020의 게시물 표시

볼링공 고르기 - Greedy Alogrithm

  n , m = map ( int , input ().split()) weight = list ( map ( int , input ().split())) answer = 0 for i in range ( len (weight)- 1 ): j = i+ 1 while j < len (weight): if weight[i] != weight[j]: answer+= 1 j += 1 print (answer) 문제 요약 : 볼링공의 개수와 무게가 주어진다. 두 사람이 볼링공을 고르는데 이때 서로 다른 무게의 볼링공을 고르는 경우의 수를 구하여라 접근 방식 : 리스트에 있는 값을 처음부터 끝까지 2개씩 비교하며 이때 리스트의 값이 서로 같지 않다면 변수 값을 1을 더함으로써 서로 다른 무게의 볼링공을 고르는 경우의 수를 구하였다.

볼링공 고르기

이미지
 이 문제는 N개의 볼링공과 최대 무게 M이 주어졌을 때, 두 명의 플레이어가 다른 무게를 고르는 모든 경우의 수를 계산하는 문제이다. 각 볼링공은 무게는 같을 수 있지만 부여되는 번호는 고유하다. 만약 5개의 볼링공과 최대 무게가 3인 경우에 각 볼링공의 무게가 1 3 2 3 2 라고 한다면 이 경우는 각 볼링공은 1번부터 번호를 부여받으며 플레이어가 선택 가능한 경우는 (1번, 2번), (1번, 3번), (1번, 4번), (1번, 5번), (2번, 3번), (2번, 5번), (3번, 4번), (4번, 5번) 이렇게 8가지의 경우의 수가 가능하다 기본적인 아이디어는 다음과 같다. 1. 입력받은 볼링공으로 만들 수 있는 모든 부분 집합을 구한다. 2. 부분 집합 중 원소의 갯수가 2개이며, 서로 무게가 다른 경우만 리스트에 추가한다. 파이썬으로 구현한 내용

만들 수 없는 금액

이미지
 이 문제는 사용자로부터 N개의 동전과 그 동전들의 값을 입력으로 받는다. 우리는 이 동전들을 가지고 만들 수 없는 가장 작은 값을 구하려 한다. 만약 3 2 1 1 9, 이렇게 다섯개의 동전을 입력으로 받는다면 8원은 만들 수 없으므로 8이 정답이 된다. 기본적인 아이디어는 다음과 같다. 1. 입력받은 동전들을 money 리스트에 저장한다. 2. 이후 combinations를 이용하여 money 리스트로 만들 수 있는 모든 부분 집합을 구한다.     우리는 중복이 필요없기 때문에 set()을 이용하여 중복을 제거하여 준다. 3. for문을 통해 각 부분 집합들로 만들 수 있는 합을 리스트에 저장한다. 4. 1부터 입력 받은 동전으로 만들 수 있는 가장 큰 값까지 반복문을 실행하고 만약 인덱스 값이 합을 저장       한 리스트에 존재하지 않는다면 해당 인덱스를 출력한다. 파이썬으로 구현한 내용 1, 2 단계 내용 3, 4 단계 내용

문자열 뒤집기 - Greedy Algorithm

  s = input () count0 = 0 count1 = 0 answer = 0 def check (i , s): if i >= len (s): return False else : return True i = 0 while i < len (s): if s[i] == '0' : count0 += 1 while s[i] == '0' : i += 1 if not check(i , s): break else : count1 += 1 while s[i] == '1' : i+= 1 if not check(i , s): break if count0 > count1: print (count1) else : print (count0) 문제 요약 : 0과 1로 이루어진 문자열 s를 입력받아 뒤집어 모두 같은 숫자로 만든다. 이때 0을 뒤집으면 1, 1을 뒤집으면 0이된다. 뒤집는 최소의 숫자를 출력하라 접근 방식 : 문자열에서 연속된 숫자의 개수를 나눈다. 예를 들어 0이 연속되어있는 개수와 1이 연속되어 있는 개수를 나누고 연속된 수가 가장 낮은 수를 뒤집는다. 이를 통해 뒤집는 최소한의 수를 구한다.

문자열 뒤집기

이미지
 사용자는 입력으로 0과 1로 이루어진 문자열을 제공한다. 우리는 이 문자열을 하나의 숫자로만 이루어진 문자열로 만들어야 한다. 문자열을 조작하는 방법은 시작 인덱스에서 끝 인덱스까지 그 안에 있는 모든 숫자를 0이면 1로, 1이면 0으로 바꿀 수 있다. 이 때, 문자열을 조작하는 횟수가 최소한이 되게 하는 횟수를 구한다. 기본적인 아이디어는 다음과 같다. 1. 문자열을 읽으며 0의 묶음과 1의 묶음의 갯수를 구한다. 그 묶음 안에 몇 개의 0 또는 1이 존재하는지는 상관이 없다. 2. 묶음의 갯수가 더 적다는 것은 즉, 갯수가 더 많은 쪽보다 문자열을 뒤집는 횟수가 적다는 의미가 된다. 따라서 더 적은 묶음의 수를 대상으로 그 수를 모두 0 또는 1로 뒤집어 준다. 3. 마지막으로 그 횟수를 출력하여 준다. 파이썬으로 구현한 내용 1 단계의 코드 2, 3 단계의 코드

곱하기 혹은 더하기 - Greedy Algorithm

s = input () intList = list ( map ( int , s)) # 문자열로 입력 받은 값을 정수형으로 변환 #intList = [int(x) for x in s] # 방법 2 answer = intList[ 0 ] for i in range ( 1 , len (intList)): if intList[i] > 1 and answer != 0 : answer *= intList[i] else : answer += intList[i] print (answer) 문제 요약 : 숫자(0~9)로만 이루어진 문자열 S가 주어졌을 때 왼쪽부터 오른쪽으로 하나씩 모든 숫자를 확인하며 + , * 연산자를 이용하여 가장 큰 수를 만들어 낸다. 접근 방식 : 문자열로 입력 받은 값을 정수형으로 변환 후 값을 하나씩 검사하며 1보다 크다면 곱셈을 수행, 1보다 작거나 같다면 덧셈을 수행하여 가장 큰 값을 만들어 낸다. 알게된 점 : 문자열로 입력받아 그 값을 int형으로 변환할 때 map메소드를 이용하거나 list Comprehension 기법을 사용할 수 있다.

곱하기 혹은 더하기

이미지
 임의의 숫자(0부터 9까지)로 이루어진 문자열을 입력받으면  이 숫자들과 +, * 연산자를 이용해 가장 큰 값을 계산해보자. 다만, 이 문제에서는 한 가지 제한사항이 발생한다. 1. 사칙연산에 의해서가 아닌 왼쪽에서 오른쪽으로 연산이 진행된다. 기본적인 아이디어는 다음과 같다. 1. 사용자로부터 문자열을 입력받는다 2. 문자열로부터 한 글자씩 읽어 오면서 0이나 1일 경우는 누적값에 읽은 수를 더한다 3. 아닐 경우는 누적값에 읽은 수를 곱한다. 파이썬으로 구현한 내용

모험가 길드 - Greedy Algorithm

n = int ( input ()) fearChart = list ( map ( int , input ().split())) count= 0 for i in range (n): maxElement = max (fearChart) fearChart.remove(maxElement) temp = 0 elementsCount = 1 index = 0 while elementsCount != maxElement: maxElement2 = max (fearChart) fearChart.remove(maxElement2) elementsCount += 1 count += 1 if not fearChart: break print (count) 문제 요약 : N명을 입력 받고 각 사람들의 공포도를 입력받는다. 공포도가 X인 모험가는 반드시 X명 이상 으로 구성한 모험가 그룹에 참가 해야 여행을 떠날 수 있다. 최대 그룹의 개수를 출력해라 접근 방식 : 각 사람들의 공포도를 리스트로 입력 받고 리스트에서 최대 공포도를 찾는다. 그 최대 공포도 개수 만큼 배열에서 큰 값부터 삭제한다. 그룹의 개수가 최대 값이 되기 위해서는 공포도가 높은 수 부터 삭제해야 낮은 공포도들만 남아 개수를 늘리기 적합하기 때문이다. 새로 알게된 점 : max메소드에 리스트를 매개변수로 넘기면 배열에서 최대값을 가져온다.

모험가 길드

이미지
 사용자로부터 모험가의 명수와 각 모험가의 공포도를 입력 받는다. 우리는 이 모험가들로 그룹을 나누어 던전을 입장하려 한다. 하지만 모험가의 공포도를 고려하여 해당 모험가의 공포도 만큼 인원수를 구성하여 그룹을 만들어야 한다. 만약 공포도가 3인 모험가가 있다면 그 그룹에는 3명의 모험가가 필요하다. 하지만 모든 모험가가 그룹에 속할 필요는 없다. 마을을 지킬 인원이나 식사 추진을 할 인원도 필요하다. 이 때, 입력받은 데이터를 토대로 최대로 만들 수 있는 그룹의 숫자는 몇 개일까 만약 모험가의 명수는 5이며, 각 모험가의 공포도는 2 3 1 2 2 라면 3 2 2 1 2 두 그룹으로 나누어 모험을 떠날 수 있다. 이를 구현하기 위한 기본적인 아이디어는 다음과 같다. 1. while문을 돌며 현재 리스트의 원소들로 그룹핑이 가능한지 검사한다 2. 만약 가능하다면 리스트의 첫번째 원소를 확인하고 그 값만큼 for문을 반복한다. 3. for문 안에서는 리스트의 원소를 Pop연산을 통해 제거한다. 4. for문의 작동이 종료되면 그룹의 갯수가 증가하였다는 의미로 count 변수를 1 증가시킨다. 파이썬을 통한 구현