본문 바로가기

Baekjoon

백준 일반 수학 1 python 문제풀이 (2720, 2903, 2292, 1193, 2869)

반응형

 

2720

미국으로 유학간 동혁이는 세탁소를 운영하고 있다. 동혁이는 최근에 아르바이트로 고등학생 리암을 채용했다.

동혁이는 리암에게 실망했다.

리암은 거스름돈을 주는 것을 자꾸 실수한다.

심지어 $0.5달러를 줘야하는 경우에 거스름돈으로 $5달러를 주는것이다!

어쩔수 없이 뛰어난 코딩 실력을 발휘해 리암을 도와주는 프로그램을 작성하려고 하지만, 디아블로를 하느라 코딩할 시간이 없어서 이 문제를 읽고 있는 여러분이 대신 해주어야 한다.

거스름돈의 액수가 주어지면 리암이 줘야할 쿼터(Quarter, $0.25)의 개수, 다임(Dime, $0.10)의 개수, 니켈(Nickel, $0.05)의 개수, 페니(Penny, $0.01)의 개수를 구하는 프로그램을 작성하시오. 거스름돈은 항상 $5.00 이하이고, 손님이 받는 동전의 개수를 최소로 하려고 한다. 예를 들어, $1.24를 거슬러 주어야 한다면, 손님은 4쿼터, 2다임, 0니켈, 4페니를 받게 된다.

 

n = int(input())


for i in range(n):
    change = int(input())
    q1, m1 = divmod(change, 25)
    q2, m2 = divmod(m1, 10)
    q3, m3 = divmod(m2, 5)
    
    
    print(q1, q2, q3, m3, end=' ')
    print()

 

2903

시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 128 MB 31866 22686 20678 71.736%

문제

상근이는 친구들과 함께 SF영화를 찍으려고 한다. 이 영화는 외계 지형이 필요하다. 실제로 우주선을 타고 외계 행성에 가서 촬영을 할 수 없기 때문에, 컴퓨터 그래픽으로 CG처리를 하려고 한다.

외계 지형은 중앙 이동 알고리즘을 이용해서 만들려고 한다.

알고리즘을 시작하면서 상근이는 정사각형을 이루는 점 4개를 고른다. 그 후에는 다음과 같은 과정을 거쳐서 지형을 만든다.

  1. 정사각형의 각 변의 중앙에 점을 하나 추가한다.
  2. 정사각형의 중심에 점을 하나 추가한다.

초기 상태에서 위와 같은 과정을 한 번 거치면 총 4개의 정사각형이 새로 생긴다. 이와 같은 과정을 상근이가 만족할 때 까지 계속한다.

아래 그림은 과정을 총 2번 거쳤을 때까지의 모습이다.

     
초기 상태 - 점 4개 1번 - 점 9개 2번 - 25개

상근이는 어떤 점은 한 개 보다 많은 정사각형에 포함될 수 있다는 사실을 알았다. 메모리 소모량을 줄이기 위해서 중복하는 점을 한 번만 저장하려고 한다. 과정을 N번 거친 후 점 몇 개를 저장해야 하는지 구하는 프로그램을 작성하시오.

 

n = int(input())

# 초기 값
k = 2

for _ in range(n):
    k = 2 * k - 1

print(k ** 2)

 

2292

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.

 

n = int(input())

# 1번 방은 예외처리
if n == 1:
    print(1)
else:
    layer = 1  # 현재층
    range_max = 1  # 각 계층의 마지막 방 번호

    # 입력된 n이 속하는 계층을 찾기 위해 반복
    while n > range_max:
        range_max += 6 * layer  # 각 계층의 방 번호는 6의 배수로 늘어남
        layer += 1

    print(layer)

 

1193

무한히 큰 배열에 다음과 같이 분수들이 적혀있다.

1/1 1/2 1/3 1/4 1/5
2/1 2/2 2/3 2/4
3/1 3/2 3/3
4/1 4/2
5/1

이와 같이 나열된 분수들을 1/1 → 1/2 → 2/1 → 3/1 → 2/2 → … 과 같은 지그재그 순서로 차례대로 1번, 2번, 3번, 4번, 5번, … 분수라고 하자.

X가 주어졌을 때, X번째 분수를 구하는 프로그램을 작성하시오.

 

 

 

  • 첫 번째 대각선: 1/1
  • 두 번째 대각선: 1/2, 2/1
  • 세 번째 대각선: 3/1, 2/2, 1/3
  • 네 번째 대각선: 1/4, 2/3, 3/2, 4/1

 

 


n = int(input())

line = 1  # 대각선 라인 번호
max_num = 1  # 해당 라인의 마지막 숫자

# 입력된 n이 속한 라인을 찾음
while n > max_num:
    line += 1
    max_num += line

# n번째 수는 line번째 대각선에 위치
# 그 대각선에서 몇 번째 수인지 계산
diff = max_num - n  # 대각선에서 뒤로 몇 번째인지

if line % 2 == 0:
    # 짝수번째 대각선 (위로 올라가는 경우)
    numerator = line - diff
    denominator = 1 + diff
else:
    # 홀수번째 대각선 (아래로 내려가는 경우)
    numerator = 1 + diff
    denominator = line - diff

print(f"{numerator}/{denominator}")

 

2869

땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.

달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.

달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.

 

 

처음에는 밤, 낮을 0.5일씩 분리하여서 아래처럼 풀려고 하였는데..

math 를 사용하면 훨씬 쉽게 풀린다.

import math

A, B, V = map(int, input().split())

# (V - A) 만큼 올라가야 하는 높이를 먼저 구하고,
# 그 뒤 매일 (A - B) 만큼 올라가는 일수 계산 후,
# 마지막 날 A만큼 올라가서 종료.
day = math.ceil((V - A) / (A - B)) + 1

print(day)
반응형