23일차 문제

양진혁·2021년 11월 23일
0

문제풀이

첫번째 문제
N과 M(1)로

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열

예제 입력 1
3 1

예제 출력 1
1
2
3

from itertools import permutations
a,b = map(int, input().split())
el = []
for i in range(1,a+1):
  el.append(i)
for i in permutations(el, b):
  print(' '.join(map(str, i)))

itertools의 permutations를 이용해서 순열을 만들었다. 먼저 빈 리스트를 받고 반복문을 작성 후 1부터 a까지 리스트를 만들었고 그 다음 permutations를 통해서 el의 순열을 b개씩 프린트 하게 한 후 마지막에 튜플을 str 형태로 바꿔주었다.

두번째 문제
블랙잭 문제로
카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 있다.

한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다.

김정인 버전의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 그런 후에 딜러는 숫자 M을 크게 외친다.

이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 한다. 블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다.

N장의 카드에 써져 있는 숫자가 주어졌을 때, M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 구해 출력하시오.

예제 입력 1
5 21
5 6 7 8 9

예제 출력 1
21

from itertools import combinations
a,b = map(int,input().split())
c = list(map(int, input().split()))
el = []
re=[]
for i in combinations(c, 3):
  for j in range(len(list(i))-2):
    el.append(list(i)[j]+list(i)[j+1]+list(i)[j+2])
for i in range(len(el)):
  if el[i]<=b:
    re.append(el[i])
print(sorted(re)[-1])

itertools의 combinations를 통해서 만들 수 있는 모든 조합을 만든 후 2중 반복문을 통해서 그 조합을 모두 더해준 후 빈 리스트 안으로 넣어주었다. 그 다음 반복문을 다시 작성한 후 만약 b의 값보다 값이 작을때만 결과 리스트에 추가한 후 sorted로 정렬한 후 -1로 가장 큰 값을 프린트 해주었다.

세번째 문제
게으른 근우는 열심히 놀다가 문득, 자신의 학점 평균이 얼마일지 궁금해졌다. 학사시스템도 들어가기 귀찮아하는 근우를 위해 구해주도록 하자.

첫 번째 줄에 학기의 수 T가 주어진다. 두 번째 줄부터 T개 학기에 대한 정보가 주어진다.

각 학기에 대한 정보는 다음과 같이 구성되어 있다. 첫 번째 줄에 들었던 과목의 수 N이 주어지고, 다음 N개 줄에 걸쳐서 N개 과목들의 학점 C와 성적 G가 주어진다. (1 ≤ N ≤ 10, 1 ≤ C ≤ 6, C는 정수) G는 {0, 0.7, 1, 1.3, 1.7, 2, 2.3, 2.7, 3, 3.3, 3.7, 4, 4.3} 중 하나이며 소수 부분은 최대 한 자리까지 주어진다.

예제 입력 1
2
4
3 4.3
2 2.0
4 0.0
2 4.0
3
4 0.0
4 0.0
3 0.0

예제 출력 1
11 2.3
11 0.0

a = int(input())
for i in range(a):
  el = []
  re = []
  aver = 0
  sub = 0
  b = int(input())
  for j in range(b):
    el.append(list(map(float,input().split())))
  for k in range(len(el)):
    sub += int(el[k][0])
    aver += el[k][0]*el[k][1]
  re.append(str(sub))
  re.append(str(round(aver/sub, 1)))
  print(" ".join(re))

과목수 sub과 평균 aver을 0으로 지정한 후 각 사례마다 계산해주었고 그것을 결과 리스트에 추가한 후 프린트하고 반복문이 다시 시작될 때 평균, 과목 수 리스트들을 다시 빈 것으로 만들었다.

0개의 댓글