[Python] 백준 - Covernant님 문제집 : 튼튼한 기본기 5문제

ossap·2021년 12월 8일
0

준비운동 Part1. 튼튼한 기본기

코딩테스트를 대비하며 여러 문제를 풀고자 합니다.
코테 연습용 문제는 매우 많으므로, 좋은 문제들만 엄선한 포스팅을 따라 순서대로 풀겠습니다.
이번에 따라할 문제 로드맵은 이곳입니다.
Covernant님 로드맵

1. 약수 구하기 (🥉 브론즈 3티어, 2501번)

문제

어떤 자연수 p와 q가 있을 때, 만일 p를 q로 나누었을 때 나머지가 0이면 q는 p의 약수이다.
6을 예로 들면 6의 약수는 1, 2, 3, 6, 총 네 개이다.
두 개의 자연수 N과 K가 주어졌을 때, N의 약수들 중 K번째로 작은 수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 K가 빈칸을 사이에 두고 주어진다. N은 1 이상 10,000 이하이다. K는 1 이상 N 이하이다.

출력

첫째 줄에 N의 약수들 중 K번째로 작은 수를 출력한다. 만일 N의 약수의 개수가 K개보다 적어서 K번째 약수가 존재하지 않을 경우에는 0을 출력하시오.

🙋‍♀️ 내 풀이

N, K = map(int,input().split())
k_list = []
for q in range(1,N+1):
    if (N%q == 0) : k_list.append(q)
try : print(k_list[K-1])
except : print(0)

👩‍💻 다른 사람 풀이 sane2710님

a, b = map(int, input().split())
c = [i for i in range(1, a+1) if a%i==0]
print(0 if len(c)<b else c[b-1])

2. 이진수 (🥉 브론즈 3티어, 3460번)

문제

양의 정수 n이 주어졌을 때, 이를 이진수로 나타냈을 때 1의 위치를 모두 찾는 프로그램을 작성하시오. 최하위 비트(least significant bit, lsb)의 위치는 0이다.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, n이 주어진다. (1 ≤ T ≤ 10, 1 ≤ n ≤ 106)

출력

각 테스트 케이스에 대해서, 1의 위치를 공백으로 구분해서 줄 하나에 출력한다. 위치가 낮은 것부터 출력한다.

🙋‍♀️ 내 풀이

T = int(input())
for _ in range(T):
    n = bin(int(input()))[2:]
    for i in range(len(n)):
        if n[::-1][i] == '1':
            print(i, end = ' ')
1
13
0 2 3 

👩‍💻 다른 사람 풀이

T = int(input())
for _ in range(T):
    n = bin(int(input()))[2:]
    for i in range(len(n)):
        if n[-i - 1] == '1':  # 이부분 다른 방법 (거꾸로 하나씩 세기)
            print(i, end = ' ')
1
13
0 2 3 

3. 최소, 최대 (🥉 브론즈 3티어, 10818번)

문제

N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

출력

첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.

🙋‍♀️ 내 풀이

from sys import stdin
N = int(input())
all = list(map(int,stdin.readline().split()))
print(all,min(all), max(all))
# 주피터는 오류지만 백준은 정답

👩‍💻 다른 사람 풀이 jakekr님

import sys
_, *n = map(int, sys.stdin.read().split())
print(min(n),max(n))
  • 입력예시
    5
    20 10 35 30 7

📌 정수 갯수 N 받고, 밑에 한 줄의 정수들을 받을 때 유용한 코드 📌

_, *n = map(int, sys.stdin.read().split())

✅ readline()은 내가한것처럼 list로 안감싸면 오류남.

✅ 그런데 이 경우 1줄이므로 리스트를 만들 필요 X

4. 지능형 기차 2 (🥉 브론즈 3티어, 2460번)

문제 (문제가 길어, 링크 사이트에서 보는 것을 추천)

최근에 개발된 지능형 기차가 1번역(출발역)부터 10번역(종착역)까지 10개의 정차역이 있는 노선에서 운행되고 있다. 이 기차에는 타거나 내리는 사람 수를 자동으로 인식할 수 있는 장치가 있다. 이 장치를 이용하여 출발역에서 종착역까지 가는 도중 기차 안에 사람이 가장 많을 때의 사람 수를 계산하려고 한다. 단, 이 기차를 이용하는 사람들은 질서 의식이 투철하여, 역에서 기차에 탈 때, 내릴 사람이 모두 내린 후에 기차에 탄다고 가정한다.

입력

각 역에서 내린 사람 수와 탄 사람 수가 빈칸을 사이에 두고 첫째 줄부터 열 번째 줄까지 역 순서대로 한 줄에 하나씩 주어진다.

출력

첫째 줄에 최대 사람 수를 출력한다.

🙋‍♀️ 내 풀이

import sys
train = [0]
for _ in range(10):
    i,j = map(int,sys.stdin.readline().split())
    train.append(train[-1] - i + j)
print(max(train))

👩‍💻 다른 사람 풀이 rlagusdn1234님

import sys

current=0
maxpass=0
for i in range(10):
    A,B=map(int,sys.stdin.readline().split())
    current-=A
    current+=B
    if maxpass<current : maxpass=current
print(maxpass)

비슷해보이는데.. 52ms로 내코드(72ms)보다 빠르다!
이사람거는 바로바로 비교해서 교체하니까 maxpass에 값이 하나만 남는데,
내거는 append라서그런가..?

위를 토대로 고치면 빨라질까? ❌❌ 느려짐.. 76ms

import sys
train = 0
max_n = 0
for _ in range(10):
    i,j = map(int,sys.stdin.readline().split())
    train = train-i+j
    if max_n<train : max_n = train
print(max_n)

5. 피보나치 수 5 (🥉 브론즈 2티어, 10870번)

문제

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.

이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.

n=17일때 까지 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 n이 주어진다. n은 20보다 작거나 같은 자연수 또는 0이다

출력

첫째 줄에 n번째 피보나치 수를 출력한다.

🙋‍♀️ 내 풀이
처음에 이렇게 했는데 백준에서 틀렸다고 했다..
근데 코랩으로 돌려보면 옳은 피보나치수가 나온다.. 0번은 틀리지만.. 1번부턴 맞는데 그래서 틀린걸까?

n = int(input())
fib = [0,1,1]
for i in range(n-1):
    fib[2] = fib[0]+fib[1]
    fib[0] = fib[1]
    fib[1] = fib[2]
print(fib[2])

그래서 고쳤다. 이거는 정답이다.

n = int(input())
fib = [0,1]
for i in range(2,n+1):
    num = fib[i-1]+fib[i-2]
    fib.append(num)
print(fib[n])

👩‍💻 다른 사람 풀이

내가 하려던 코드와 가장 가까운 코드 izeus12님

def p(n):
    x=0
    y=1
    for i in range(n):
        x,y=y,x+y;
    return x
a=int(input())
print(p(a))

재귀 함수를 활용한 코드. 매우 클레버...🤓✨

def r(x):
    if x < 2: return x
    return r(x-1)+r(x-2)
print(r(int(input())))
profile
오삽 : 오늘도 삽질

0개의 댓글