본문 바로가기

STUDY

파이썬 스터디 4주차(백준)

https://www.acmicpc.net/problem/15596

 

15596번: 정수 N개의 합

C++17, Java 8, Python 3, C11, PyPy3, C99, C++98, C++11, C++14, Go, C99 (Clang), C++98 (Clang), C++11 (Clang), C++14 (Clang), C11 (Clang), C++17 (Clang)

www.acmicpc.net

def solve(n):
  ans = 0
  for i in n:
    ans += i
  return ans

정수 n개가 주어졌을 때, n개의 합을 구하는 함수 작성.

> ..? ??? 문제 자체를 이해하기 어려웠다.. 상상 속의 코드를 짜다가 제출란을 눌러보고 나서야 알았다. 아...ㅋ.. 이 뜻이었구나.. 받을 값인 n에 리스트 형식을 넣어준다면 리스트 요소를 반복하며(for문) 더해주는 식을 짜면 되는 것.

 

 

https://www.acmicpc.net/problem/1712

 

1712번: 손익분기점

월드전자는 노트북을 제조하고 판매하는 회사이다. 노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 A만원의 고정 비용이 들며, 한 대의 노트북을 생산하는 데에는 재료비와

www.acmicpc.net

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

 

2869번: 달팽이는 올라가고 싶다

첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)

www.acmicpc.net

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://stultus.tistory.com/entry/Python-%EB%B0%B1%EC%A4%80-2869-%EB%8B%AC%ED%8C%BD%EC%9D%B4%EB%8A%94-%EC%98%AC%EB%9D%BC%EA%B0%80%EA%B3%A0-%EC%8B%B6%EB%8B%A4

 

[Python] 백준 2869 (달팽이는 올라가고 싶다)

*문제에 대한 내 생각  만일 시간제한이 없었다면 파이썬 자습서에나 나오는 예제였을 것이다.  문제자체가 어렵지는 않지만 실수할 것들이 많아 나도 4번의 시도끝에 성공했다. *문제 풀이 -아

stultus.tistory.com

> 나중에 한번 더 풀어볼테다. 꼭..!!!

 

 

https://www.acmicpc.net/problem/10250

 

10250번: ACM 호텔

프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수

www.acmicpc.net

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

 

2292번: 벌집

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌

www.acmicpc.net

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