[백준] 수학 1단계

ddalkigum·2020년 11월 5일
2

알고리즘

목록 보기
2/15
post-thumbnail

백준 1193 분수 찾기 파이썬

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

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

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

첫째 줄에 분수를 출력한다.

풀이

x= int(input())
n= 1

while x>0:
    x -=n
    n +=1

num = x+n-1
if n %2 ==0:
    print(n-num,"/",num, sep="")
else:
    print(num,"/",n-num, sep="")

n이 홀수일 경우, 짝수일 경우 시작점이 다르므로 구분


백준 2869 달팽이는 올라가고 싶다 파이썬

문제

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

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

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

첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.

예제 입력 1 복사

2 1 5

예제 출력 1 복사

4

풀이

import math
a, b, h = map(int, input().split())
n = math.ceil((h-a)/(a-b))+1
print(n)

n을 구하는 것이기 때문에

이런식으로 n을 구함


백준 2755 부녀회장 파이썬

문제

평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려고 한다.

이 아파트에 거주를 하려면 조건이 있는데, “a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약 조항을 꼭 지키고 들어와야 한다.

아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 주어지는 양의 정수 k와 n에 대해 k층에 n호에는 몇 명이 살고 있는지 출력하라. 단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다.

입력

첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다. (1 <= k <= 14, 1 <= n <= 14)

출력

각각의 Test case에 대해서 해당 집에 거주민 수를 출력하라.

예제 입력 1 복사

2
1
3
2
3

예제 출력 1 복사

6
10

풀이

t = int(input())
for _ in range(t):
    k = int(input())
    n = int(input())
    people = [p for p in range(1, n+1)]
    for _ in range(k):
        for j in range(1, n):
            people[j] += people[j-1]
    print(people[-1])

출력에 나와있듯이, 전체 출력수 t를 입력,
반복해주면서, k (층수), n (호수) 를 입력
0층 i호에는 i명이 살고있으므로, list로 묶어줌 [1, 2, 3, 4 ... i]
여기서 범위를 1, n+1 까지로 한 이유는 1호 부터 시작이고,
n+1로 범위를 설정한 이유는 뒤에 있는 people에서 j-1 때문에
범위를 n으로 설정해버리면 j-1에서 범위가 벗어나기 때문
그후에 n호까지 리스트 안의 숫자를 더해주면서 k층에 있는 n호의 사람의 수를 구함.


백준 2292 벌집

문제

https://www.acmicpc.net/JudgeOnline/upload/201009/3(2).png

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

입력

첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.

출력

입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.

예제 입력 1

13

예제 출력 1

3

풀이

x = int(input())
n = 1
i = 1

*while* x > n:
n += 6 * i
i += 1
print(i) 

1 >> 1칸 >> 1

2 ~ 7 >> 2칸 >> 6

8 ~ 19 >> 3칸 >> 12

25 ~ 44 >> 4칸 >> 18
...

6* ( i )로 증가 함.

n에는 i 칸 일때, 벌집의 갯수를

i 는 중앙부터 몇 칸 인지를 알아내기 위해

결과적으로 i값을 구하는 문제이므로 print해서 x일때, 중앙에서 몇칸 떨어진지 알수 있다.


백준 2839 설탕 배달

풀이

n = int(input())
x = 0

while True:
    if n % 5 == 0:
        x = x + (n // 5)
        print(x)
        break
    n = n - 3
    x = x + 1
    if n < 0:
        print(-1)
        break

총 배달 횟수 x를 구하는 문제로,

일단 처음에는 최소공배수로 접근을 해야겟다 생각을 해서 ,
n % 15 == 0 일때부터 시작을 해서 접근하려 했는데,
굳이 코드를 15로 나눠서 코드를 늘릴 필요가 없겟다고 생각해서
5로 나누었을때 0이 되면 끝나게 해야겟다 생각했다.

문제 풀이의 포인트는

n = n-3 
x = x+1 

n 을 3으로 나누었을때, 나머지를 구하는 식으로 접근을 하려했으나,
그렇게 하게되면 15로 나누었을때, 나머지가 4와 9인경우로 나누고,
식을 이어가야 하기때문에, 코드가 길어진다.
더 간단한 방법을 찾다가 n을 3으로 빼주었을때, 배달횟수를 1씩 늘려야 겟다고 생각했고
n이 3으로 나누어지지 않는 n -3 이 음수가 되었을때, -1을 출력하는 식으로 코드를 작성했다.


백준 10250 ACM 호텔

문제

풀이

t = int(input())

for i in range(t):
    h, w, o = map(int, input().split())
    floor = o % h
    room_number = o // h + 1
    if o % h == 0:
        floor = h
        room_number = o // h

    print(floor * 100 + room_number)

h x w 의 판에서 숫자를 구하는 알고리즘

층수는 o / h 했을때 나머지의 숫자

호수는 몫을 구하면 해결됨

호수는 0이 없기 때문에 +1 을 해줌

예외가 있다면 나머지가 0일때

제일 마지막 층에 숙소를 잡게 되기 때문에 floor 가 h 의 값을 가지면 되요오....


백준 1011 Fly me to the Alpha Centauri

문제

풀이

모르겟어 와 진짜 이거는 도무지 모르겟다.
처음 생각 했던건 거리를 반으로 나누고,
홀수일 때, 짝수일 때 두가지로 나누어서
반까지의 거리를 등차수열 합을 리스트에 담고 그 length의 *2 .....

"아.... 안되겠다..."

5 일때 (1 2 1 1 ) (1 1 2 1)
6 일때 (1 2 2 1)
오? 1하고 1사이에 경우의수를 구하면 되나? 싶엇다.
코드를 짜보려고 하는데 어떤식으로 짜야할지 생각이 도저히 안나서 풀이를 찾아봤습니다.

내가 찾아본 풀이

t = int(input())

for _ in range(t):
    x, y = map(int,input().split())
    distance = y - x
    count = 0  # 이동 횟수
    move = 1  # count별 이동 가능한 거리
    move_plus = 0  # 이동한 거리의 합
    while move_plus < distance :
        count += 1
        move_plus += move  # count 수에 해당하는 move를 더함
        if count % 2 == 0 :  # count가 2의 배수일 때, 
            move += 1  
    print(count)

https://ooyoung.tistory.com/91

많은 페이지를 봤지만, 이분의 설명이 가장 이해가 잘되서 공유 할게요 😁

끄적끄적....


profile
딸기검 -본캐🐒 , 김준형 - 현실 본캐 🐒

0개의 댓글