728x90

5/ 22 파이썬 공부
1. 백준 14215 세 막대
영선이는 길이가 a, b, c인 세 막대를 가지고 있고, 각 막대의 길이를 마음대로 줄일 수 있다.
영선이는 세 막대를 이용해서 아래 조건을 만족하는 삼각형을 만들려고 한다.

- 각 막대의 길이는 양의 정수이다
- 세 막대를 이용해서 넓이가 양수인 삼각형을 만들 수 있어야 한다.
- 삼각형의 둘레를 최대로 해야 한다.
a, b, c가 주어졌을 때, 만들 수 있는 가장 큰 둘레를 구하는 프로그램을 작성하시오. 

첫째 줄에 a, b, c (1 ≤ a, b, c ≤ 100)가 주어진다.
첫째 줄에 만들 수 있는 가장 큰 삼각형의 둘레를 출력한다.

>>>코드

stick = list(map(int, input().split()))
stick.sort()
while stick[2] >= stick[0]+stick[1]:
    stick[2] -=1
print(sum(stick))



2. 백준 14264 정육각형과 삼각형
한 변의 길이가 L인 정육각형을 가지고 있다. 오늘은 이 정육각형에 세 개의 겹치지 않는 대각선을 그리려고 한다.
대각선은 정육각형을 4개의 삼각형으로 나눈다. 4개의 삼각형 중에 면적이 제일 작은 삼각형의 면적을 S라고 한다.
가능한 S중에서 최댓값을 구하는 프로그램을 작성하시오.
첫째 줄에 정육각형 한 변의 길이 L이 주어진다. (1 ≤ L ≤ 1,000,000, L은 정수)
첫째 줄에 S의 최댓값을 출력한다. 절대/상대 오차는 10**(-9)까지 허용한다.

>>>코드

L = float(input())
print(L**2*(3**0.5)/4)



계산만 하면 된다

3. 백준 14568 2017 연세대학교 프로그래밍 경시대회
2015, 2016년에 이어 2017년에도 연세대학교 교내 프로그래밍 경시대회가 열린다.
택희, 영훈이, 남규는 열심히 문제를 만들었고, 이에 대한 보상으로 과사로부터 사탕 N개를 받았다.
N개의 사탕을 적절히 나눠 가지기 위해 토론한 결과, 아래와 같은 방식으로 사탕을 나누기로 결정하였다.

- 남는 사탕은 없어야 한다.
- 남규는 영훈이보다 2개 이상 많은 사탕을 가져야 한다.
- 셋 중 사탕을 0개 받는 사람은 없어야 한다.
- 택희가 받는 사탕의 수는 홀수개가 되어서는 안 된다.
이제 사탕을 적절히 나누어 집에 돌아가던 중, 택희는 위와 같은 규칙을 만족하도록 세 명에게 사탕을 나누어 주는 방법의 수가 궁금해졌다.
사탕의 개수 N이 주어지면, 사탕을 세 사람에게 분배하는 서로 다른 경우의 수를 세 보자.
첫째 줄에 사탕의 총 개수 N이 주어진다. (1 ≤ N ≤ 100)
규칙에 맞게 사탕을 분배하는 경우의 수를 출력한다. 택희, 영훈이, 남규가 받은 사탕의 수를 각각 A, B, C개라고 할 때, 서로 다른 (A, B, C) 순서쌍의 수를 세면 된다.
만일 규칙에 맞게 사탕을 분배하는 방법이 없다면 0을 출력한다.

>>>코드

N = int(input())
r = 0
for i in range(1, N):
    for j in range(2, N):
        if (N-i-(i+j))% 2 == 0 and 2*i+j<N:
            r += 1
print(r)



4. 백준 14579 덧셈과 곱셈
남규는 최근에 덧셈과 곱셈을 배웠다.
하지만 도현이는 남규가 제대로 배웠는지에 대해 의심을 가지고 있다.
그래서 도현이는 남규에게 문제를 내기로 했는데, 문제는 아래와 같다.

a, b (1 ≤ a < b ≤ 1000)가 주어졌을 때

(1+2+…+a) * (1+2+…+(a+1)) * … * (1+2+…+(b-1)) * (1+2+…+b)

의 값을 계산하라.
남규는 사실 이 값을 계산하지 못한다.
그래서 남규는 a, b가 주어졌을 때, 위의 값의 결과가 얼마인지 구하는 프로그램이 필요하다.
남규를 위해 위 식을 계산해내는 프로그램을 하나 만들어 주자.
첫째 줄에 a, b (1 ≤ a < b ≤ 1000)가 주어진다.
위의 문제의 결과를 출력한다.
단, 결과가 매우 커질 수 있으니 14579로 나눈 나머지를 출력한다.

>>>코드

a, b = map(int, input().split())
r = 1
for i in range(a, b+1):
    n = 0
    for j in range(i+1):
        n += j
    r = r * n
print(r%14579)



5. 백준 14720 우유 축제
영학이는 딸기우유, 초코우유, 바나나우유를 좋아한다.
입맛이 매우 까다로운 영학이는 자신만의 우유를 마시는 규칙이 있다.

(1) 맨 처음에는 딸기우유를 한 팩 마신다.
(2) 딸기우유를 한 팩 마신 후에는 초코우유를 한 팩 마신다.
(3) 초코우유를 한 팩 마신 후에는 바나나우유를 한 팩 마신다.
(4) 바나나우유를 한 팩 마신 후에는 딸기우유를 한 팩 마신다. 
영학이는 우유 축제가 열리고 있는 우유거리에 왔다. 우유 거리에는 우유 가게들이 일렬로 늘어서 있다.
영학이는 우유 거리의 시작부터 끝까지 걸으면서 우유를 사먹고자 한다.
각각의 우유 가게는 딸기, 초코, 바나나 중 한 종류의 우유만을 취급한다.
각각의 우유 가게 앞에서, 영학이는 우유를 사마시거나, 사마시지 않는다.
우유거리에는 사람이 많기 때문에 한 번 지나친 우유 가게에는 다시 갈 수 없다.
영학이가 마실 수 있는 우유의 최대 개수를 구하여라.

첫째 줄에 우유 가게의 수 N이 주어진다. (1 ≤ N ≤ 1000)
둘째 줄에는 우유 가게 정보가 우유 거리의 시작부터 끝까지 순서대로 N개의 정수로 주어진다.
0은 딸기우유만을 파는 가게, 1은 초코우유만을 파는 가게, 2는 바나나우유만을 파는 가게를 뜻하며, 0, 1, 2 외의 정수는 주어지지 않는다.
영학이가 마실 수 있는 우유의 최대 개수를 출력하시오.

>>>코드

N = int(input())
milk = list(map(int, input().split()))
n, r = 0, 0
for i in range(N):
    if milk[i] == n and n != 2:
        r += 1
        n += 1
    elif milk[i] == n and n == 2:
        r += 1
        n = 0
print(r)



6. 백준 14909 양수 개수 세기
주어진 N개의 정수 중에서 양의 정수의 개수를 출력하는 프로그램을 작성하시오.
첫째 줄에 최대 1,000,000개의 정수가 주어진다. 
입력으로 주어지는 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같다.
첫째 줄에 양의 정수의 개수를 출력한다.

>>>코드

n = list(map(int, input().split()))
r = 0
for i in range(len(n)):
    if n[i] >0:
        r += 1
print(r)



7. 백준 14913 등차수열에서 항 번호 찾기
등차수열이란 다음과 같이 연속하는 두 수의 차이가 일정한 수열을 뜻한다.

- 1, 3, 5, 7, 9, ..., 2n-1
- 2, 4, 6, 8, 10, ..., 2n
- 1, 5, 9, 13, 17, ..., 4n-3
- -1, -3, -5, -7, -9, ..., -2n+1
- a, a+d, a+2d, a+3d, ,,,. a+(n-1)d
등차수열에서 인접한 두 수의 차이를 공차라고 한다.
첫 항 a와 공차 d로 만든 등차수열에서 주어진 k가 몇 번째 항인지 찾아서 출력하는 프로그램을 작성하시오
첫 줄에 나란히 세 정수가 주어진다.

첫째 수: 첫 항 a (-1,000 < a < 1,000)
둘째 수: 공차 d (-1,000 < d < 1,000, d ≠ 0)
셋째 수: 찾는 수 k (-1,000,000 < k < 1,000,000)

k가 몇 번째 항인지 출력한다. 만약, k가 주어진 a와 d로 만들어진 등차수열의 수가 아니면 "X"를 출력한다.

>>>코드

a, d, k = map(int, input().split())
if (k-a)%d != 0 or (k-a)//d<0:
    print('X')
else:
    print((k-a)//d +1)


조금 헤멨는데, 첫항 a는 무조건 첫항이어야하고 -1번째항 같은건 없어야 한다는 것을 생각해야한다.

8. 백준 14656 조교는 새디스트야!!
헌우는 제주도로 수학여행을 갔다. 들뜬 마음으로 공항을 나와 맞은 것은, 선글라스를 쓴 조교였다.
"선린인들, 아주 예의바르고 최고라고 들었는데 제가 맡았던 학교 중에서 최악입니다. 여기서 번호 순서대로 서지 않은 사람들은 전부 빠따로 맞을 각오하시기 바랍니다.“
그 말인즉슨, 자신의 번호 순대로 서지 않은 사람들은 엉덩이가 야구공이 된다는 것이다. 헌우네 반 학생 수 N이 주어지고 N명의 번호가 현재 줄 서있는 순서대로 주어질 때, 몇 명의 학생들이 맞게 될지 구하여라.
첫 번째 줄에 헌우네 반 학생의 수 N이 주어진다. (1 ≤ N ≤ 20,000) 
두 번째 줄에 학생들의 번호가 현재 줄을 서있는 순서대로 주어진다. (1 ≤ 번호 ≤ N) 중복되는 번호는 없다.
몇 명이 맞게 될지 구하여라.

>>>코드

n = int(input())
student  = list(map(int, input().split()))
answer = [i+1 for i in range(n)]
r = 0
for i in range(n):
    if student[i] != answer[i]:
        r += 1
print(r)



9. 백준 15734 명장 남정훈
오늘도 어김없이 피시방에서 피파를 하고 있는 정훈이는 큰 고민에 빠졌다. 
자신에 팀에 있는 선수들의 주 사용 발(Main Foot)이 적절하게 나눠져있지 않기 때문이다. 
정훈이의 팀에는 L명의 왼발잡이 선수와, R명의 오른발잡이 선수, A명의 양발잡이 선수가 존재한다. 
양발잡이 선수는 오른발잡이 선수처럼 생각해도 되고, 왼발잡이 선수로도 생각해도 된다. 
11명의 주전선수를 뽑기 전에 정훈이가 가진 팀원을 정리하려고 한다. 
정훈이는 왼발잡이와 오른발잡이 선수의 수를 같게 만든 다음, 나머지 인원은 방출하려 한다. 
정훈이가 정리하고 난 다음, 팀에 잔류하고 있는 선수의 최대 수를 구해보자.
첫 번째 줄에 왼발잡이 선수의 수 L, 오른발 잡이 선수의 수 R, 양발잡이 선수의 수 A가 주어진다. 
각 수는 0이상 100이하이다. 첫 번째 줄에 최대 잔류 인원 수를 출력한다.

>>>코드

L, R, A = map(int, input().split())
if abs(L-R)>=A:
    if L>R:
        print((R+A)*2)
    else:
        print((L+A)*2)
else:
    if L>R:
        print(L*2+(A-(L-R))//2 *2)
    else:
        print(R*2+(A-(R-L))//2 *2)



계산이 조금 복잡하긴 한데
나는 A가 L과 R의 차이보다 클 때와 작을 때의 경우를 나누어서 코드를 작성했다.

10. 백준 15894 수학은 체육과목입니다
성원이는 수학을 정말 못 하는 고등학생이다. 수학을 못하는 대신 근성과 팔 힘이 뛰어난 성원이는 수학 시험에서 수학 지식을 사용하지 않고 근성과 체력을 사용해 문제를 푼다. 지난 시험에서는 아래 사진에 나와있는 문제를 근성과 체력을 사용해 열심히 풀었지만 사진에서 볼 수 있듯이 틀려버리고 말았다!
결국 이 문제는 틀려버렸지만 성원이는 여전히 자신의 체력에 강한 자신감을 갖고 있다. 어떤 어려운 문제가 나와도 이런 식으로 근성과 체력을 사용하면 다 풀 수 있으니 이 방법은 최고의 방법이라고 생각하고 있다.
성원이의 친구 형석이는 근성과 체력으로 수학 문제를 푸는 것은 굉장히 무식한 방법이라고 생각한다. 형석이는 수학을 공부하면 문제를 훨씬 빨리 풀 수 있다는 것을 알려주기 위해 위 사진에 나와있는 문제를 갖고 성원이와 퀴즈 내기를 하기로 했다. 위 사진의 문제를 다시 정리하면 아래와 같다.
"한 변의 길이가 1인 정사각형을 아래 그림과 같이 겹치지 않게 빈틈없이 계속 붙여 나간다. 가장 아랫부분의 정사각형이 n개가 되었을 때, 실선으로 이루어진 도형의 둘레의 길이를 구하시오."
가장 아랫부분의 정사각형 개수가 주어지면 그에 해당하는 답을 출력하는 프로그램을 만들어 형석이를 도와주자!
첫 번째 줄에 가장 아랫부분의 정사각형 개수 n이 주어진다. (1 ≤ n ≤ 109)
첫 번째 줄에 형석이가 말해야 하는 답을 출력한다.

>>>코드

N = int(input())
print(N*4)



그냥 4의 배수이다

11. 백준 15917 노솔브 방지문제야!!
여러분은 Q개의 쿼리를 수행해야 합니다. 수행해야 하는 쿼리는 다음과 같습니다.
어떤 수 a를 2의 거듭제곱 꼴로 나타낼 수 있는가?
첫 줄에 Q가 주어집니다. (1 ≤ Q ≤ 10**6)
두 번째 줄부터 Q+1번째 줄까지 a가 주어집니다. a는 1이상 2**31-1이하 자연수입니다.
각 쿼리마다, 답이 Yes이면 1을, 그렇지 않으면 0을 출력합니다.

>>>코드 1

import sys
Q = int(input())
for i in range(Q):
    a = int(sys.stdin.readline())
    while a != 1:
        if a%2 ==1:
            print(0)
            break
        else:
            a = a//2
    if a == 1:
        print(1)



나는 하나씩 나눠보았다. 다른방법도 생각해보자

>>>코드 2

import sys
Q = int(input())
A = [2**i for i in range(32)]
for i in range(Q):
    a = int(sys.stdin.readline())
    if a in A:
        print(1)
    else:
        print(0)



어차피 a의 범위가 2**31 -1까지라면, a가 가능한 수는 1 부터 2**31까지 32개 밖에 없기에 그냥 정답리스트를 하나 만들어 버린 수 비교하는 방법이 있다.

12. 백준 15921 수찬은 마린보이야!!
부산의 자랑! 동래의 희망! 부산 앞바다에서 수영선수의 꿈을 키워온 수찬이는 우리나라(자투리 지식: 우리 한민족이 세운 나라를 스스로 이르는 말은 합성어로서 ‘우리나라’로 붙여 표기)의 자랑스런 국가대표 수영선수가 되었다.
수찬이는 인터넷 뉴스를 통해 이번 2020 도쿄 하계올림픽 관련 전문가들의 인터뷰를 찾아보고 있다. 자신을 교수라고 소개한 어떤 전문가에 따르면, 유럽의 유명 대학 연구팀의 연구 결과에 따르면, 통계적으로 어떤 선수가 대회에서 연습과 비슷하게 꾸준한 기량을 뽐낼 수 있는 확률은 
(연습 기록들의 평균값) / (연습 기록들 중 하나를 균일한 확률로 뽑을 때의 기댓값) 이라고 한다.
수찬이는 이 기사를 읽고 무릎을 탁(!) 치며 자신의 연습 기록을 가지고 이 확률을 계산해보기로 했다. 
수찬이가 꾸준한 기량을 뽐낼 수 있는 확률은 얼마일까?
첫째 줄에 수찬이의 연습 기록의 개수 N이 주어진다. (0 ≤ N ≤ 100)
둘째 줄에 수찬이의 연습 기록 N개가 주어진다. 
N이 0이면 아무것도 주어지지 않으며 연습 기록은 100 이하의 양의 정수이다.
문제에서 제시한 확률을 소수 셋째 자리에서 반올림하여 소수 둘째 자리까지 출력한다. 
N이 0이거나 분모가 0인 경우에는 “divide by zero”를 출력한다.

>>>코드

N = int(input())
if N == 0:
    print('divide by zero')
else:
    time = list(map(float, input().split()))
    print('1.00')


설명이 맞다면 평균값과 기대값은 항상 같기에 1만 나온다.

13. 백준 16673 고려대학교에는 공식 와인이 있다
다음은 고려대학교 포털에 나와 있는 고대 와인에 대한 글 일부이다.

개교 100주년 공식 와인 ‘라 까르돈느(La Cardonne) 2000년’의 뒤를 잇는 우당 박종구 회장 기부 와인 ’나파밸리 2000(Napa Valley 2000)‘, 고대와인 ’클라랑델 루즈2005(Calarendelle Rouge 2005)’, ‘클라랑델 루즈 2009(Clarendelle Rouge 2009)', ‘클라랑델 루즈 2011(Clarendelle Rouge 2011)'을 판매하였으나, 재고량 소진으로 인해 ㈜고대미래 크림슨스토어에서 독점 수입하여 선보이는 ‘라스토 랑데올 2014(Rasteau L’Andeol 2014)’ 와 ‘샤토 클락 2014(Chateau Clarke 2014)’ 로 변경하여 판매합니다.
이 글을 본 수빈이는 고려대학교 와인 콜렉팅이라는 목표를 가지게 되었다. 하지만 그냥 모으면 재미가 없으니 규칙을 가지고 와인을 수집하려고 한다.

와인을 사기로 마음먹은 해를 0년 차라고 정의하고, n년 차에는 Kn+Pn2 만큼의 와인을 사는 것을 목표로 했다. K는 수빈이의 고려대 애착 정도를 나타내는 상수이고, P는 수빈이의 구매중독 정도를 나타내는 상수이다. 
그렇게 수빈이는 C년 동안 열심히 와인을 모았다. (마지막 해에 산 와인의 수는 KC + PC2가 된다.)
수빈이는 와인이 이제 방에 가득 쌓여, 자기가 얼마나 수집했는지 수를 세기 어려웠다.
여러분이 수빈이가 와인을 얼마나 수집했는지 계산해주자.
첫 번째 줄에 수빈이가 와인을 모은 년수, 수빈이의 고려대 애착 정도, 수빈이의 구매중독 정도를 의미하는 정수 C, K, P가 공백으로 구분되어 주어진다. (0 ≤ C ≤ 100, 0 ≤ K ≤ 1000,  0 ≤ P ≤ 100)
첫 번째 줄에 수빈이가 C년 동안 수집한 와인 수를 출력한다.

>>>코드

C, K, P = map(int, input().split())
wine = 0
for i in range(C+1):
    wine += (K*i + P*(i**2))
print(wine)


14. 백준 16479 컵라면 측정하기
컵라면은 두 개의 밑면이 서로 평행하며, 원 모양인 원뿔대이다. 따라서 컵라면을 옆에서 본 모습은 아래 그림과 같은 등변사다리꼴이다.
위 등변사다리꼴에서 민수가 측정한 컵라면의 윗면의 지름은 D1, 아랫면의 지름은 D2이다. 민수가 아직 측정하지 않은 변의 길이는 K이다. 이때, (컵라면의 높이)2의 값을 알아내는 프로그램을 작성하시오. (단, 컵라면의 높이는 등변사다리꼴에서 평행한 두 변 사이의 거리로 정의한다.)
첫째 줄에 K의 값이 주어진다. 둘째 줄에는 D1과 D2의 값이 사이에 공백을 한 개 두고 차례대로 주어진다. 
단, K, D1, D2의 값은 양의 정수이다.
첫째 줄에 (컵라면의 높이)2의 값을 출력한다. 절대/상대 오차는 10**(-6) 까지 허용한다.

>>>코드

K = float(input())
D1, D2 = map(float, input().split())
print(K**2 - ((D1-D2)/2)**2)



40점이 만점이다

15. 백준 16483 접시 안의 원
접시는 아래의 그림과 같이 중심이 같은 두 원이 겹쳐져 있는 형태이다.
여기에서 작은 원의 접선이 큰 원과 만나는 두 점 사이의 거리를 T, 작은 원의 반지름을 b, 큰 원의 반지름을 a라고 한다. T의 값이 주어지면, a**2-b**2의 값을 구하는 프로그램을 작성하시오.
첫째 줄에 양의 정수 T의 값이 주어진다. 단, T의 값은 10,000 이하이다.
a**2-b**2의 값을 소수점 아래의 첫째 자리에서 반올림하여 정수로 출력한다. 예를 들어, a**2-b**2의 값이 1.91이면 2를 출력한다.

>>>코드

T = float(input())
print(round((T/2)**2))



16. 백준 15667 2018 연세대학교 프로그래밍 경진대회
2015, 2016, 2017년에 이어 올해도 연세대학교 컴퓨터과학과 프로그래밍 경진대회가 열린다.
도현이는 4년 연속 교내대회가 개최된다는 것에 감격하여, 사비를 털 각오로 화려한 개막식을 준비했다.
도현이가 원하는 것은 폭죽으로, 강의실 A528에서 천장을 다 뚫어버리며 터지는 화려한 폭죽을 모두가 좋아할 것이라 생각했다. 도현이는 아래와 같이 터지는 폭죽을 주문하려 한다.

(1) 처음 발사된 폭죽이 만든 하나의 대형 불꽃은 적당한 높이에 도달하면 화려한 폭발과 함께 K개의 중형 불꽃으로 갈라진다.
(2) 각 K개의 중형 불꽃은 다시 각각 K개의 소형 불꽃으로 갈라지며 터진다.
(3) 그 이후 모든 불꽃은 소멸한다.
도현이는 적당한 폭죽을 찾아보려 했지만, 폭죽 판매처에서는 K의 값을 알려주지 않았고,
대신 폭죽 하나당 만들어지는 총 불꽃의 수(처음 터진 대형 불꽃을 포함해, 중형 불꽃과 소형 불꽃을 모두 포함한 수)만을 알려줬다. 결국 도현이는 어떤 폭죽이 적당할지 알아내지 못해 폭죽을 구매하지 못했다.
이에 도현이는 이 난제를 해결해주는 학생에게 이번 대회에서 맞은 문제 수를 하나 늘려주기로 하였다. 여러분은 대회에서 우승하기 위해, 폭죽이 만들 모든 불꽃의 개수가 주어지면 K의 값을 찾아보도록 하자.

총 불꽃의 수 N이 주어진다. (3 ≤ N ≤ 10101)
K의 값을 출력한다. 이 값은 정수임이 보장되며, 불가능한 경우는 입력으로 주어지지 않는다.

>>>코드

N = int(input())
for i in range(1, N):
    if 1 + i + i**2 ==N:
        print(i)
        break
728x90

+ Recent posts