1. K번째 약수 풀이
아이디어 및 구체적 풀이
1. 입력값 파악 N(자연수 개수) K(작은 순서)
2. N의 약수 리스트에 저장
3.인덱싱 생각
내가 짠 코드
import sys
sys.stdin=open("input.txt", "r")
N,K=map(int,input().split(' '))
a=[]
for i in range(1,N+1):
if(N%i==0):
a.append(i)
lenght=len(a)
if(K>lenght):
print(-1)
else:
print(a[K-1])
모범 답안
고찰
모범 답안의 코드는 출력단에서 약수와 순서를 계산 했다.
또한 리스트를 따로 만들지 않고 카운팅을 하여 인덱싱을 했다.
처음 sort 함수 사용을 고려하였지만 1 부터 나누어 이미소팅이 되어서 다시 안써도 된다는 걸 꺠달아서 sort는 사용하지 않았다.
2. K번째 수
아이디어 및 구체적 풀이
#0. 입력값 T(테스트 개수),N(자연수 개수),s(시작번째),e(마지막 번째),k(k번쨰수 출력)
#1. T의 개수만큼 반복문
#2. 반복문 내에서 입력값 소팅(오름차순)
#2-1. s,e슬라이싱 리스트 만들기
#2-2 슬라이싱한 리스트 소팅
#2-3 소팅된 리스트 인덱싱 출력
내가 짠 코드
import sys
sys.stdin=open("input.txt", "r")
T=int(input())
for i in range(T):
N,s,e,k=map(int,input().split(' '))
a=[]
number=list(map(int,input().split()))
sn=number[s-1:e]
sn.sort()
print('#%d %d' %(i+1,sn[k-1]))
모범답안
고찰
오우 쓉 모범 답안이랑 거진 비슷하다.
어떤것은 따로 변수로 받고 어떤것은 리스트로 받아서 처리를 해야할지에 대한 고민이 길었다.
띄어 쓰기로 구분된 여러개의 숫자를 리스트에 한번에 저장 하는 법에 대한 고민을 많이 하였다.
그외는 무난했다.
3. K번째 큰 수
아이디어 및 구체적 풀이
0.입력값 N(입력할 자연수 갯수), K(3개를 더한 값 중 K번쨰로 큰수)
1. 빈 리스트에 세개의 합의 모든 경우 저장
2. set함수로 중복 제거
3. sort로 내림차순 소팅
4. 인덱싱 출력
import sys
sys.stdin=open("input.txt", "r")
N,K=map(int,input().split(' '))
number=list(map(int,input().split(' ')))
sum=[]
for i in range(N):
for j in range(i+1,N):
for k in range(j+1,N):
sum.append(number[i]+number[j]+number[k])
set_sum=set(sum)
set_list=list(set_sum)
set_list.sort(reverse=True)
print(set_list[K-1])
모범 답안
고찰
중복을 없애기 위해 SET은 잘 사용했다.
모범 답안은 처음부터 set을 선언한 뒤 집합에 값을 추가 하였고 마지막에 리스트로 변형 하였다.
모범 답안처럼하면 처음 빈 리스트를 생성 하지 않아 약간은 더 코드가 짧아진다.
4. 최솟값 구하기
최소값을 구하는 코드
5. 대표값
아이디어 및 구체적 풀이
0.입력값 N(점수의 개수), 각각의 점수들
1. 각 점수의 평균 정수로 계산.
2. 각 점수에서 평균을 뺀 절대값 계산해서 가장 가까운 수 찾기
3. 점수가 같을 경우 점수가 높은 학생 출력
4. 높은 점수 마저 같을 경우 학생 번호가 빠른 번
아 enum 갑자기 생각
내가 짠 코드
import sys
sys.stdin=open("input.txt", "r")
N=int(input())
number=list(map(int,input().split(' ')))
sum=0
for i in range(N):
sum+=number[i]
avg=int(round(sum/N,0))
Min=100
Max_score=0
for i,score in enumerate(number):
abs_min=abs(avg-score)
if(Min>=abs_min):
Min=abs_min
if(Max_score<score):
Max_score=score
indx=i
print( avg,indx+1)
모범답안
고찰
생각 보다 너무 많은 시간이 걸렸다.
우선 enumerate를 사용하지 않고 코드를 짜다갑자기 enumerate가 떠올라 코드를 다시 짰다.
또한 변수명을 처음 의미 없이 대충 지어 차후에 혼동이 와서 시간이 오래 걸렸다.
앞으로 변수명을 지을 때 더 신경 써야겠다.
6. 정다면체
아이디어 및 구체적 풀이
0. 입력값 N,M 각 정다면체의 면 개수
1. 반복문으로 각 눈의 갯수가 나온 횟수를 2차원 리스트에 넣는다.
2. 리스트중 가장 큰값을 찾는다.
내가 짠 코드
import sys
sys.stdin=open("input.txt", "r")
N,M=map(int,input().split(' '))
Max=0
a=[0]*(N+M+1)
for i in range(2,N*M):
for n in range(1,N+1):
for m in range(1,M+1):
a[n+m]+=1
for k in range(N+M+1):
if(Max<a[k]):
Max=a[k]
print(Max)
print(a)
for h in range(N+M+1):
if(a[h]==Max):
print(h,end=' ')
모범 답안
고찰
처음 배열의 인덱스 값을 눈의 합으로 사용한건 잘 떠올린것 같다.
하지만 처음 눈의 합들을 찾는 과정에서 불필요한 for문을 사용해서 코드가 더 길어지고
쓸데 없는 변수를 사용했다.
앞으로 잠깐 생각하고 리팩토링을 생각하며 진행해야겠다.
7. 자릿수의 합
아이디어 및 구체적 풀이
0. 입력값 N(입력될 자연수의 갯수) , 각 자연수들
1. digit_sum이라는 함수로 10씩 나누어 각 자리수를 구한다.
내가 짠 코드
import sys
sys.stdin=open("input.txt", "r")
N=int(input())
def digit_sum(x):
sum=0
while(x>0):
sum=sum+x%10
x=x//10
return sum
Max=0
Max_index=-1
a=list(map(int,input().split()))
for i in range(N):
if(Max<digit_sum(a[i])):
Max=digit_sum(a[i])
MAx_index=i
print(a[Max_index])
모범 답안
고찰
모범 답안과 큰 차이없는 접근
8. 소수의 개수(에라토스테네스 체)
아이디어 및 구체적 풀이
0. 입력값 N(몇번쨰 까지의 소수의 갯수를 구해야하는지)
1. N+1 크기의 0으로 채운 리스트 선언 리스트의 인덱스를 각 자연수로 생
2. 0부터 N까지 하나하나 내부에 반복문을 만들어 소수인지 확인하고 그 확인한 수의 배수를 1로 체크
3. 즉, 소수가 인건 0으로 아닌건 1로 체크 그리고 각 리스트의 값이 0일때 마다 카운
4.
내가 짠 코드
import sys
sys.stdin=open("input.txt", "r")
N=int(input())
a=[0]*(N+1)
count=0
for i in range(2,N):
if(a[i]==0):
count+=1
for j in range(2,N//i):
a[i*j]=1
print(count)
모범답안
고찰
소수인 자연수의 배수 값들으 1로 체크하는 과정에서 시간을 소요 하였다.
모범 답안을 보니 range 문법을 잘 활용해서 직관적으로 더 잘 짠것같다.
9. 뒤집은 소수
아이디어 및 구체적 풀이
0. 입력값 N(입력받는 자연수 개수), 각 자연수들 입력
1. 숫자를 뒤집는 reverse함수 구현 ==> 1. x=x%10*10+ x//10
2. 소수인지 확인하는 함수 isPrime 구현
내가 짠코드
import sys
sys.stdin=open("input.txt", "r")
N=int(input())
def reverse(x):
count=len(x)
x=int(x)
while(count>1):
x=x%10*10+x//10
count-=1
return x
def isPrime(x):
for i in range(2,x):
if(x%i==0):
return False
else:
return True
nubmer=input().split(' ')
print(nubmer)
for i in nubmer:
if isPrime(reverse(i)):
print(reverse(i),end=' ')
모범 답안
고찰
reverse를 만드는 로직은 잘 구성 하였다.
하지만 isPrime함수 로직을 생각하는데 꽤 많은 고민을 했다.
또한 모범 답안에는 temp에 따로 reverse값을 넣고 소수 판별을 진행 하였다.
나도 다음에 다른 함수에서 나온 값을 따로 변수에 넣고 다음 단계로 넣어가야겠다.
10. 주사위 게임
아이디어 및 구체적 풀이
0. 입력값 N(참여한 수 즉 던진 횟수) , 각각 던져 나온 횟수
1. 조건문으로 분기 나누기
내가짠 코드
import sys
sys.stdin=open("input.txt", "r")
N=int(input())
Max=0
sum=0
for i in range(N):
if(Max<sum):
Max=sum
a,b,c=map(int,input().split(' '))
if(a==b and b==c):
sum=10000+a*1000
elif(a==b or a==c):
sum=1000+a*100
elif(b==c):
sum=1000+100*b
else:
if(a>b and a>c):
sum=100*a
elif(b>c and b> a):
sum=100*b
else:
sum=100*c
print(Max)
모범 답안
고찰
모범 답안은 처음 스트링으로 입력을 받고 소팅을 한 후 int로 형변환을 하였다.
소팅을 왜 했는지 몰라 강의 를 보니 오름 차순으로 해야 a를 기준으로 계산이 되어서이다.
나 이부분을 놓치고 생각 없이 그냥 짜버렸다. 아마 백준을 돌렸으면 오답이라고 떴을 것이다.
11. 점수 계산
아이디어 및 구체적 풀이
0. 입력값 N(문제의 개수), 문제가 맞은경우 1 틀린경우 0
1. 가중치 cnt 를 생각하여 입력값이 1이면 가중치를 +1 하고 아닌경우 다시 가중치를 0으로 변경하는 반복
내가 짠 코드
sys.stdin=open("input.txt", "r")
N=int(input())
a=list(map(int,input().split(' ')))
cnt=0
score=0
for i in range(N):
if(a[i]==1):
cnt+=1
score=score+cnt
else:
cnt=0
print(score)
모범 답안
고찰
가중치 생각을 잘 떠올려 아주아주 무난하게 잘 풀었다.
1학년 때도 이러한 문제를 풀 때 시간을 꽤나 썼어도 못 풀었던 기억이 있는데
이번엔 3분도 안되서 풀어서 기분이 좋았다. !
'코딩테스트 > 파이썬 알고리즘 문제풀이 입문' 카테고리의 다른 글
이분탐색(결정 알고리즘) & 그리디 알고리즘 (0) | 2023.07.22 |
---|---|
탐색 & 시뮬레이션 (0) | 2023.07.16 |
insert와 append의 차이점 (0) | 2023.07.15 |
파이썬 기초 문법 (0) | 2023.07.14 |
코딩 테스트 준비 팁 (0) | 2023.07.14 |