코딩테스트[파이썬] 236

[구현력 기르기] - 자릿수의합

자릿수의 합 N개의 자연수가 입력되면 각 자연수의 자릿수의 합을 구하고, 그 합이 최대인 자연수를 출력 하는 프로그램을 작성하세요. 각 자연수의 자릿수의 합을 구하는 함수를 def digit_sum(x)를 꼭 작성해서 프로그래밍 하세요. ▣ 입력설명 첫 줄에 자연수의 개수 N(30: sum+=x%10 x=x//10 return sum n=int(input()) a=list(map(int, input().split())) res=0 max=-2147000000 for x in a: tot=digit_sum(x) if tot>max: max=tot res=x print(res)

[구현력 기르기] - 정다면체

정다면체 두 개의 정 N면체와 정 M면체의 두 개의 주사위를 던져서 나올 수 있는 눈의 합 중 가장 확률이 높은 숫자를 출력하는 프로그램을 작성하세요. 정답이 여러 개일 경우 오름차순으로 출력합니다. ▣ 입력설명 첫 번째 줄에는 자연수 N과 M이 주어집니다. N과 M은 4, 6, 8, 12, 20 중의 하나입니다. ▣ 출력설명 첫 번째 줄에 답을 출력합니다. ▣ 입력예제 1 4 6 ▣ 출력예제 1 5 6 7 나의 코드 n,m=map(int,input().split()) arr=[0]*(n+m+1) for i in range(1,n+1): for j in range(1,m+1): arr[i+j]+=1 M=max(arr) res=[] for i in range(2,n+m+1): if arr[i]==M: re..

[구현력 기르기] - 대표값

대표값 N명의 학생의 수학점수가 주어집니다. N명의 학생들의 평균(소수 첫째자리 반올림)을 구하고, N명의 학생 중 평균에 가장 가까운 학생은 몇 번째 학생인지 출력하는 프로그램을 작성하세 요. 평균과 가장 가까운 점수가 여러 개일 경우 먼저 점수가 높은 학생의 번호를 답으로 하고, 높 은 점수를 가진 학생이 여러 명일 경우 그 중 학생번호가 빠른 학생의 번호를 답으로 합니다. ▣ 입력설명 첫줄에 자연수 N(5=avg: print(avg,x+1) break else: print(avg,res[0]) round 함수는 12.5를 반올림하면 12로 출력한다. 그래서 해당 반올림하는 변수에 0.1을 더한 뒤 round 함수에 넣어서 반올림을 구한다. 반복문을 사용하여 평균을 구한뒤 평균과 학생의 점수 하나씩 ..

[구현력 기르기] -k번째 큰수

k번째 큰수 현수는 1부터 100사이의 자연수가 적힌 N장의 카드를 가지고 있습니다. 같은 숫자의 카드가 여러장 있을 수 있습니다. 현수는 이 중 3장을 뽑아 각 카드에 적힌 수를 합한 값을 기록하려 고 합니다. 3장을 뽑을 수 있는 모든 경우를 기록합니다. 기록한 값 중 K번째로 큰 수를 출력 하는 프로그램을 작성하세요. 만약 큰 수부터 만들어진 수가 25 25 23 23 22 20 19......이고 K값이 3이라면 K번째 큰 값 은 22입니다. ▣ 입력설명 첫 줄에 자연수 N(3

[구현력 기르기]-k번째 약수

K번째 약수 어떤 자연수 p와 q가 있을 때, 만일 p를 q로 나누었을 때 나머지가 0이면 q는 p의 약수이다. 6을 예로 들면 6÷1=6...0 6÷2=3...0 6÷3=2...0 6÷4=1...2 6÷5=1...1 6÷6=1...0 그래서 6의 약수는 1, 2, 3, 6, 총 네 개이다. 두 개의 자연수 N과 K가 주어졌을 때, N의 약수들 중 K번째로 작은 수를 출력하는 프로그램을 작성하시오. ▣ 입력설명 첫째 줄에 N과 K가 빈칸을 사이에 두고 주어진다. N은 1 이상 10,000 이하이다. K는 1 이상 N 이하이다. ▣ 출력설명 첫째 줄에 N의 약수들 중 K번째로 작은 수를 출력한다. 만일 N의 약수의 개수가 K개보다 적어서 K번째 약수가 존재하지 않을 경우에는 -1을 출력하시오. ▣ 입력예제..

[그래프] - 커리큘럼(위상정렬)

선행 순서가 있는 수업들을 각 입력이 들어올 때마다 해당 입력된 수업의 소비 시간을 구하라. 선행 순서 ==> 위상정렬을 사용해야 함 ! 나의코드 n=int(input()) arr=[] in_count=[] for i in range(0,n): arr.append(list(map(int,input().split()))) arr[i].pop() in_count.append(len(arr[i])-1) for x in arr: if len(x)==1: print(x[0]) else: S=x[0] for i in range(1,len(x)): S=S+arr[x[i]][0] print(S) print(S) 음.. 위상 정렬을 사용한다는것은 알겠지만.. 큐를 사용해서 하나씩 로직을 처리하지 못하고 나의 생각다로 ..

[그래프] - 도시 분할 계획(크루스칼)

n개의 노드와 m개의 간선을 사용해서 2개의 그룹으로 만드는 최소신장트리를 구하라. 크루스칼 알고리즘을 사용하면 될것 같으며 최소신장 트리가 완성이 되면 뒤 최소 신장 트리의 집합내부에 가장 큰 비용을 가진 간선을 제외하고 모두 더하면 될것 같다..! 나의 코드 def union(parent,a,b): a=find_parent(parent,a) b=find_parent(parent,b) if a>b: parent[a]=b else: parent[b]=a def find_parent(parent,x): if parent[x] != x: parent[x]=find_parent(parent,parent[x]) return parent[x] n,m=map(int,input().split()) edges=[] p..

[그래프] - 팀결성 (서로소 집합 & 크루스칼 알고리즘)

n명의 학생들이 M개의 연산이 주어 진다. M개의 연산의 종류는 아래와 같다. 1. 팀 합치기 2. 같은팀인지 확인 2번과 같은 입력이 들어오면 그에 대한 출력을 Yes or NO로 하라. 나의 코드 def union(parent,a,b): a=check_parent(parent,a) b=check_parent(parent,b) if a>b: parent[a]=b else: parent[b]=a def check_parent(parent,x): if parent[x] !=x: parent[x]=check_parent(parent,parent[x]) return parent[x] n,m=map(int,input().split()) parent=[0]*(n+1) for i in range(n+1): pare..

[그래프] - 위상정렬

위상정렬 순서가 정해져 있는 일련의 작업을 차례대로 수행해야 할 때 사용하는 알고리즘 (방향 그래패의 모든 노드를 방향성에 거스트리 않도록 순서대로 나열하는것) EX) 선수 과목을 고려한 학습 순서 진입차수 : 한 노드로 들어오는 간선의 개수 ( 고급 알고리즘의 진입차수는 2이다) 위상 정렬 알고리즘은 아래와 같다. 1. 진입차수가 0인 노드를 큐에 넣는다 2. 큐가 빌 때 까지 다음의 과정을 반복한다 1) 큐에서 원소를 꺼내 해당 노드에서 출발하는 간선을 그래프에서 제거 2) 새롭게 진입차수가 0이 된 노드를 큐에 넣는다 이때 모든 원소를 방문하기 전에 큐가 빈다면 사이클이 존재한다고 판단 한다. (보통 위상정렬 문제에서는 사이클이 발생하지 않는다고 명시한다.) 위 그래프로 위상 정렬을 순서대로 이해해..