sec02(1-5).코드 구현력 기르기

sec02-1번 k번째 약수구하기

import sys

sys.stdin = open("input.txt", "rt")

#input파일에 있는 수가 띄워져서 들어오기 때문에 map으로 읽어주기
n, k = map(int, input().split())

cnt = 0
for i in range(1, n+1):
	if n%i == 0 : 
		cnt += 1
	if cnt == k:
		print(i)
		break
else:
	print(-1)

✔️input().split()으로 읽어오면 string으로 읽어오게 되므로 int내장함수로 정수화 시켜주기


sec02-2번 k번째 수

import sys

sys.stdin = open("input.txt", "rt")

#케이스 개수
T = int(input())

for t in range(T):
    n, s, e, k = map(int, input().split())
    a = list(map(int, input().split()))
    a = a[s-1:e]
    a.sort()
    print("#", t+1, a[k-1])

✔️ 다른 출력방식 print("#%d %d" %(t, a[k-1]))


02-3번 k번째 큰 수

#sec02_n3_K번째 큰 수
import sys

sys.stdin = open("input/input_sec02_n3.txt", "rt")

n, k = map(int, input().split())
a = list(map(int, input().split()))

#자료구조 set = 중복을 제거한다.
res = set()
for i in range(n):
    for j in range(i+1, n):
        for m in range(j+1, n):
            res.add(a[i]+a[j]+a[m])

#자료구조 set은 sort기능이 없기때문에 list화 
res = list(res)
res.sort(reverse=True)
print(res[k-1])


✏️ 세개의 수 조합을 어떻게 해결해야할지 모르겠었는데 강의 풀이 영상을 보니 for문으로 해결할 수 있는 거였다. 분명 옛날에 했던건데 기억이 1도 안난다... 더 열심히 해야겠다 ^_^...


sec02. 최솟값구하기

#최솟값 구하기 

arr = [5,3,7,9,2,5,2,6]

arrMin = float('inf') #arrMin에 가장 큰 값이 저장됨(초기화 시킨 값)

for i in range(len(arr)):
    if arr[i] < arrMin:
        arrMin = arr[i]
print(arrMin)

sec02-4번 대표값 구하기

#대표값
import sys

sys.stdin = open('input/input_sec02_n4.txt', 'rt')

N = int(input())
a = list(map(int, input().split())) #학생들 점수를 학생번호 순서대로 받아온다.
sum = 0

#학생 전체 점수 총합
for n in range(N):
    sum += a[n]

#평균 구하기 
av = round(sum / N)

#평균과 학생들 각각의 점수 비교를 위한 리스트 생성
b = list()

for n in range(N):
    b.append(int(a[n] - av))

#절댓값으로 평균과 가장 가까운 점수를 구한다.
minIndex = abs(b[0])
minIndexlist = list()

for n in range(1, N):
    if abs(b[n]) <= minIndex:
        minIndex = abs(b[n])
        minIndexlist.append(n)

#평균과 가까운 점수들 중에서 높은 점수를 구한다.
result = b[minIndexlist[0]]

for i in range(1, len(minIndexlist)):
    if result < b[minIndexlist[i]] :
        result = minIndexlist[i]

print(av, result+1)


🔎


sys.stdin = open('input/input_sec02_n4.txt', 'rt')

N = int(input())
a = list(map(int, input().split())) #학생들 점수를 학생번호 순서대로 받아온다.
sum = 0

#학생 전체 점수 총합
for n in range(N):
    sum += a[n]

#평균 구하기 
av = round(sum / N)

#평균과 학생들 각각의 점수 비교를 위한 리스트 생성
b = list()

for n in range(N):
    b.append(int(a[n] - av))

#절댓값으로 평균과 가장 가까운 점수를 구한다.
minIndex = abs(b[0])
index = 0

for n in range(1, N):
    if abs(b[n]) < minIndex:
        minIndex = abs(b[n])
        index = n



#같은 절댓값에서 크기가 크고 학번순이 빠른 사람을 고른다.
#같은 절댓값을 가진 값이 있다면 리스트에 추가해줌
abc = list()        

for n in range(1, N):
    if abs(b[n]) == minIndex:
        abc.append(n)

max = a[abc[0]]
result = abc[0]

for i in range(1, len(abc)):
    if max < a[abc[i]]:
        max = a[abc[i]]
        result = abc[i]

print(av, result+1)


<강의 자료꺼 코드>

import sys

#sys.stdin = open('input/input_sec02_n4.txt', 'rt')

N = int(input())
a = list(map(int, input().split())) #학생들 점수를 학생번호 순서대로 받아온다.

ave =  round(sum(a)/n)

min = 2147000000

#idx는 리스트 a의 idx값이 반환된다, x는 실제 값이 쌍으로 대응된다. -> enumerate
for idx, x in enumerate(a):
    tmp = abs(x-ave)
    if tmp < min:
        min = tmp
        score = x
        res=idx+1
    elif tmp == min:
        if x > score:
            score = x
            res = idx + 1  

print(ave, res)

sec02-5번 정다면체

# 정다면체
import sys

sys.stdin = open("sec02/input/input_sec02_n5.txt", 'rt')

N, M = map(int, input().split())
#두 눈의 합을 저장할 리스트
a = list()

for n in range(N):
    for m in range(M):
        a.append((n+1) + (m+1))

#두눈의 합의 빈도수를 저장할 리스트
b = list()

for i in range(2, N+M+1):
    count = 0
    for j in range(len(a)):
        if i == a[j]:
            count += 1
    b.append(count)

#가장 확률이 높은 = 가장 많이 나오는 빈도수 구하기
maxNumber = 0 
for i in range(len(b)):
    if b[i] >= maxNumber:
        maxNumber = b[i]

# 높은 빈도수를 가지는 눈의 합 구하기
for i in range(len(b)):
    if b[i] == maxNumber:
        print(a[i], end=" ")

정 N면체와 정 M면체를 던졌을때 나올수 있는 눈의 합 경우를
구한다. → 리스트 a

나올수 있는 눈의 합 경우 : 최소 2부터 N+M까지

이 경우가 몇번나왔는지 구한다 → 리스트 b

가장 확률이 높은 숫자 = 가장 많이 나온 눈의합 빈도수 이므로 높은 빈도수를 가지는 눈의 합을 구한다 → maxNumber

높은 빈도수를 가지는 숫자가 여러개일수 있으므로 같은 높은 빈도수를 가지는 눈의 합을 구한다.

✏️코드를 다시 살펴보니 앞부분을 삼중포문으로 할수 있겠다는 생각이 들었다.

<강의자료 코드>

# 정다면체
import sys

sys.stdin = open("sec02/input/input_sec02_n5.txt", 'rt')

n, m = map(int, input().split())

#크기 n+m이고 초기값 0인 리스트 생성
cnt = [0]*(n+m+1)

#각 수의 합으로 cnt인덱스를 구분해 수 세줌
for i in range(1, n+1):
    for j in range(1, m+1):
        cnt[i+j]  += 1

max = 0

for i in range(n+m+1):
    if cnt[i] > max:
        max = cnt[i]

for i in range(n+m+1):
    if cnt[i] == max:
        print(i, end=" ")

✏️강의 자료의 코드인데 여기서는 합의 개수를 저장할 cnt라는 리스트를 생성해 사용했다. 두수의 합을 cnt인덱스로 사용해 두수의 합이 얼마나 나오는지 확인했다. 이게 더 깔끔한거 같고 cnt[i+j] += 1 이렇게 사용하는 방식이 참신했다

좋은 웹페이지 즐겨찾기