인프런의 파이썬 알고리즘 문제풀이 강의를 공부합니다
1. K번째 약수
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)
- 두개의 값을 나란히 입력받을 때
n, k= map(int, input().split())
- 범위
for i in range(1, n+1):
- 약수 구하기
if n%i==0:
약수는 1부터 존재함으로 범위는 1부터 인덱스값을 포함하기위해 +1을 한다
2. K번째 수
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("#%d %d" %(t+1, a[k-1]))
- 리스트 입력받기
map(int, input().split())
- 항상 n번째는 idx로 n-1
s~e 번째 = [s-1:e] Index
- 오름차순 정렬
a.sort()
3. K번째 큰 수
n, k = map(int, input().split())
a = list(map(int, input().split()))
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])
res=list(res)
res.sort(reverse=True)
print(res[k-1])
- 3개를 뽑아서 중복을 제거하는 방법
- 중첩 for문 사용하기
set()
- 리스트 자료형을 set(리스트)를 통해서 set 타입으로 변경하면서 중복을 제거합니다.
그 후에list(set(리스트)) 다시 리스트로 감싸주어서 리스트 타입으로 데이터를 변경
- 내림차순
res.sort(reverse=True)
- 오름차순
sort(default = false)
[ + ] 최솟값 구하기
arr = [5,3,7,9,2,5,2,6]
arrMin = float('inf')
for i in range(len(arr)):
if arr[i]<arrMin:
arrMin=arr[i]
print(arrMin)
arrMin2 = float('inf')
for i in range(len(arr)):
if arr[i]<= arrMin2:
arrMin=arr[i]
arrMin3 = arr[0]
for i in range(len(arr)):
if arr[i]< arrMin3:
arrMin=arr[i]
arrMin4 = float('inf')
for x in arr:
if arr[i]< arrMin4:
arrMin=arr[i]
4. 대표값
n = int(input())
a = list(map(int, input().split()))
ave=round(sum(a)/n)
ave=ave+0.5
ave=int(ave)
min=2147000000
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)
- 절댓값
abs()
- idx, 값을 쌍으로 가져오기
enumerate()
5. 정다면체
n, m =map(int, input().split())
cnt=[0]*(n+m+3)
max=-214700000
for i in range(1, n+1):
for j in range(1, m+1):
cnt[i+j]+=1
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=' ')
- 줄바꿈 없이 일자로 출력:
end=' '
6. 자릿수의 합
n = int(input())
a = list(map(int, input().split()))
def digit_sum(x):
sum=0
while x>0:
sum += x%10
x = x//10
return sum
max=-2147000000
for x in a:
tot=digit_sum(x)
if tot>max:
max=tot
res=x
print(res)
n = int(input())
a = list(map(int, input().split()))
def digit_sum(x):
sum=0
for i in str(x):
sum+=int(i)
return sum
max=-2147000000
for x in a:
tot=digit_sum(x)
if tot>max:
max=tot
res=x
print(res)
7. 에라토스테네스 체
n = int(input())
ch = [0]*(n+1)
cnt=0
for i in range(2, n+1):
if ch[i]==0:
cnt+=1
for j in range(i, n+1, i):
ch[j]=1
print(cnt)
- 배수들을 다 제거
range(start, stop, step)
8. 뒤집은 소수
def reverse(x):
res=0
while x>0:
t= x%10
res= res*10+t
x=x//10
return res
def isPrime(x):
if x==1:
return False
for i in range(2, x//2+1):
if x%i==0:
return False
else:
return True
n = int(input())
a =list(map(int, input().split()))
for x in a:
tmp = reverse(x)
if isPrime(tmp):
print(tmp, end=' ')
9. 주사위 게임
n = int(input())
res=0
for i in range(n):
tmp = input().split()
tmp.sort()
a, b, c =map(int, tmp)
if a==b and b==c:
money= 10000+a*1000
elif a==b or a==c:
money= 1000+(a*100)
elif b==c:
money= 1000+(b*100)
else:
money= c*100
if money>res:
res=money
print(res)
- elif는 참이되면 밑으로 내려가지 않기 때문에 모두 충족이 필요한것 (좋은 조건은 가장 위로 설정)
10. 점수계산
n = int(input())
a = list(map(int, input().split()))
sum=0
cnt=0
for x in a:
if x==1:
cnt+=1
sum+=cnt
else:
cnt=0