볼링공 고르기 - 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. 아닐 경우는 누적값에 읽은 수를 곱한다. 파이썬으로 구현한 내용