https://www.acmicpc.net/problem/15596
def solve(n):
ans = 0
for i in n:
ans += i
return ans
정수 n개가 주어졌을 때, n개의 합을 구하는 함수 작성.
> ..? ??? 문제 자체를 이해하기 어려웠다.. 상상 속의 코드를 짜다가 제출란을 눌러보고 나서야 알았다. 아...ㅋ.. 이 뜻이었구나.. 받을 값인 n에 리스트 형식을 넣어준다면 리스트 요소를 반복하며(for문) 더해주는 식을 짜면 되는 것.
https://www.acmicpc.net/problem/1712
import sys
A, B, C = map(int, sys.stdin.readline().split())
if B >= C:
print(-1)
else:
print(int(A/(C-B)+1))
노트북 가격이 C만원으로 책정되었다고 한다. 일반적으로 생산 대수를 늘려 가다 보면 어느 순간 총수입(판매비용(C))이 총비용(=고정비용(A)+가변비용(B))보다 많아지게 된다. 최초로 총수입이 총비용보다 많아져 이익이 발생하는 지점을 손익분기점(BREAK-EVEN POINT)이라고 한다. A, B, C가 주어졌을 때, 손익분기점을 구하는 프로그램을 작성하시오.
> 풀어봤던 문제였다. 손쉽게 A+B*n<C*n이 되는 시점의 n을 출력하는 식을 만들어 풀었지만 시간 초과가 났다. While을 사용한 탓이다.
> 가변비용이 판매비용과 같거나 그보다 크다면 손익분기점이 없다. 첫번째 예시인 1000 70 170을 생각해보면 1000 <100*n이므로 n의 최솟값은 11이다. +-0가 되는 시점이 n=10이고, 100*10은 1000이다. 그럼 A/(C-B)를 구한 뒤 값의 정수 부분에만 1을 더해주면 되는 거 아닌가..?
> while을 써 에둘러 가지 않고 이렇게 식을 변형해 풀 수 있도록 사고하는 능력도 중요한 것 같다. 어렵당..
https://www.acmicpc.net/problem/2869
import sys
a, b, v = map(int, sys.stdin.readline().split())
days = (v-b)/(a-b)
if days == int(days):
print(int(days))
else:
print(int(days)+1)
달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다. 달팽이는 낮에 A미터 올라갈 수 있지만, 밤에 자는 동안 B미터 미끄러진다. 정상에 올라간 후에는 미끄러지지 않는다. 달팽이가 나무 막대를 모두 올라가려면 며칠이 걸리는지 구하는 프로그램 작성. 올라가지마.. 좀 포기해
> 우선 정답코드를 먼저 공개한 뒤 제 풀이과정을 공개합니다..^^ 정확히는 뻘짓과정..?
import sys
A, B, V = map(int, sys.stdin.readline().split())
day, high = 1, A
while high < V:
high -= B
day += 1
high += A
if high >= V:
print(day)
break
> 1트 : '날짜(=1)'와 '현재 높이' 변수를 만들어 먼저 높이에 A를 더한다. while문을 만들어 날짜에 1을 더해주고 높이에 A-B를 더해주는 것을 반복한다. '현재 높이'가 V보다 같거나 커지면 루프를 탈출한다. 역시나 시간초과..!
import sys
A, B, V = map(int, sys.stdin.readline().split())
n = 1
if A+n*(A-B) < V:
while True:
n += 1
if A+n*(A-B) >= V:
print(n+1)
break
else:
print(n+1)
> 2트 : high를 사용하지 않고 풀어보았다. 런타임 에러가 나는데 왜인지 모르겠고, 오류를 고친다 해도 역시나 시간초과가 될 것 같아 그냥 구글링...
import sys
a, b, v = map(int, sys.stdin.readline().split())
days = (v-b)/(a-b)
if days == int(days):
print(int(days))
else:
print(int(days)+1)
> 애초에 시작한 식 자체가 나와 다르셔서 조금 놀랐다. a*days-b*(days-1)>=v로 놓으셨던데, 나는 아예 a+days*(a-b)로 놓고 days+1을 출력했었는데. 하튼 그래서 식을 이항해 days(a-b)>=v-b로, days >= (v-b)/(a-b)로 만들 수 있다. 그리고 바로 days를 출력하는데 단 소수형인 경우 +1을 해준다. 4.1일 같은 건 없으며, 4일 하고도 더 걸렸다는 것 자체가 5일이 걸렸다는 말로 해석할 수 있기 때문.
> 나중에 한번 더 풀어볼테다. 꼭..!!!
https://www.acmicpc.net/problem/10250
import sys
T = int(sys.stdin.readline())
for i in range(T):
h, w, n = map(int, sys.stdin.readline().split())
Floor = n%h
roomnum = (n//h)+1
if Floor == 0:
Floor = h
roomnum = n//h
print(f"{Floor*100+roomnum}")
N 번째로 도착한 손님에게 배정될 방 번호를 계산하는 프로그램. 첫 번째 손님은 101 호, 두 번째 손님은 201 호 등과 같이 배정한다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수를 포함하고 있으며 각각 호텔의 층 수, 각 층의 방 수, 몇 번째 손님인지를 나타낸다(1 ≤ H, W ≤ 99, 1 ≤ N ≤ H × W). N 번째 손님에게 배정되어야 하는 방 번호 출력.
> 처음엔 floor*100을 하지 않고 floor+0+roomnum을 했다가 이상한 결과를 얻었었다ㅋㅋ
> 문제 설명이 긴 것에 비해 식 자체는 간단하다. 몫과 나머지만 잘 계산해주면 끝!
https://www.acmicpc.net/problem/2292
import sys
n = int(sys.stdin.readline())
beehive = 1
room = 1
while True:
if n > beehive:
beehive += 6*room
room += 1
elif n <= beehive:
break
print(room)
육각형으로 이루어진 벌집이 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램 작성.
> 벌집의 규칙은 찾았다(1 - 7 - 19 - 37 - 61로 이전 것에 +6, +12, +18, +24.. 처럼 이전 값+'6의 배수'). 다만 .. 처음에는 데이터프레임에서 카테고리 분류할 때처럼 하려다가 N의 최댓값이 10억이라길래ㅋㅋㅋ 깔끔하게 포기했다.
> 10250처럼 몫과 나머지를 계산해 풀 수도 있지 않을까 싶다가, 같은 '2'값을 가지는 2와 7은 몫과 나머지 둘 다 다르다는 사실에 또 절망했다. 그렇게 자기 전까지도 생각했다. range를 쓰자던가 함수를 만들자던가 등등.. 무엇도 구체화되지 않아서 결국 아침 일찍 구글링을 했다ㅠ
> 아.. 이렇게 푸는구나. 보자마자 이해할 수 있었다. ㅋ...ㅋㅋㅋ..ㅋㅋㅋㅋㅋ.... 나는 왜 그렇게 오래 고민했는가... n이 beehive보다 크면 if절을 반복하고, n이 beehive보다 같거나 작아지면 반복문을 탈출하고 room을 출력한다. while 안에 if를 쓸 필요 없이 `while n > beehive` 라고 쓰면 elif문을 쓰지 않아도 된다.
오래 생각해야 할 문제인지 그렇지 않은 문제인지에 대한 감이 부족한 것 같다. 계속 문제를 풀다보면 알 수 있지 않을까..? 화이팅!
'STUDY' 카테고리의 다른 글
파이썬 스터디 5주차(백준) (2) | 2022.02.03 |
---|---|
파이썬 스터디 4주차(캐글) (0) | 2022.01.30 |
파이썬 스터디 3주차(머신러닝) (2) | 2022.01.29 |
파이썬 스터디 3주차(캐글) (0) | 2022.01.26 |
파이썬 스터디 3주차(백준) (0) | 2022.01.25 |