백준/백준 파이썬

백준 파이썬 Today I Learn 2023.06.03

군청레프 2023. 6. 5. 23:30
728x90

6/ 03 파이썬 공부
1. 백준 18856 피드백
N이 주어졌을 때, 아래 조건을 만족하는 수열 A를 구해보자.

- A의 크기는 N이다.
- 1 ≤ i ≤ N-1에 대해서, Ai < Ai+1을 만족해야 한다.
- 1 ≤ Ai ≤ 1,000을 만족해야 한다.
- A2는 2가 되어야 한다.
- AN은 소수가 되어야 한다.

첫째 줄에 N이 주어진다.
첫째 줄에 N을 출력한다.
둘째 줄에 A1, A2, ..., AN을 공백으로 구분해서 출력한다.

>>>코드

n = int(input())
print(n)
for i in range(n):
    if i != n-1:
        print('%d' %(i+1), end = ' ')
    else:
        print(997)



그냥 간단하게 풀었는데
a2가 2면서 계속해서 커져야 되면 1부터 시작해서 1씩 더해주면 되고,
an이 소수여야 하면 범위 내에서 가장 큰 소수를 그냥 마지막으로 출력하면 된다.

2. 백준 24724 현대모비스와 함께하는 부품 관리
현대모비스는 연간 매출 36조 이상의 글로벌 7위 자동차 부품사입니다.
1977년에 설립된 현대모비스는 'Innovation for Humanity, Mobility for Tomorrow'를 비전으로 자율주행, 커넥티비티, 전동화 등 미래 모빌리티 분야를 선도하기 위해 역량을 집중하고 있습니다.
현대모비스는 전동화, 제동, 샤시, 서스펜션, 조향, 에어백, 램프, 전장 등 자동차 핵심부품 개발에 앞장서고 있으며, 특히 센서, ECU 센서 융합, 안전 제어를 위한 소프트웨어 개발 분야에서 뛰어난 전문성을 보유하고 있습니다.
2022년 새 학기를 맞이하면서 현대모비스에서 연세대학교 프로그래밍 동아리 모르고리즘 회원들에게 사내 견학 및 현장 체험 기회를 제공해줬다. 그에 따라서 동아리원들은 현대모비스 본사로 견학을 가게 되었다.
현대모비스는 자동차 부품을 만들고 그 부품들을 여러 그룹으로 나눠서 관리한다. 안전사고를 방지하기 위해서 각 그룹별로 그룹에 속한 부품들의 크기의 합이 A를 넘기지 않으면서 무게의 합이 B를 넘기지 않게 하려고 한다. 
또한, 부품 관리의 효율성을 위해서 그룹의 수를 최소화하려고 한다. 
동아리원들의 현장 체험으로 현대모비스는 이러한 "부품 관리 프로그램"을 동아리원에게 만들어보게 하려고 한다. 
그리고 현장에 대한 경험이 부족한 동아리원들을 위해서 "부품 관리 프로그램"의 일부로 들어갈 "그룹 분류 프로그램"을 미리 제공한다.
그룹 분류를 하려고 하는 부품의 크기와 무게가 주어졌을 때, "부품 관리 프로그램"을 만들어보자.

첫 번째 줄에 부품 관리 횟수를 나타내는 양의 정수 T가 주어진다. (1 <= T <= 10)
각 부품 관리에 대한 입력은 다음과 같이 주어진다.
첫 번째 줄에는 부품의 개수를 나타내는 양의 정수 N이 주어진다. (1 <= N <= 10,000)
두 번째 줄에는 각 그룹의 크기 제한과 무게 제한을 나타내는 양의 정수 A와 B가 주어진다.(1 <= A, B <= 10^9)
세 번째 줄부터 N개의 줄에 걸쳐서 각 부품의 크기와 부품에 대한 정보를 나타내는 양의 정수 u_i와 v_i가 주어진다. 
u_i와 v_i는 각각 i번째 부품의 크기와 무게를 나타낸다. (1 <= u_i <= A, 1 <= v_i <= B)

각 부품 관리에 대해서 다음을 출력한다.

첫 번째 줄에는 Material Management x를 출력한다. 
x는 부품 관리 process의 번호를 의미하고, 이는 1부터 시작하여 1씩 증가한다.
두 번째 줄에는 현대모비스에서 개발한 그룹 분류 프로그램의 완료를 나타내는 문구인 Classification ---- End!를 출력한다.

>>>코드

import sys
for t in range(int(input())):
    n = int(sys.stdin.readline())
    a, b = map(int, sys.stdin.readline().split())
    l = [list(map(int, sys.stdin.readline().split())) for i in range(n)]
    print('Material Management %d' %(t+1))
    print('Classification ---- End!')



문제가 길어 뭔가 해야하는거 같지만 그냥 입력받고 출력만 하면 된다

3. 백준 11908 카드
승현이는 앞면과 뒷면이 있는 카드 n장을 가지고 있습니다. 
각 카드의 앞면에는 1 이상 2222 이하의 정수가 적혀 있으며, 이 수는 카드마다 서로 다릅니다. 
각 카드의 뒷면에는 동물 그림이 그려져 있으며, 이 그림 역시 카드마다 서로 다릅니다.

승현이는 카드들을 바닥에 뒷면이 보이도록 일렬로 늘어 놓고, 차례대로 1 이상 n 이하의 자연수 번호를 붙였습니다. 이 중 i번 카드의 앞면에 적혀 있는 수를 ci로 둡시다. 승현이는 바닥에 카드가 정확히 한 장 남을 때까지 아래와 같은 행동을 반복합니다.

승현이는 마음에 드는 서로 다른 카드 두 장을 앞면이 보이도록 뒤집어 봅니다.
승현이는 앞면에 더 작은 수가 적혀 있는 카드를 주머니 속에 넣고, 더 큰 수가 적혀 있는 카드는 다시 바닥에 뒷면이 보이도록 내려놓습니다.
카드가 두 장 이상 남았다면 1번으로 돌아갑니다. 카드가 정확히 한 장 남았다면, 승현이는 주머니 속에 있는 카드들을 꺼내 앞면에 적혀 있는 수들의 합을 구합니다.
승현이는 큰 수가 좋아서, 마지막에 주머니 속에 들어있는 카드들에 적혀 있는 수들의 합을 가능한 한 크게 하고자 합니다. (뒷면에 그려진 동물 그림이 서로 다르므로 방법만 알고 있다면 충분히 가능합니다!) 승현이를 도와주세요.

첫 번째 줄에 카드의 수를 나타내는 자연수 n이 주어집니다. (1 ≤ n ≤ 2222)
두 번째 줄에 c1,c2,⋯,cn이 공백을 사이에 두고 차례대로 주어집니다.
첫 번째 줄에 가능한 최대 합을 출력합니다.

>>>코드

n = int(input())
card = list(map(int, input().split()))
print(sum(card) - max(card))



문제가 길어서 번잡한데
그냥 전체 합에서 가장 큰 값을 빼면 된다.

4. 백준 17945 통학의 신
태현이는 매일 한양대로 통학하는 학생이다. 태현이가 집에서 나와서부터 건물까지 도착하는 데는 약 1시간 40분이 걸린다. 태현이는 올해부로 3년 째 통학하고 있다. 오늘 태현이는 학교를 가기 위해 1시간 40분 전에 출발했으나, 열차가 지연되어 아직 왕십리까지 오지도 못했다. 평소에도 통학이 지긋지긋했지만 오늘 태현이는 화가 머리 끝까지 났다. 이게 과연 받아들이고 말아야 할 일인가? 하루에 길바닥에 4시간을 버리다니! 매번 학교까지 오는데 에너지를 다 써버려서 수업을 들을 힘도 없다.

열차는 왜 매번 지연되고, 지하철엔 왜 이렇게 사람이 터지는가! 아침 통학길마다 태현이는 평생 사람과 이렇게 가까이 붙어본 적이 없다고 느낀다. 열차를 조금만 증설해 준다면 태현이의 통학길이 조금 편해질 텐데… 하지만 피곤에 쩐 태현이가 할 수 있는 것은 그렇게 많지 않았다.

너무 화가 난 태현이는 통학 동아리를 만들기로 했다. 매일 모여서 통학이 얼마나 힘든지에 대해 이야기하고 서로 위로를 해주는 동아리이다. 태현이에게 이 동아리는 큰 힘이 되었고, 힘든 통학길마다 서로를 격려해주며 하나의 힘이 되어나갔다.

태현이를 비롯한 통학 동아리 회원들을 가엾이 여긴 통학의 신은 자비를 베풀어 통학 동아리 사람 중, 단 한 명에게 학교를 왔다갔다 할 때 순간이동 할 수 있는 권한을 주어 통학의 고통에서 벗어나게 하려한다. 그는 이 행운을 자신이 만든 테스트를 통과한 회원들에게 하사하려 한다. 

사실 통학의 신이 만든 테스트는 아니다. 통학의 신은 요즘 학습지를 풀고 있는데, 수학엔 영 젬병이라 힘들어 한다. 간단한 이차방정식의 근을 구하고 싶은데, 제대로 풀리지 않아 괜히 사람들에게 문제를 내서 학습지를 안 풀고 학습지 선생님께 칭찬을 받으려는 것이다.

태현이는 통학 동아리 회장이지만 이 엄청난 행운을 통해 통학 동아리에서 나가고 싶어한다. 태현이를 도와주자!

x2  + 2Ax + B = 0 의 두 계수 A, B가 주어진다. A, B는 정수이며, 이 방정식의 근은 항상 정수이다. (-1000 ≤ A, B ≤ 1000)
첫 번째 줄에 방정식의 근들을 모두 공백으로 분리해 오름차순으로 출력한다. 중근일 경우 하나만 출력한다.

>>>코드

a, b = map(int, input().split())
if a**2 - b == 0:
    print(-a)
else:
    print('%d %d' %(-a-(a**2 - b)**0.5, -a+(a**2 - b)**0.5))



이것도 문제가 길어서 어지러운데 핵심은 x2  + 2Ax + B = 0 이 이차방정식을 푸는 간단한 문제이다.
앞은 다 잡설이다.

728x90