백준 파이썬 Today I Learn 2023.05.27
5/ 27 파이썬 공부
1. 백준 14920 3n+1 수열
다음의 점화식에 의해 정해지는 수열 C(n)을 생각하자:
C(n+1) = C(n)/2 (C(n)이 짝수일 때)
= 3*C(n)+1 (C(n)이 홀수일 때)
초항 C(1)이 자연수로 주어지면, 이 점화식은 자연수로 이루어지는 수열을 정한다.
예를 들어, C(1)=26이면, 다음의 수열이 된다.
26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1, 4, 2, 1, ...
이 경우, 수열의 뒷부분은 4, 2, 1 이 끝없이 반복된다.
실제로 C(1)이 5×260보다 작은 자연수인 모든 수열은 언젠가는 4, 2, 1로 끝나게 된다는 것이 알려져 있다.
주어진 입력 C(1)에 대하여 C(n)이 처음으로 1이 되는 n을 출력하시오.
입력: C(1); 1 ≤ C(1) ≤ 100000
출력: C(n)이 처음으로 1이 되는 n
>>>코드
c = int(input())
i = 1
while True:
if c == 1:
break
if c%2 == 1:
c = 3*c + 1
else:
c = c//2
i += 1
print(i)
2. 백준 15780 멀티탭 충분하니?
오늘은 NAVER D2 캠퍼스에서 CTP 스터디 하는날!!! 스터디 장소가 인하대학교 강의실에서 NAVER D2 캠퍼스로 바뀌었기 때문에 멀티탭 부장 준호는 스터디 전에 미리 멀티탭을 셋팅 해야 한다.
CTP는 모든 사람이 사용할만큼 충분한 멀티탭을 가지고 있다. 종류는 3구부터 8구까지 다양하게 있다.
모든 사람들은 노트북만 가져오기 때문에 멀티탭 1구를 무조건 사용한다. 1구를 초과해선 안 된다.
CTP에는 멀티탭에 2개이상 연속으로 코드를 꽂으면 안되는 특별한 규칙이 있다.
준호는 미리 계산을 해서 모두가 코드를 꽂을 수 있게 멀티탭을 K개 챙겨 갔다.
하지만 준호는 수학과에서 수학을 못해 전과했기 때문에 가끔 멀티탭을 적게 가지고 올 때가 있다.
수학을 더 잘하는 여러분이 멀티탭을 충분히 챙겨왔는지 준호에게 알려주자
최초 전기 공급원(벽면 콘센트)는 총 K개이고, 각각의 멀티탭은 개별적으로 전기를 공급받는다.
즉, 멀티탭을 다른 멀티탭에 이어서 연결하는 경우는 없다.
입력의 첫째 줄에 스터디에 온 학생의 수 N(1 ≤ N ≤ 100)명 멀티탭의 수 K(1 ≤ K ≤ 100)가 주어진다.
이후 두 번째 줄에 각 멀티탭 구의 수 A[i](3 ≤ A[i] ≤ 8) 가 주어진다.
모든 사람이 멀티탭에 코드를 꽂을 수 있는경우 “YES” 아니라면 “NO”를 출력한다.
>>>코드
n, k = map(int, input().split())
mt = list(map(int, input().split()))
r = 0
for i in range(k):
if mt[i]%2 ==1:
r += (mt[i]//2 +1)
else:
r += mt[i]//2
if r>=n:
print('YES')
else:
print('NO')
3. 백준 27294 몇개고?
고려대학교 로봇융합관에서 MatKor Cup을 준비하던 주영이는 같이 초밥을 먹자는 동우의 말에 호랭이 초밥 집에 갔다. 모듬 초밥을 먹으면서 동우와 주영이는 다음과 같은 대화를 하였다.
동우: "몇개고?"
주영: "응?"
동우: "밥알말이다. 몇개고?"
주영: "그건 또 뭔데?"
동우: "삼백 이십개다. 훈련된 초밥 장인이 이 한번 스시를 쥘 때 보통은 이 밥알이 삼백 이십개라. 점심 식사에는 삼백 이십개가 적당하다 캐도, 오늘 같은 날이나 술하고 같이 낼 때는 이백 팔십개만 해라, 어이? 배 안부르구로"
주영: "어디서 또 이상한거 배워왔냐"
동우: "너 혹시 재벌집 막내아들 뭔지 모르나?"
주영: "모른다"
대한민국을 뒤흔든 드라마를 모른다는 주영이의 말에 동우는 적잖은 충격을 받았다.
사태의 심각성을 느낀 동우는 주영이가 '재벌집 막내아들'을 보게 하기 위해 MatKor 사람들을 모았다.
주영이에게 그냥 영상을 보여주는 것보다 알고리즘을 이용해서 알려주어야 흥미를 가지게 할 수 있다고 생각한 MatKor 사람들은 주영이가 드라마에 흥미를 가지게 하기 초밥 밥알 갯수로 문제를 만들기로 했다.
자 MatKor에서 문제를 만들었고, 동우가 주영이에게 문제를 말했다.
동우: "오늘 나는 너가 만든 초밥을 먹을 거야. 너는 '재벌집 막내아들'의 진양철 회장님의 말에 따라 술하고 같이 초밥을 먹거나 점심 식사가 아닐 때는 초밥의 밥알을 280개로 하며, 점심 식사이면서 술과 같이 먹지 않을때는 초밥의 밥알을 320개로 하여 초밥을 만들어야 해, 근데, 내가 초밥을 언제 먹을지, 혹은 술과 같이 먹을지 아직 정하지 않았어. 내가 초밥을 먹는 시간과 술의 유무를 말하면, 그때 너는 너가 만들어야 하는 초밥의 밥알 갯수를 구해야해"
당신은 위의 문제를 읽고 주영이를 대신하여 동우의 문제를 해결하여라.
첫 번째 줄에 시간을 의미하는 정수 T (0 <= T <= 23)와 술의 유무를 의미하는 정수 S (0 <= S <= 1)가 공백으로 구분되어 주어진다.
T가 11이하이면 아침 시간, 12이상 16 이하이면 점심 시간, 그렇지 않으면 저녁 시간을 뜻한다.
S가 1 이면 술과 함께 먹는 것을 의미하며, 0 이면 술 없이 초밥을 먹는 것을 의미한다.
첫 번째 줄에 주영이가 만들어야 하는 초밥 하나의 밥알의 갯수를 출력하여라.
>>>코드
t, s = map(int, input().split())
if t<= 11 or t>16 or s ==1:
print(280)
else:
print(320)
4. 백준 28113 정보섬의 대중교통
숭실대학교 정보과학관은 숭실대입구역으로부터 멀리 떨어져 있는 대신, 바로 앞에 숭실대별관앞이라는 명칭의 버스 정류소가 자리 잡고 있다.
학부 연구생 찬솔이는 야근을 마치고 대중교통을 이용해 집에 가려고 한다. 다행히 아슬아슬하게 막차가 끊기지 않은 상황인데, 구체적으로 A분 뒤에 숭실대별관앞 정류소에 집으로 가는 마지막 버스가 도착하고, B분 뒤에 숭실대입구역에 집으로 가는 마지막 열차가 도착한다.
찬솔이는 지금 버스 정류소에 서 있다. 그런데, 찬솔이는 지하철 역까지 걸어가서 지하철을 타는 것이 여기서 버스를 타는 것 보다 빠를 수도 있다는 사실을 알아차려 버렸다. 숭실대입구역의 지하철 승강장까지 걸어가는데는 N분이 걸린다. 버스와 지하철 중 더 먼저 탈 수 있는 것이 무엇인지 알려줘서 야근한 찬솔이의 피로를 회복시켜 주자.
단, 버스와 지하철이 도착한 뒤 탑승하는 데 걸리는 시간은 신경 쓰지 않고, 버스와 지하철 모두 도착한 직후에 승객을 태운 뒤 기다리지 않고 바로 떠난다. 또한 지하철 역에 도착하는 시간과 지하철 열차가 도착하는 시간이 정확히 같다면 지하철을 탈 수 있다.
첫째 줄에 N,A,B가 공백으로 구분되어 주어진다.
버스에 더 먼저 탑승할 수 있으면 Bus, 지하철에 더 먼저 탑승할 수 있으면 Subway, 버스와 지하철에 탑승하게 되는 시간이 동일하면 Anything을 출력한다.
>>>코드
n, a, b = map(int, input().split())
if b>=n and b<a:
print('Subway')
elif b>=n and b == a:
print('Anything')
else:
print('Bus')
5. 백준 28074 모비스
현대 모비스의 MOBIS는 어떤 뜻을 가지고 있을까?
MOBIS는 기존에는 Mobile + System의 합성어에서 시작되었지만, 현재는 "Mobility Beyond Integrated Solution" 라는 의미로 재정의 되었다.
이는 사용자의 경험을 혁신하고, 고객의 요구에 최적화된 통합 솔루션, 그 이상의 가치를 전달하는 모빌리티 플랫폼 프로바이더로 도약하겠다는 뜻을 가지고 있다.
이 뜻에 매료된 진익이는 스티커 용지에 인쇄되어 있는 문자들 중 'M', 'O', 'B', 'I', 'S' 만을 오리고 적절히 배치하여 노트북에 MOBIS를 붙여놓고자 한다.
스티커 용지에 인쇄되어 있는 문자열이 주어진다. 이 문자들을 이용해 MOBIS를 만들 수 있을까?
첫째 줄에 문자열이 주어진다.
주어진 문자열에 포함된 알파벳 대문자들을 이용해 MOBIS를 만들 수 있으면 "YES", 그렇지 않으면 "NO"를 출력한다.
>>>코드
s = input()
if 'M' in s and 'O' in s and 'B' in s and 'I' in s and 'S' in s:
print('YES')
else:
print('NO')
6. 백준 28097 모범생 포닉스
모두가 알다시피, 포닉스는 포스텍을 대표하는 모범생이다!
포닉스는 최고의 모범생답게 남들과는 다른 공부 계획표를 가지고 있다.
포닉스는 총 N개의 공부 계획을 가지고 있다.
i번째 공부 계획을 실행하는 데에는 T_i시간이 소모된다.
포닉스는 각 계획을 순서대로 시행하며, 각 계획 사이에는 8시간만큼의 휴식을 취한다.
N개의 공부 계획을 모두 마친 포닉스는 지금의 시간이 첫 번째 공부 계획을 시작한 시간으로부터 얼마나 지났는지 궁금해졌다. 포닉스가 마지막 공부를 마칠 때까지 걸린 총 시간이 며칠 몇 시간인지 구해 보자.
1일은 24시간이다.
첫 번째 줄에 공부 계획의 수 N이 주어진다. (1<= N<= 120)
두 번째 줄에 각 계획의 공부 시간을 나타내는 N개의 정수 T_1,T_2,... ,T_N이 공백으로 구분되어 주어진다.
(10 <= T_i <= 30)
모든 계획을 마친 후의 소요 시간을 일과 시간 단위로 공백으로 구분하여 출력한다.
>>>코드
n = int(input())
study = list(map(int, input().split()))
t = (n-1)*8 + sum(study)
print('%d %d' %(t//24, t%24))
7. 백준 1978 소수 찾기
주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.
첫 줄에 수의 개수 N이 주어진다. N은 100이하이다.
다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.
주어진 수들 중 소수의 개수를 출력한다.
>>>코드
n = int(input())
m = list(map(int, input().split()))
r = 0
for i in range(n):
if m[i] == 1:
r += 1
for j in range(2,m[i]):
if m[i]%j == 0:
r += 1
break
print(n-r)
8. 백준 2581 소수
자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오.
예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 소수는 61, 67, 71, 73, 79, 83, 89, 97 총 8개가 있으므로, 이들 소수의 합은 620이고, 최솟값은 61이 된다.
입력의 첫째 줄에 M이, 둘째 줄에 N이 주어진다.
M과 N은 10,000이하의 자연수이며, M은 N보다 작거나 같다.
M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.
단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.
>>>코드
m = int(input())
n = int(input())
N = []
for i in range(m, n+1):
for j in range(2, i+1):
if i%j == 0 and j != i:
break
if i%j == 0 and j == i:
N.append(i)
if len(N) == 0:
print(-1)
else:
print(sum(N))
print(min(N))
9. 백준 2292 벌집
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
>>>코드
n = int(input())
m, i = 1, 0
while True:
if n<= m:
break
i += 1
m += 6*i
print(i+1)
6의 배수로 증가된다 (+6, +12, +18, +24, ...)
10. 백준 28062 준석이의 사탕 사기
준석이는 두 동생을 위해 사탕 가게에서 사탕을 최대한 많이 사 가려고 한다.
사탕 가게에는 N개의 사탕 묶음이 있으며 i번째 사탕 묶음에는 a_i개의 사탕이 있다.
준석이는 정말 부자라 사탕 묶음을 마음껏 살 수 있다. 하지만 준석이가 사간 총 사탕의 개수가 홀수가 되면 두 동생이 사탕을 한 개라도 더 갖기 위해 서로 싸울 것이라 총 짝수 개의 사탕을 가져가려고 한다. 준석이를 위해서 최대로 가져갈 수 있는 사탕의 개수를 구해주자!
첫째 줄에 사탕 묶음의 개수 N이 주어진다. (1 <= N <= 1000)
둘째 줄에 각각의 사탕 묶음에 담겨있는 사탕의 개수 a_1,a_2, ..., a_N가 주어진다. (1 <= a_i <= 1000)
입력으로 주어지는 모든 수는 정수이다.
준석이가 최대로 가져갈 수 있는 사탕의 개수를 출력한다.
사탕을 홀수 개로만 가져갈 수 있으면 0을 출력한다.
>>>코드
n = int(input())
o, e = [], []
candy = list(map(int, input().split()))
for i in range(n):
if candy[i]%2 == 0:
e.append(candy[i])
else:
o.append(candy[i])
o.sort(reverse = True)
j =(len(o)//2)*2
r = sum(e) + sum(o[:j])
print(r)