(199)

백준 4948번 풀이

문제 https://www.acmicpc.net/problem/4948 4948번: 베르트랑 공준 베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다. 이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 체비쇼 www.acmicpc.net 베르트랑 공준은 n부터 2n까지의 범위 중 적어도 소수가 하나는 있다는 얘기. 문제에서도 n을 입력하면 2n까지 소수가 몇 개 있는지를 출력한다. Reference https://velog.io/@iillyy/%EB%B0%B1%EC%A4%80-4948%EB%B2%88-%ED%8C%8C%EC%9D%B4%EC%8D%AC 백준 4948번 파이썬 백준 4948번 베르트랑 공준이번 문제는 n ..

백준 1929번 풀이

문제 https://www.acmicpc.net/problem/1929 1929번: 소수 구하기 첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다. www.acmicpc.net 왜 안 나오나 했던 에라토스테네스의 체가 나왔다. 에라토스테네스의 체? 1~n까지의 범위에서 소수를 개 심플하고 빠르게 필터링하는 방법. 손으로 하나하나 지워가는 노가다가 필요하지만 아무튼 가장 빠르다… 에라토스테네스의 체를 이용하는 방법은 개 간단한데 2를 제외한 2의 배수를 지운다 3을 제외한 3의 배수(중 홀수)를 지운다 5를 제외한 5의 배수(중 5로 끝나는 수)를 지운다 7을 제외한 7의 배수(중 홀수)를 지운다 ..

백준 11653번 풀이

문제 https://www.acmicpc.net/problem/11653 11653번: 소인수분해 첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다. www.acmicpc.net 주어진 수를 소인수분해하시오. (1이면 아무것도 출력 안 되게) 풀이 소인수분해는 합성수를 소수들의 곱으로 나타내는 것이다. 예를 들어 60을 소인수분해하면 2^2*3*5가 된다. 뭐 그런건데… 이 문제에서는 저렇게 제곱으로 나타낼 필요는 없고, 2 2 3 5 이런 순으로 출력하면 된다. import sys N = int(sys.stdin.readline().strip()) def isprime(a): if a < 2: return False for i in range(2,a): if a % i == 0: re..

백준 2581번 풀이

문제 https://www.acmicpc.net/problem/2581 2581번: 소수 M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다. www.acmicpc.net M부터 N까지 소수의 합과 최솟값을 구하시오 풀이 import sys M = int(sys.stdin.readline()) N = int(sys.stdin.readline()) a = list(range(M,N+1)) print(M,N,a) 사실 이렇게 배열 만들어서 하려고 했더니 일부 합성수가 안 지워졌다. import sys M = int(sys.stdin.readline()) N = int(sys..

백준 1978번 풀이

문제 https://www.acmicpc.net/problem/1978 1978번: 소수 찾기 첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다. www.acmicpc.net N개의 수가 주어질 때, 여기서 소수의 개수는? 소수? 1과 자기 자신만 약수로 가지는 수이다. 참고로 1은 소수가 아님. 풀이 import sys N = int(sys.stdin.readline()) b = list(map(int,sys.stdin.readline().split())) prime = [] def isprime(a): if a < 2: return False for i in range(2,a): if a % i == 0: return False..

백준 1011번 풀이

문제 https://www.acmicpc.net/problem/1011 1011번: Fly me to the Alpha Centauri 우현이는 어린 시절, 지구 외의 다른 행성에서도 인류들이 살아갈 수 있는 미래가 오리라 믿었다. 그리고 그가 지구라는 세상에 발을 내려 놓은 지 23년이 지난 지금, 세계 최연소 ASNA 우주 비행 www.acmicpc.net 시발점 A와 종점 B가 주어질 때, 해당 거리를 이동하기 위해 공간이동장치의 최소 작동횟수 구하기. (직접 가서 보는 걸 추천드림) Reference https://data-jj.tistory.com/36 백준 1011번 풀이(파이썬) www.acmicpc.net/problem/1011 1011번: Fly me to the Alpha Centaur..

백준 10757번 풀이

문제 https://www.acmicpc.net/problem/10757 10757번: 큰 수 A+B 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오. www.acmicpc.net A+B를 출력하면 되는데 이게 숫자가 좀 크다. Reference https://beyond1.tistory.com/65 10757)큰 수 A+B https://www.acmicpc.net/problem/10757 두 수를 더해 그 결과를 출력하는 쉬운 문제처럼 보이지만 더하는 두 수가 10^10000보다 작다. int나 long long 타입으로 위처럼 큰 수를 다룰 수 없기 때문에 문자열로.. beyond1.tistory.com 이건 C언어 풀이 https://ko.wikipedia.org/wik..

백준 2839번 풀이

문제 https://www.acmicpc.net/problem/2839 2839번: 설탕 배달 상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그 www.acmicpc.net 설탕의 무게를 5킬로와 3킬로를 최소한으로 써서 나타내시오(…) 풀이 그러니까 이 문제를 간단히 요약하자면 5x+3y=z x+y=w 여기서 z가 설탕의 무게(주어진다)일 때, 위 연립방정식을 만족하는 w의 최솟값을 찾는 문제. z가 주어지더라도 미지수가 세 개라서 방정식으로 풀면 안 된다. 연립방정식으로 풀 거면 w가 주어져야 하는데, 여기서는 z는 주어지지만 w는 주어지지 않는다. 즉, 일일이 대입해..

백준 2775번 풀이

문제 https://www.acmicpc.net/problem/2775 2775번: 부녀회장이 될테야 첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다 www.acmicpc.net 특정 층, 특정 호의 아파트 거주민 수 맞추기 Reference https://crazykim2.tistory.com/586 [백준알고리즘/기본 수학 1단계] 2775번 문제 : 부녀회장이 될테야 안녕하세요 백준 알고리즘 단계별로 풀어보기 8단계 2775번 문제 부녀회장이 될테야를 풀어봤습니다 이번 문제는 알고리즘에 대해서는 어떻게 할지 금방 해결이 되었는데 알고리즘을 프로그램 crazykim2.tistory.com https://..

백준 10250번 풀이

문제 https://www.acmicpc.net/problem/10250 10250번: ACM 호텔 프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수 www.acmicpc.net 이건 내가 글로 요약을 못해요… 풀이 import sys a = int(sys.stdin.readline()) for i in range(a): floor,room,order = map(int,sys.stdin.readline().split()) print(order % floor) # 방 호수 # floor: 층 # room: 방 갯수 # order: 손님 몇번째세요? 일단 이..

백준 2869번 풀이

문제 https://www.acmicpc.net/problem/2869 2869번: 달팽이는 올라가고 싶다 첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000) www.acmicpc.net 달팽이가 하루동안 올라가는 거리와 자다가 미끄러지는 거리가 주어질 때, 일정 거리의 막대기를 올라가려면 며칠이나 걸리는지 출력하라. Reference https://www.acmicpc.net/board/view/79818 (해당 문제의 질문글) 글 읽기 - 2869 파이썬 풀이 해주실 수 있나요? 댓글을 작성하려면 로그인해야 합니다. www.acmicpc.net 풀이 야 근데 100 99 1000000000은 너무했다… 이건 올라가다 달팽이 죽어요..

백준 1193번 풀이

문제 https://www.acmicpc.net/problem/1193 1193번: 분수찾기 첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다. www.acmicpc.net 이런 표가 있고 움직이는 패턴이 있을 때, 몇번째 분수가 뭔지 찾는 것. 패턴은 풀이란에 넣어드림. 참고로 오늘 쓰는 건 근의 공식밖에 없으므로 따로 설명을 넣거나 하지는 않습니다. 풀이 움직이는 패턴이 이런 식이다. 보자마자 마른세수 마렵다면 지극히 정상이다. 나도 그랬음. 이건 수능에 실렸으면 저기 어디 중간 페이지에는 나왔을 문제다. 공명의 함정은 아니지만 일단 당황하지 말고, 저기에 있는 패턴을 파악해보자. 1번째 줄: 1/1 2번째 줄: 1/2, 2/1 3번째 줄: 3/1, 2/2, 1/3 4번째 줄: 1/4, 2..

백준 2292번 풀이

문제 https://www.acmicpc.net/problem/2292 2292번: 벌집 위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌 www.acmicpc.net 이 문제는 한줄요약이 안된다… 대충 1번 방에서 n번째 방까지 가는 최단거리를 구하는 문제. 참고로 벌집의 방 수에는 패턴이 있다. Reference https://swkang.tistory.com/m/7 [BOJ]2292번 벌집(Python) https://www.acmicpc.net/problem/2292 2292번: 벌집 위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같..

백준 1712번 풀이

문제 https://www.acmicpc.net/problem/1712 1712번: 손익분기점 월드전자는 노트북을 제조하고 판매하는 회사이다. 노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 A만원의 고정 비용이 들며, 한 대의 노트북을 생산하는 데에는 재료비와 www.acmicpc.net 손익분기점을 구하는 문제. 참고로 부등식이다. 방정식과 부등식 방정식은 식에 등호(=)가 있고, 부등식은 식에 부등호()가 있다. (대충 펀쿨섹좌 짤) 그래서 x+y=1은 방정식이고, x+y>1은 부등식이다. 여기서 왜 부등식을 쓰느냐… 손익분기점은 비용보다 커야 하기 때문. 어디서 많이 본 것 같다고? 저거 중학생때 배우는겁니다 여러분. 일반화 그럼 이제 일반화를 해 보도록 하자. 고정비용 A,..

백준 2941번 풀이

문제 https://www.acmicpc.net/problem/2941 2941번: 크로아티아 알파벳 예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z= www.acmicpc.net 크로아티아 알파벳을 포함해 몇 글자인지 세기. (그러니까 (c=,c-,dz=,d-,lj,nj,s=,z=)를 포함해서 세는거다) 풀이 import sys a = sys.stdin.readline().strip() croatian_alphabet=["c=","c-","dz=","d-","lj","nj","s=","z="] for i in croatian_al..

백준 4948번 풀이

BOJ/[BOJ] Python 2022. 8. 19. 00:15

문제

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

 

4948번: 베르트랑 공준

베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다. 이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 체비쇼

www.acmicpc.net

베르트랑 공준은 n부터 2n까지의 범위 중 적어도 소수가 하나는 있다는 얘기. 문제에서도 n을 입력하면 2n까지 소수가 몇 개 있는지를 출력한다.

 

Reference

https://velog.io/@iillyy/%EB%B0%B1%EC%A4%80-4948%EB%B2%88-%ED%8C%8C%EC%9D%B4%EC%8D%AC

 

백준 4948번 파이썬

백준 4948번 베르트랑 공준이번 문제는 n 부터 2n까지 소수를 구하는 문제 입니다.백준 1929번 소수 구하기이 문제는 위의 소수 구하기 문제에서 범위를 한정하는 것만 추가된문제입니다.해당 문제

velog.io

 

풀이

def isprime(a):
    sqrt = int(a ** 0.5)
    if a < 1: # 실수로 0 200으로 입력했더니 0이 소수로 나와버림
        return False
    for i in range(2,sqrt+1):
        if a % i == 0:
            return False
    else: 
        return True

일단 이놈은 소수파트 끝날때까지 가져가는 게 맞다. 

import sys
def isprime(a):
    sqrt = int(a ** 0.5)
    if a < 1: # 실수로 0 200으로 입력했더니 0이 소수로 나와버림
        return False
    for i in range(2,sqrt+1):
        if a % i == 0:
            return False
    else: 
        return True
while True: 
    P = []
    N = int(sys.stdin.readline())
    M = 2 * N
    if N == 0:
        break
    for i in range(N+1,M+1):
        if isprime(i):
            P.append(i)
    print(len(P))

일단 이렇게 해도 찾아는 준다. n부터 2n까지 isprime이라는 함수를 적용해서 소수면 리스트업하고, 최종 리스트 길이를 출력하는 건데… 이거 내면 뭐가 반기게요? 그렇죠… 응애 나 애기시간초과! 가 반겨요…

import sys
def isprime(a):
    sqrt = int(a ** 0.5)
    if a < 1: # 실수로 0 200으로 입력했더니 0이 소수로 나와버림
        return False
    for i in range(2,sqrt+1):
        if a % i == 0:
            return False
    else: 
        return True
while True: 
    P = 0
    N = int(sys.stdin.readline())
    M = 2 * N
    if N == 0:
        break
    for i in range(N+1,M+1):
        if isprime(i):
            P += 1
    print(P)

이것도 응애 나 애기시간초과! 뜬다… 깝깝하잖아여? 아니 이러시는 이유가 있으실 것 아니세요… 그래서 질문을 찾아봤는데 리스트를 만들고 거기서 가져오라길래 뭔 소린가 했음… 그러다가 참고문헌을 발견했음.

import sys
def isprime(a):
    sqrt = int(a ** 0.5)
    if a == 1: 
        return False
    for i in range(2,sqrt+1):
        if a % i == 0:
            return False
    else: 
        return True

prime = []
for i in range(2,246912):
    if isprime(i):
        prime.append(i)

N = int(sys.stdin.readline())
while True:
    P = 0
    if N == 0:
        break
    for i in prime:
        if N < i <= 2 * N:
            P += 1
    print(P)
    N = int(sys.stdin.readline())

리스트를 만들고 가져오라는 건, n의 범위가 어쨌든 123456으로 정해져 있으니까 2n의 최댓값은 123456 * 2(246912)일거고, 그럼 거기까지 소수 리스트를 만들어 둔 다음 n을 입력받아서 n보다 크고 2n보다 작거나 같은 소수가 리스트에 있으면 세는 방식이라는 얘기. …다음 파트도 혹시 시간제한 있음?

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 1085번 풀이  (0) 2022.08.19
백준 9020번 풀이 (+응용편)  (0) 2022.08.19
백준 1929번 풀이  (0) 2022.08.19
백준 11653번 풀이  (0) 2022.08.19
백준 2581번 풀이  (0) 2022.08.19
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 1929번 풀이

BOJ/[BOJ] Python 2022. 8. 19. 00:13

문제

 

1929번: 소수 구하기

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

www.acmicpc.net

왜 안 나오나 했던 에라토스테네스의 체가 나왔다.

 

에라토스테네스의 체? 

1~n까지의 범위에서 소수를 개 심플하고 빠르게 필터링하는 방법. 손으로 하나하나 지워가는 노가다가 필요하지만 아무튼 가장 빠르다… 에라토스테네스의 체를 이용하는 방법은 개 간단한데

  1. 2를 제외한 2의 배수를 지운다
  2. 3을 제외한 3의 배수(중 홀수)를 지운다
  3. 5를 제외한 5의 배수(중 5로 끝나는 수)를 지운다
  4. 7을 제외한 7의 배수(중 홀수)를 지운다

끝이다.

 

풀이

일단… 에라토스테네스의 체 자체는 간단한데, 이 문제는 시간초과가 걸려 있다. 그니까 내가 내라는 코드 안 내면 시간초과가 여러분을 반겨요…

import sys
M, N = map(int,sys.stdin.readline().split())
def isprime(a):
    if a < 2:
        return False
    for i in range(2,a):
        if a % i == 0:
            return False
    else: 
        return True
for i in range(M,N+1):
    if isprime(i):
        print(i)
    else:
        pass

에라토스테네스의 체는 이렇게만 해도 된다. 되긴 되는데 이거 그대로 내면 시간초과가 응애 나 애기시간초과! 하면서 반긴다.

 

출력은 비교적 호다닥 되니까 별로 체감이 안되겠지만, 저게 저대로 돌아가면 100이 소수인지를 알아보기 위해 100을 2부터 100까지로 쫙 다 나눠야 한다. 100은 2로 나눠떨어지니까 금방이죠… 91은 소수여… 그럼 어느세월에 나누겠음.

import sys
M, N = map(int,sys.stdin.readline().split())
def isprime(a):
    sqrt = int(a ** 0.5)
    if a == 1: 
        return False
    for i in range(2,sqrt+1):
        if a % i == 0:
            return False
    else: 
        return True

for i in range(M,N+1):
    if isprime(i):
        print(i)

그래서 이걸로 내야 한다.

 

뭐야 제곱근이 왜 저기서 나와요? 그… 자, 일단 에라토스테네스의 체 알고리즘이 어떤 수(보통 소수)로 나눠서 나머지가 0이면 소수가 아님! 이라고 했는데, 그 수가 사실은 쫘라락 나눌 필요가 없고 소수 찾을 범위에 있는 수 n의 제곱근까지만 나누면 된다. 그러니까, 1부터 100까지면 루트 100 해서 10의 배수까지만 지우면 된다. (120도 10의 배수까지만) 150은 가장 가까운 제곱수가 121이라 11의 배수까지 구해야 한다.

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 9020번 풀이 (+응용편)  (0) 2022.08.19
백준 4948번 풀이  (0) 2022.08.19
백준 11653번 풀이  (0) 2022.08.19
백준 2581번 풀이  (0) 2022.08.19
백준 1978번 풀이  (0) 2022.08.18
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 11653번 풀이

BOJ/[BOJ] Python 2022. 8. 19. 00:11

문제

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

 

11653번: 소인수분해

첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.

www.acmicpc.net

주어진 수를 소인수분해하시오. (1이면 아무것도 출력 안 되게)

 

풀이

소인수분해는 합성수를 소수들의 곱으로 나타내는 것이다. 예를 들어 60을 소인수분해하면 2^2*3*5가 된다. 뭐 그런건데… 이 문제에서는 저렇게 제곱으로 나타낼 필요는 없고, 2 2 3 5 이런 순으로 출력하면 된다.

import sys
N = int(sys.stdin.readline().strip())
def isprime(a):
    if a < 2: 
        return False
    for i in range(2,a):
        if a % i == 0:
            return False
    else:
        return True
# 이거 근데 언제까지 써야됨...? 
for i in range(2,N+1):
    if N % i == 0 and isprime(i):
        while N % i == 0:
            print(i)
            N = N // i
    else: 
        pass

전체 코드. 여기서 중점적으로 볼 부분은 주석 밑에 부분이다.

for i in range(2,N+1):
    if N % i == 0 and isprime(i):
        while N % i == 0:
            print(i)
            N = N // i
    else: 
        pass

그러니까 여기.

 

for문과 그 아래에 있는 if는 N의 약수 중에서도 소수인 약수만을 골라내는 코드이고, 그 밑의 While문은 N을 i(위에서 찾은 소수인 약수)로 나누어서 나머지가 없을 동안, 그러니까 정확히 나눠 떨어질 동안 i를 계속 출력하면 된다.

 

참고로 else문에 있는 게 pass이기 때문에 별도의 처리가 없어도 1을 넣으면 아무것도 안 나온다.

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 4948번 풀이  (0) 2022.08.19
백준 1929번 풀이  (0) 2022.08.19
백준 2581번 풀이  (0) 2022.08.19
백준 1978번 풀이  (0) 2022.08.18
백준 1011번 풀이  (0) 2022.08.18
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 2581번 풀이

BOJ/[BOJ] Python 2022. 8. 19. 00:09

문제

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

 

2581번: 소수

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.  단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.

www.acmicpc.net

M부터 N까지 소수의 합과 최솟값을 구하시오

 

풀이

import sys
M = int(sys.stdin.readline())
N = int(sys.stdin.readline())
a = list(range(M,N+1))
print(M,N,a)

사실 이렇게 배열 만들어서 하려고 했더니 일부 합성수가 안 지워졌다.

import sys
M = int(sys.stdin.readline())
N = int(sys.stdin.readline())
P = []
def isprime(a):
    if a < 2: 
        return False
    for i in range(2,a):
        if a % i == 0:
            return False
    else: 
        return True
for i in range(M,N+1):
    if isprime(i):
        P.append(i)
print(sum(P))
print(min(P))

그래서 이게 최선임.. 아니 일단 내지 말아봐… 일단 답이 없을 때 -1을 출력하려면, 어떻게 나오는지를 봐야 한다.

[]
0
Traceback (most recent call last):
  File "/home/koreanraichu/Untitled-1.py", line 18, in <module>
    print(min(P))
ValueError: min() arg is an empty sequence

답이 없을 때는 리스트가 없고, 합도 없을뿐더러 빈 리스트라서 최솟값 찾아달라고 하면 오류난다.

import sys
M = int(sys.stdin.readline())
N = int(sys.stdin.readline())
P = []
def isprime(a):
    if a < 2: 
        return False
    for i in range(2,a):
        if a % i == 0:
            return False
    else: 
        return True
for i in range(M,N+1):
    if isprime(i):
        P.append(i)
if len(P) <= 0:
    print(-1)
else: 
    print(sum(P))
    print(min(P))

그래서 거기에 대한 처리를 추가해야 한다. 빈 리스트는 길이가 0이니까, 리스트 길이가 0이면 -1이 나오게 했다.

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 1929번 풀이  (0) 2022.08.19
백준 11653번 풀이  (0) 2022.08.19
백준 1978번 풀이  (0) 2022.08.18
백준 1011번 풀이  (0) 2022.08.18
백준 10757번 풀이  (0) 2022.08.18
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 1978번 풀이

BOJ/[BOJ] Python 2022. 8. 18. 03:09

문제

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

 

1978번: 소수 찾기

첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.

www.acmicpc.net

N개의 수가 주어질 때, 여기서 소수의 개수는?

 

소수?

1과 자기 자신만 약수로 가지는 수이다. 참고로 1은 소수가 아님.

 

풀이

import sys
N = int(sys.stdin.readline())
b = list(map(int,sys.stdin.readline().split()))
prime = []
def isprime(a):
    if a < 2:
        return False
    for i in range(2,a):
        if a % i == 0:
            return False
    else:
        return True
for j in b:
    if isprime(j):
        prime.append(j)
print(len(prime))

참고로 함수 쓰지 말라고는 안 했다.

def isprime(a):
    if a < 2:
        return False
    for i in range(2,a):
        if a % i == 0:
            return False
    else:
        return True

이 함수는 에라토스테네스의 체에서 썼던건데, 2보다 작거나(1은 소수가 아님) 자기 자신 외에 다른 수로 나눠떨어지는 수는 전부 false 처리하고 나머지를 true처리한다.

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 11653번 풀이  (0) 2022.08.19
백준 2581번 풀이  (0) 2022.08.19
백준 1011번 풀이  (0) 2022.08.18
백준 10757번 풀이  (0) 2022.08.18
백준 2839번 풀이  (0) 2022.08.18
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 1011번 풀이

BOJ/[BOJ] Python 2022. 8. 18. 03:08

문제

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

 

1011번: Fly me to the Alpha Centauri

우현이는 어린 시절, 지구 외의 다른 행성에서도 인류들이 살아갈 수 있는 미래가 오리라 믿었다. 그리고 그가 지구라는 세상에 발을 내려 놓은 지 23년이 지난 지금, 세계 최연소 ASNA 우주 비행

www.acmicpc.net

시발점 A와 종점 B가 주어질 때, 해당 거리를 이동하기 위해 공간이동장치의 최소 작동횟수 구하기. (직접 가서 보는 걸 추천드림)

 

Reference

https://data-jj.tistory.com/36

 

백준 1011번 풀이(파이썬)

www.acmicpc.net/problem/1011 1011번: Fly me to the Alpha Centauri 우현이는 어린 시절, 지구 외의 다른 행성에서도 인류들이 살아갈 수 있는 미래가 오리라 믿었다. 그리고 그가 지구라는 세상에 발을 내려 놓..

data-jj.tistory.com

 

풀이

솔직히 패턴 찾다가 뇌정지 왔음… 그건 둘째치고 광년거리면 가다가 늙을 거 같은데 장치에 -1이랑 0 있는 건 누르면 욕 바가지로 먹을 수 있다 뭐 그래요 알파 센타우리… 가야된다는데 어쩌겠음… 근데 가다가 블랙홀 만나면 X되는겨 조심해… 블랙홀은 육안으로 보이지도 않아요…

참고문헌 들어갔더니 패턴을 이렇게 정리해두셨다… 와 진짜 존경…

 

저기서는 크게 네 가지 패턴으로 나눴는데

  1. 거리 < 4
  2. 거리 = 제곱수
  3. 거리 <= 제곱수+루트 제곱수
  4. 거리 > 제곱수+루트 제곱수

이렇게 네 가지로 나눴다.

 

거리가 4일 때는 작동횟수가 곧 거리이므로 패스하고 세 가지 구간에 대해서만 보고 갑시다. 일단 저기 두번째 줄에 4, 5, 6, 7, 8을 순서대로 보자. 4는 제곱수, 5와 6은 작거나 같은 구간, 7, 8은 큰 구간이다. 그러니까 6을 경계로 구간이 두 개인 셈. 9 아래로는 12를 기준으로 나눈다. 그럼 16은? 아마 20일듯… 16+4는 20이니까.

 

거리가 제곱수일 때 작동 횟수는 4일때 3, 9일때 5, 16일때 7이다. 제곱수가 n^2형태이니까 n^2로 놓고 보면 2의 2승일때 3, 3의 2승일때 5, 4의 2승일때 7인데… 그렇다. 제곱수일 때의 작동 형태는 2n-1의 형태이다. 그럼 남는건 언더랑 클 때인데… 6보다 작거나 같을 때는 작동횟수가 4이고, 6보다 클 때는 5이다. 그리고 12보다 작거나 같을 때는 작동횟수가 6, 클때는 7이다. 2^2+2보다 작거나 같을 때 4이고, 2^2+2보다 클 때 5이다. 즉 거리가 제곱수+루트 제곱수보다 작거나 같을 때 작동횟수는 2n이고, 클 때는 2n+1이다.

import sys
case = int(sys.stdin.readline())
# 입력
for i in range(case):
    start,end = map(int,sys.stdin.readline().split())
    count = 0 # 이동 횟수
    distance = end - start # 시종점간 거리(대충 가야 하는 거리) 
    move_max = int(distance ** 0.5) # 네? 루트요? 0.5승 하면 되잖아요! 
    square = move_max ** 2 # 제(별)곱 아 급 곱창떙기네... 
    if distance == square:
        count = move_max * 2 - 1
        # 제곱수
    elif distance <= square + move_max:
        count = move_max * 2
        # 제곱수+루트보다 같거나 작은 구간
    elif distance > square + move_max: 
        count = move_max * 2 + 1
        # 제곱수+루트보다 큰 구간
    elif distance < 4: 
        count = distance
        # 4보다 작을 때
    print(count)

이거 말고 다른 패턴으로 하는 방법도 있긴 있는데, 본인은 저 방법이 제일 확 와닿았음…

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 2581번 풀이  (0) 2022.08.19
백준 1978번 풀이  (0) 2022.08.18
백준 10757번 풀이  (0) 2022.08.18
백준 2839번 풀이  (0) 2022.08.18
백준 2775번 풀이  (0) 2022.08.18
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 10757번 풀이

BOJ/[BOJ] Python 2022. 8. 18. 03:06

문제

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

 

10757번: 큰 수 A+B

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

A+B를 출력하면 되는데 이게 숫자가 좀 크다.

 

Reference

https://beyond1.tistory.com/65

 

10757)큰 수 A+B

https://www.acmicpc.net/problem/10757 두 수를 더해 그 결과를 출력하는 쉬운 문제처럼 보이지만 더하는 두 수가 10^10000보다 작다. int나 long long 타입으로 위처럼 큰 수를 다룰 수 없기 때문에 문자열로..

beyond1.tistory.com

이건 C언어 풀이

 

https://ko.wikipedia.org/wiki/Int_(C_프로그래밍_언어)

 

int (C 프로그래밍 언어) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 정수형을 처리하기 위한 변수로, 정수형(integer)의 약자이다. char와 같은 구조와 특성을 가지며 char가 8비트 인데 비해, 16, 32, 64비트의 처리 단위로 CPU 마다 다르

ko.wikipedia.org

https://dojang.io/mod/page/view.php?id=30

 

C 언어 코딩 도장: 7.0 정수 자료형 사용하기

C 언어에서는 다양한 형태의 자료형을 제공합니다. 이번에는 정수 자료형과 부호에 대해 알아보겠습니다. 정수 자료형은 크게 char, int가 있으며 앞에 부호 키워드(signed, unsigned)와 크기(short, long)

dojang.io

C언어는 왜 풀이가 복잡한지 알아보기 위해 자료형 검색했음…

 

풀이

import sys
a,b=map(int,sys.stdin.readline().split())
print(a+b)

파이썬은 이거 넣으면 된다. input보다 sys.stdin.readline()이 빨라서 저거 씀.

 

그럼 도대체 C언어는 왜!!! 풀이가 저런가 자료형을 찾아봤는데…

  • Char: 8bit
  • Short: 16bit (32bit CPU)
  • Int: 16bit
  • Long: 32bit
  • Long long: 64bit (32bit CPU)

다른 건 모르겠고 2^64보다 크면 에러 각 나왔죠. (잊지 말자, 컴퓨터는 손가락이 두 개다)

출처: 코딩도장 C언어-7.0 정수 자료형 사용하기

signed와 unsigned는 커버 범위가 다른데, signed의 경우 맨 앞에 있는 게 부호비트로 빠져서 그렇다. signed Char의 경우 1 000 0000(-128)~0 111 1111(127)까지 커버가 되고 unsigned는 부호비트가 없이 0000 0000(0)~1111 1111(255)까지 커버되는 방식. 그러니까 unsigned 롱롱 기준으로 2^64까지 들어오는데 거기다가 10^10000 이런거 넣으면 컴퓨터가 미쳤습니까 휴먼 한다.

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 1978번 풀이  (0) 2022.08.18
백준 1011번 풀이  (0) 2022.08.18
백준 2839번 풀이  (0) 2022.08.18
백준 2775번 풀이  (0) 2022.08.18
백준 10250번 풀이  (0) 2022.08.18
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 2839번 풀이

BOJ/[BOJ] Python 2022. 8. 18. 02:53

문제

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

 

2839번: 설탕 배달

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그

www.acmicpc.net

설탕의 무게를 5킬로와 3킬로를 최소한으로 써서 나타내시오(…)

 

풀이

그러니까 이 문제를 간단히 요약하자면

5x+3y=z

x+y=w

여기서 z가 설탕의 무게(주어진다)일 때, 위 연립방정식을 만족하는 w의 최솟값을 찾는 문제. z가 주어지더라도 미지수가 세 개라서 방정식으로 풀면 안 된다. 연립방정식으로 풀 거면 w가 주어져야 하는데, 여기서는 z는 주어지지만 w는 주어지지 않는다. 즉, 일일이 대입해서 풀어야 한다… 어? 시간초과 각 아니냐? 그래서 찾아봤다…

 

Greedy 알고리즘은 대충 지금! 롸잇 나우! 제일 좋은 답! 을 도출해내는 알고리즘이다. 예를 들어보자면, 수중에 3000원이 있고 배가 고플 때, 편의점은 100m 걸어가야 있고 근처에 있는 타코야끼 트럭이 보인다. 하지만 편의점은 기다릴 필요 없이 3000원어치 사서 먹을 수 있고, 타코야끼 트럭은 줄이 길어서 10분정도 기다려야 할 것 같은 상황일 때, 최적의 선택은? 이런 거. 물론 실제로 저 선택에는 배고픔의 정도(10분 참을 수 있으면 타코야끼 각이지…), 3000원이 현금이냐 카드냐 등 여러가지 요인이 작용한다.

 

일단 Greedy 알고리즘에 대해 알아보기 전에 중요한 사실 한 가지를 전제하고 가자. 설탕 봉지는 온니 자연수다. -1봉지 0.5봉지 그런거 없다. 

 

Greedy 알고리즘의 예시로 많이 언급하는 게 ‘500, 100, 50, 10원짜리 동전을 최소한으로 써서 거스름돈을 주는 문제’이다. 예를 들어서, 두 개에 1980원 하는 오이를 네 개 사고 5000원을 냈을 때, 500, 100, 50, 10원짜리 동전으로 거스름돈(대략 1040원)을 주려면? 일단 500원짜리 두 개, 그리고 10원짜리 네 개를 주면 된다.

n = 1260
# 거스름돈
coin = [500,100,50,10]
# 동전
count = 0
for change in coin:
    count += n // change
    n = n % change
# 가장 큰 단위부터 계산한다
print(count)

그 예시가 이것. 참고로 저 코드의 답은 6. (500원 두개 100원 두개 하나하나) Greedy 알고리즘은 큰 값부터 한다길래

이 로직대로 했더니 망했다. 일부는 정상적으로 돌아가는데, 일부는 이상하게 나온다. 21이면 실제로 5가 답인데(5키로 3개, 3키로 2개) 7로 나온다거나… 

import sys
sugar = int(sys.stdin.readline())
pudae = 0
# 사실 Sucrose 하고 싶었음... (Sucrose=설탕, pudae=푸대)
while sugar >= 0:
    if sugar % 5 == 0:
        pudae += sugar // 5
        print(pudae)
        break
    sugar -= 3
    pudae += 1
else: 
    print(-1)

참고로 답은 이건데, 5로 나누어 떨어질때가지 3을 뺐다. 어? 나랑 순서가 반댄데? 근데 저거는 5의 배수가 될 때까지 빼고, 안 나눠지면 -1 하면 되는데 3의 배수로 나눠 떨어질때까지 5를 빼게 되면 처리할 게 너무 많아진다…

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 1011번 풀이  (0) 2022.08.18
백준 10757번 풀이  (0) 2022.08.18
백준 2775번 풀이  (0) 2022.08.18
백준 10250번 풀이  (0) 2022.08.18
백준 2869번 풀이  (0) 2022.08.18
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 2775번 풀이

BOJ/[BOJ] Python 2022. 8. 18. 02:51

문제

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

 

2775번: 부녀회장이 될테야

첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다

www.acmicpc.net

특정 층, 특정 호의 아파트 거주민 수 맞추기

 

Reference

https://crazykim2.tistory.com/586

 

[백준알고리즘/기본 수학 1단계] 2775번 문제 : 부녀회장이 될테야

안녕하세요 백준 알고리즘 단계별로 풀어보기 8단계 2775번 문제 부녀회장이 될테야를 풀어봤습니다 이번 문제는 알고리즘에 대해서는 어떻게 할지 금방 해결이 되었는데 알고리즘을 프로그램

crazykim2.tistory.com

 

https://ooyoung.tistory.com/89

 

백준 2775번 [파이썬 알고리즘] 부녀회장이 될테야

[Python] 백준 알고리즘 온라인 저지 2775번 : 부녀회장이 될 테야 Python3 코드 t = int(input()) for _ in range(t): floor = int(input()) # 층 num = int(input()) # 호 f0 = [x for x in range(1, num+1)..

ooyoung.tistory.com

위쪽은 언어가 달라서 어떻게 푸셨는지만 봤다.

 

풀이

일단 이 아파트의 규칙이 하나 있다. a층 b호에 입주하려면 (a-1)층의 1호부터 b호까지 사는 입주민의 총 합을 데려와야 한다. 이 아파트는 0층부터 있고, 0층 b호에는 b명의 주민들이 산다. 그러니까 내가 1층 3호에 살 거면 0충 1호+0층 2호+0층 3호 해서 6인팟 풀방으로 구해야 한다. 어디 공대 뛰러 가시나 따라서 각 층의 1호는 아래층 1호에 사는 주민 수까지만 데려오면 되므로 1인가구가 살 수 있다. 이제 그 옆부터 슬슬 가관인거지…

당장 1층 3호부터 6인 풀팟인데 층수가 올라갈수록 파티원이 기하급수적으로 늘어난다. 

아파트가 프랙탈 구조라 한 호수 안에 방이 많은가…? 어디 케라핌 잡으러 가시나

import sys
T = int(sys.stdin.readline())
for i in range(T):
    k = int(sys.stdin.readline()) # 층
    n = int(sys.stdin.readline()) # 호
    zero_floor=list(range(1,n+1))
    # 0층에는 이만큼 살아요
    for x in range(k):
        for y in range(1,n):
            zero_floor[y] += zero_floor[y-1]
    print(zero_floor[-1])

패턴이 어려워서 이거 시그마 가야 하나 했는데 그냥 쌩으로 계산해버리심… 참고로 마지막줄 print문을 맨 밖으로 빼면 틀립니다. (그렇게 내봐서 알아요…) 맨 처음 for문 밖으로 나가게 되는 거라 마지막 결과만 출력되기 때문. 참고로 밑에 x, y 들어간 for문은 구구단이랑 비슷하다.

numeric=[2,3,4,5,6,7,8,9,10]
for i in numeric:
    for j in numeric:
        print(i,"x",j,"=",i*j)

이게 구구단코드. (좀 변형됐음) 이 코드는

  1. Numeric이라는 리스트 안에서
  2. i번째 원소에 대해
  3. j번째 원소를 싹 다 곱해서 출력해라

이런 얘기이다. 그래서 2*2부터 2*10까지 출력한 다음 3*2로 넘어간다.

for x in range(k):
    for y in range(1,n):
        zero_floor[y] += zero_floor[y-1]

이 코드도 비슷하게 돌아가는데

  1. 1부터 n(호수)까지 범위가 있을 때
  2. 0층의 0호부터 n호까지를 리스트 앞의 값에 더해라 (0층은 n호에 n명이 살기 때문에 그냥 리스트로 만들어주면 된다)
  3. 그 더하는 걸 k만큼 반복하세요

이런 거. 참고로 각 층의 1호는 계산 범위에서 빠진다.

 

Appendix. 합의 기호, 시그마

일단 들어가기 전에 브금 하나 틀고 가자.

https://youtu.be/vOpQoAqTTpc

아 역시 클럽 시그마져.

 

시그마는 그리스어 알파벳으로, ∑ 혹은 σ라고 쓴다. 아 이거요? 일어 자판 세팅해두면 독음 맞으면 그리스어 기호 쓸 수 있다. 아무튼… 왼쪽이 대문자 오른쪽이 소문자인데 오늘 설명할 합의 기호 시그마는 대문자이고, 소문자 시그마는 통계쪽에서 모표준편차(왜 1시그마 3시그마 하는 그거)를, 화학쪽에서는 시그마 결합(S오비탈끼리 뭐 지지고 볶는듯)을 나타낸다.

시그마는 이런 식으로 쓰는데, 이건 대충 k가 1부터 n까지일 때 k를 싹 더하라는 얘기. 즉, 초항이 1이고 공차가 1인 등차수열을 싹 다 더하라는 얘기와 같다.

위는 일반적인 시그마 공식. 순서대로 k가 1부터 n까지일 때 k, k제곱, k 3승을 더하는 공식이다.

 

그래서 록맨 시그마랑 쟤랑 뭔 상관이냐고? 시그마는 록맨 X 시리즈의 최종보스(X8 빼고)이고, 시그마 체력 바에 나오는 기호가 저거(특히 X5)이다. 그리고 자주 죽어나가신다

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 10757번 풀이  (0) 2022.08.18
백준 2839번 풀이  (0) 2022.08.18
백준 10250번 풀이  (0) 2022.08.18
백준 2869번 풀이  (0) 2022.08.18
백준 1193번 풀이  (0) 2022.08.18
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 10250번 풀이

BOJ/[BOJ] Python 2022. 8. 18. 02:42

문제

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

 

10250번: ACM 호텔

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

www.acmicpc.net

이건 내가 글로 요약을 못해요…

 

풀이

import sys
a = int(sys.stdin.readline())
for i in range(a):
    floor,room,order = map(int,sys.stdin.readline().split())
    print(order % floor) # 방 호수
# floor: 층
# room: 방 갯수
# order: 손님 몇번째세요?

일단 이렇게 하면 될 것 같지만, 이렇게 하면 딱 나눠 떨어질 때 0이 나와버려서 안된다. 그래서 if문을 도입해야 한다.

import sys
a = int(sys.stdin.readline())
# floor: 층
# room: 방 갯수
# order: 손님 몇번째세요? 
for i in range(a):
    floor,room,order = map(int,sys.stdin.readline().split())
    if order % floor == 0:
        print(floor)
    else:
        print(order % floor)

일단… 호텔이 6층짜리인데 6배수번째(6, 12, 18…) 방문객이 왔다, 그러면 n06호로 보내야 하므로 그대로 출력되게 한다.

import sys
a = int(sys.stdin.readline())
# floor: 층
# room: 방 갯수
# order: 손님 몇번째세요? 
for i in range(a):
    floor,room,order = map(int,sys.stdin.readline().split())
    if order % floor == 0:
        print(floor)
        print(order // floor)
    else:
        print(order % floor)
        print(order // floor)

그리고 또 이렇게 해버리면 6이랑 10이랑 몫이 같잖아요? 그래서 안됨.

import sys
a = int(sys.stdin.readline())
# floor: 층
# room: 방 갯수
# order: 손님 몇번째세요? 
for i in range(a):
    floor,room,order = map(int,sys.stdin.readline().split())
    if order % floor == 0:
        print(floor)
        print(-(-order // floor))
    else:
        print(order % floor)
        print(-(-order // floor))

아니 이거 말고 다른 방법 없냐고… 아무튼 큰 과제는 해결했고, 이제 출력만 하면 된다.

import sys
a = int(sys.stdin.readline())
# floor: 층
# room: 방 갯수
# order: 손님 몇번째세요? 
for i in range(a):
    floor,room,order = map(int,sys.stdin.readline().split())
    room_floor=-(-order // floor)
    if order % floor == 0:
        print("{0}{1}".format(floor,str(room_floor).zfill(2)))
    else:
        print("{0}{1}".format(order % floor,str(room_floor).zfill(2)))

zfill은 문자열의 앞을 0으로 채워주는… 이거 모듈이냐? 아무튼 그렇다. 방의 호수를 문자열로 만들고 zfill(2)를 주면 숫자가 한 자리일 때 앞에 0을 붙여서 01, 02, 03 이런 식으로 출력할 수 있다. 응? 저거 저렇게만 해도 되냐고? format 줬잖아요.

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 2839번 풀이  (0) 2022.08.18
백준 2775번 풀이  (0) 2022.08.18
백준 2869번 풀이  (0) 2022.08.18
백준 1193번 풀이  (0) 2022.08.18
백준 2292번 풀이  (0) 2022.08.18
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 2869번 풀이

BOJ/[BOJ] Python 2022. 8. 18. 02:40

문제

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

 

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

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

www.acmicpc.net

달팽이가 하루동안 올라가는 거리와 자다가 미끄러지는 거리가 주어질 때, 일정 거리의 막대기를 올라가려면 며칠이나 걸리는지 출력하라.

 

Reference

https://www.acmicpc.net/board/view/79818 (해당 문제의 질문글)

 

글 읽기 - 2869 파이썬 풀이 해주실 수 있나요?

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

풀이

야 근데 100 99 1000000000은 너무했다… 이건 올라가다 달팽이 죽어요… 물론 관찰자도 죽는다 이정도면 햇수로 환산해도 아득한 세월이다… 

import sys
climb,omg,bar = map(int,sys.stdin.readline().split())
print(climb,omg,bar)

climb: 올라간 높이

omg: 자다가 미끄러진 높이(OMG=oh my god) 달팽이가 일어나자마자 미끄러진 거 보고 오 마이 갓 하는거지

bar: 막대기

 

아니 변수로 빵터뜨리기 있냐고 저기에 day라는 변수가 추가되는데 day는 말 그대로 올라가는 데 걸리는 시간, 즉 최종 산물이다. 그러면 달팽이가 올라가는거 내려가는거 더하고 빼고 하다가 정상에 다다르면 그만하면 되니까 while 주면 되겠네?

import sys
climb,omg,bar = map(int,sys.stdin.readline().split())
# omg = Oh My God의 약자. 보통 OMG로 쓰는데 귀찮아서 소문자로 썼습니다. 
# 자는동안 미끄러진 달팽이가 다음날 일어나서 OMG 하는거죠 뭘... 
day = 0

while bar > 0:
    day += 1
    bar -= climb
    if bar == 0: 
        break
    else:
        bar += omg
print(day)

님 이거 생각하셨음? 나도 그랬는데 시간초과 떠요 저거. 시간제한 0.15초임.

 

참고문헌에 가면 정답 코드가 있는데… 나도 사실 저게 왜 저렇게 됐는지는 잘 모른다. 근데 일단 내가 이해한거는 설명드림.

 

저걸 막대기 시점에서 보면 달팽이가 올라간 만큼 남은 길이가 줄어들고, 미끄러진 만큼 남은 길이가 올라간다. 그러니까 달팽이가 다 올라갈때까지 올라간 만큼 빼고 미끄러지는 만큼 더하고를 반복하다가 마지막 날에 올라간 만큼을 뺀다. (그러면 남은 거리가 0이 된다) 그러니까 최종적으로 막대기의 길이+미끄러지는 만큼(곱하기 일수-1)=달팽이가 올라가는 높이(곱하기 일수)가 된다.

import sys
climb,omg,bar = map(int,sys.stdin.readline().split())
# omg = Oh My God의 약자. 보통 OMG로 쓰는데 귀찮아서 소문자로 썼습니다. 
# 자는동안 미끄러진 달팽이가 다음날 일어나서 OMG 하는거죠 뭘... 
day = (bar - omg) / (climb - omg)
print(day)

그럼 이대로 내면 되나요? 아뇨 소수점 떠서 안됩니다.

import sys
climb,omg,bar = map(int,sys.stdin.readline().split())
# omg = Oh My God의 약자. 보통 OMG로 쓰는데 귀찮아서 소문자로 썼습니다. 
# 자는동안 미끄러진 달팽이가 다음날 일어나서 OMG 하는거죠 뭘... 
day = (bar - omg) // (climb - omg)
print(day)

그럼 이거요? 아뇨 그러면 소수점 싹 버려버리는데요?

import sys
import math
climb,omg,bar = map(int,sys.stdin.readline().split())
# omg = Oh My God의 약자. 보통 OMG로 쓰는데 귀찮아서 소문자로 썼습니다. 
# 자는동안 미끄러진 달팽이가 다음날 일어나서 OMG 하는거죠 뭘... 
day = (bar - omg - 1) // (climb - omg) + 1
print(day)

이게 정답인데… 아 math 안지움… 아무튼 저기에 1이 붙은 이유가 뭔가가 참고문헌에 있는 글 내용이었고 답변은 “ceil(p/q) = floor((p+q-1)/q)”를 보면 이해가 될 거라는 말이었다. 뭔 소리여… 싶어서 직접 해봤더니 값이 같네.

print(math.ceil(omg/climb),math.floor((omg+climb-1)/climb))

둘이 같다. ceil은 가장 가까운 정수로 올림하는거고, floor는 가장 가까운 정수로 내림하는 것. 각각 계산 결과가 1/5, (1+5-1)/5. 전자는 0.2지만 올림하니까 1이고 후자는 그냥 1이다. 그런데 이거 math 불러서 해결보자니 시간초과 날 것 같단말이지… 그리고 //가 사실상 floor랑 비슷하니까(몫만 보여준다) -1을 도입한 듯.

 

저기에 예시로 준 5, 1, 6을 대입해서 풀면 +1이 없을 때 (6-1-1) // (5-1)해서 1이 나오게 되는데, 실제로 정답은 2다. 저 +1이 분모에 붙어있는 게 아니라 따로 떨어져 있는 애다. (분모에 붙어있으면 괄호로 묶는다)

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 2775번 풀이  (0) 2022.08.18
백준 10250번 풀이  (0) 2022.08.18
백준 1193번 풀이  (0) 2022.08.18
백준 2292번 풀이  (0) 2022.08.18
백준 1712번 풀이  (0) 2022.08.18
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 1193번 풀이

BOJ/[BOJ] Python 2022. 8. 18. 02:26

문제

 

1193번: 분수찾기

첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다.

www.acmicpc.net

출처: 백준 1193번 문제

이런 표가 있고 움직이는 패턴이 있을 때, 몇번째 분수가 뭔지 찾는 것. 패턴은 풀이란에 넣어드림. 참고로 오늘 쓰는 건 근의 공식밖에 없으므로 따로 설명을 넣거나 하지는 않습니다.

 

풀이

움직이는 패턴이 이런 식이다. 보자마자 마른세수 마렵다면 지극히 정상이다. 나도 그랬음. 이건 수능에 실렸으면 저기 어디 중간 페이지에는 나왔을 문제다. 공명의 함정은 아니지만 일단 당황하지 말고, 저기에 있는 패턴을 파악해보자.

1번째 줄: 1/1

2번째 줄: 1/2, 2/1

3번째 줄: 3/1, 2/2, 1/3

4번째 줄: 1/4, 2/3, 3/2, 4/1

5번째 줄: 5/1, 4/2, 3/3, 2/4, 1/5

봐도 모르겠다고? 일단 여기서 패턴은 크게 두 개인데

  1. 분자와 분모의 패턴
  2. 줄간 패턴

이렇게 있다. 그럼 굵직한 패턴부터 보고 가자.

 

줄간 패턴

줄간 패턴은 크게 두 개인데, 전체적으로 줄의 번호 수(n)만큼 분수를 가지고 있으며 각 줄의 시발점(욕 아님)과 종점의 분자 혹은 분모가 해당 줄 번호이다. 세번째 줄을 보면 분수가 총 3개이고, 시발점의 분자와 종점의 분모가 3이다. 그리고 줄의 누적합은 순서대로 1, 3, 6, 10, 15, … 이다. 이건 초항이 1, 공차가 1인 등차수열의 각각 1, 2, 3, 4, 5번째까지의 합이고, 줄에 있는 분수의 수도 실제로 초항이 1, 공차가 1인 등차수열.

분수의 패턴

이거는 홀수번째 줄과 짝수번째 줄의 패턴이 반대인데, 세번째 줄은 분자가 큰 수에서 하나씩 감소하고 분모가 작은 수에서 큰 수로 하나씩 증가한다. (분자가 3, 2, 1이고 분모가 1, 2, 3) 짝수번째 줄은 반대로 분자가 작은 수에서 하나씩 증가하고 분모가 큰 수에서 하나씩 감소한다.

등차수열

솔직히 여기까지 봐도 근의 공식이 뭔 상관인지 모르겠지들? 그럼 뜬금포로 왜!!! 근의공식!!! 2에이분의 마이나쓰 비 플마 루트 비제곱 마이나쓰 4에이씨가 나왔는지 설명을 할 건데… 줄간 패턴에서 각 줄의 분수 숫자가 초항이 1이고 공차가 1인 등차수열이고 분수의 총 개수가 해당 등차수열의 합계라고 했다. 아니 스크롤도 안 넘겼어 그걸 까먹으면 어떡함… 아무튼, 등차수열의 일반항… 그러니까 이 문제에서 n번째 줄의 분수 개수(an)를 구하는 공식은

이거다. 여기서 a_1=1, d=1을 대입하고 풀면 a_n=n이 된다. 즉, n번째 줄의 분수 개수는 n개이다. 그리고 초항이 a_1, 공차가 d인 등차수열의 a_n항까지의 합은

이거다. 여기다가도 마찬가지로 a_1=1, d=1을 대입해보면 최종적으로

이 식을 도출할 수 있다. 즉, 저 식이 =0일때를 상정하고 근의 공식에 넣는거고, 우리가 입력하는 숫자 N은 앞의 문제와 마찬가지로 ‘또’ =0에서 0을 빼고 거기에 들어갈 거라 이항정리가 필요한데…

예시로 딱 나눠 떨어지는 10을 가져왔다. 그럼 여기서 어떻게 푸느냐… 2차, 1차 항의 계수를 1/2로 놓고 풀던가(이 경우 상수항은 그냥 넘어가면 장땡이라 편함), 양변에 2를 곱해 분모를 치워버리던가(2차, 1차 항의 계수가 1이 되고 상수항에 곱하기 2를 한다). 본인은 후자요.

import sys
import math
a = int(sys.stdin.readline())
c = a * -2
# 이제 이거 없으면... 섭하죠? 
line=int(-(-(-1 + math.sqrt((1 * 1) - 4 * 1 * c)) // 2))
print(line)

줄 수는 이런 식으로 도출하면 된다. 저기서 합계가 아닌 숫자, 그러니까 11, 12, 18 이런 숫자들은 소수점에 뭐가 붙는데, 그걸 일단 떼버리면 줄 번호가 된다. 11, 12는 10보다 크니까 5번째 줄에 있을거고 18은 5보다 크니까 6번째 줄에 있다.

import sys
import math
a = int(sys.stdin.readline())
c = a * -2
# 이제 이거 없으면... 섭하죠? 
line = int(-(-(-1 + math.sqrt((1 * 1) - 4 * 1 * c)) // 2))
# 몇 번째 줄?
maxline = sum(list(range(1,line+1)))
minline = sum(list(range(1,line)))+1
# 그 줄의 최댓값과 최솟값
gap = a - minline
# 줄의 최댓값과 내가 가진 값의 차이는? 
if line % 2 == 0:
    bunja = gap + 1
    bunmo = line - gap
else: 
    bunja = line - gap
    bunmo = gap + 1
print('{0}/{1}'.format(bunja,bunmo))

일단 변수의 의미부터 보고 갑시다.

 

Maxline: 그 줄의 최댓값(초항이 1이고 공차가 1인 등차수열의 n번째 줄까지의 합)

minline: 그 줄의 최솟값(초항이 1이고 공차가 1인 등차수열의 n-1번째 줄까지의 합+1)

 

예를 들어서 5번째 줄이면 Maxline은 1+2+3+4+5 해서 15, minline은 (1+2+3+4)+1 해서 11이다. 이걸로 그 줄의 최댓값과 최솟값을 찾게 되는 것. 아직까지는 줄을 찾은거고, 이제 실질적으로 이게 몇번째인지를 찾아야 하는데 그 역할을 하는 변수가 gap이다. 예를 들어서 13번째 분수를 찾는다고 하면, 13은 11보다 2 크기 때문에 5번째 줄의 최솟값(11)에서 두 개 떨어진다.

 

로직 부분은 간단하다. 짝수줄의 경우 분자가 증가, 분모가 감소이고 홀수줄은 짝수랑 반대. 예를 들어서 12를 입력했다, 그러면 gap이 1이 되는데

 

1. line(줄 번호)은 5이므로 2로 나누었을 때 나머지가 1이다.

2. 분자는 5-1을 해 주고, 분모는 1+1을 해 준다. (gap에 하나 안 더하면 각 줄의 첫번째는 분모나 분자가 0이 된다)

3. 따라서 4/2가 나온다.

 

이렇게 된다. …솔직히 나도 이거 한번에 맞을 줄 몰랐음…ㅋㅋㅋㅋ

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 10250번 풀이  (0) 2022.08.18
백준 2869번 풀이  (0) 2022.08.18
백준 2292번 풀이  (0) 2022.08.18
백준 1712번 풀이  (0) 2022.08.18
백준 2941번 풀이  (0) 2022.08.18
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 2292번 풀이

BOJ/[BOJ] Python 2022. 8. 18. 02:23

문제

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

 

2292번: 벌집

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

www.acmicpc.net

이 문제는 한줄요약이 안된다… 대충 1번 방에서 n번째 방까지 가는 최단거리를 구하는 문제. 참고로 벌집의 방 수에는 패턴이 있다. 

 

Reference

https://swkang.tistory.com/m/7

 

[BOJ]2292번 벌집(Python)

https://www.acmicpc.net/problem/2292 2292번: 벌집 위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를

swkang.tistory.com

 

계차수열과 근의 공식

왜 이게 나오냐면 내가 이걸로 풀어서요.

 

계차는 수열의 항과 항 사이의 차이다. 정확히는 뒤의 항에서 앞의 항을 뺀 것이 계차이고, 그 계차들로 이루어진 수열이 계차수열. 즉, 계차수열은 수열이 있어야 성립한다. 개 아니고 계다

계차수열의 일반식은 이걸로 구하고,

계차수열을 이용해 원래 수열의 일반항을 구할 때는 이걸로 구한다.

 

근의 공식은 이차방정식 ax^2+bx+c=0이 있을 때

이걸로 정의한다. 일단 그래서 또 가져올 코드가 있어요…

import math;
print('2차방정식의 근의 공식은 다음과 같습니다: \n'
      'a, b, c가 실수이며 a<>0일때 이차방정식 ax^2 + bx + c의 해를 구하는 공식 '
      '-b +- 루트(b^2 - 4ac) / 2a');
print('또한 이차방정식의 판별식인 b^2 - 4ac를 이용해 근이 중근인지, 서로 다른 실근인지, 허근인지도 알 수 있습니다. ');
a=int(input('이차항 계수를 입력해주세요 '));
b=int(input('일차항 계수를 입력해주세요 '));
c=int(input('상수항 계수를 입력해주세요 '));
d=(b*b)-(4*a*c);

if d>0:
    print('이 방정식은 서로 다른 두 실근을 가집니다. ');
    e = round((-b + math.sqrt((b * b) - 4 * a * c)) / (2 * a),3);
    f = round((-b - math.sqrt((b*b)-4*a*c))/(2*a),3);
    print(e);
    print(f);
elif d==0:
    print('이 방정식은 중근을 갖습니다. ');
    e = round((-b + math.sqrt((b * b) - 4 * a * c)) / (2 * a),3);
    print(e);
else:
    print('이 방정식은 허근을 갖습니다. ');
    e = (-b / (2 * a));
    f = round(math.sqrt(abs(b * b - 4 * a * c)) / 2 * a,3);
    print(str(e)+'+-'+str(f)+'i');

예전에 이차식의 계수를 입력하면 근의 공식에 대입해서 근을 구해주고, 판별식을 통해 이 방정식의 근이

  1. 서로 다른 두 실근(>0)
  2. 중근(=0)
  3. 허근(<0)

인지도 계산해주는 코드를 짰었는데, 오늘은 이 코드에서 ‘서로 다른 두 실근일 때 양의 실근’을 구하는 공식을 가져올 예정이다.

 

풀이

일단 코딩에 앞서 일반화를 해야 한다. (마른세수)

출처ㅣ 백준 2292번 문제

이게 그 벌집이다. 보면 되게 중구난방인 것 같지만… 일단 진정하고 아래 그림을 보자.

일단 저기서 1 말고(얘는 방이 하나임) 그 바깥줄부터 보자. …아니 시발점은 보지 말고 종점만 봅시다. 그러면 순서대로 7, 19, 37, 61이다. 아니 이게 무슨 패턴이 있어욧!! 아니 분명 있다니깐여 내가 아까 계차수열 말할 때 뭐 들었음? 계차수열이랑 이게 뭔 상관인지 모르겠다고? 자 그럼 가운데 방부터 시작해서 하나하나 짚어보자. 일단 방의 종점에 대한 수열을 a라고 하면

a1=1

a2=7

a3=19

a4=37

a5=61

이렇게 된다.

a1=1

a2=a1+6

a3=a2+12

a4=a3+18

a5=a4+24

이렇게 6배수 차이가 난다. 즉, 이 수열은 아무 패턴이 없어보이게 훼이크를 줬지만 계차수열의 초항이 6, 공차가 6인 ‘등차수열’을 이루고 있다.

계차수열의 패턴과 일반화 공식을 이용하면 3n^2-3n+1이라는 식이 도출되게 된다. 그럼 이 다음은? 근의 공식에 대입하면 된다.

씁 뭔가 쎄한데…? 이건 3n^2-3n+1=0일 때의 값이다. 실제로 계산해보면

2차방정식의 근의 공식은 다음과 같습니다: 
a, b, c가 실수이며 a<>0일때 이차방정식 ax^2 + bx + c의 해를 구하는 공식 -b +- 루트(b^2 - 4ac) / 2a
또한 이차방정식의 판별식인 b^2 - 4ac를 이용해 근이 중근인지, 서로 다른 실근인지, 허근인지도 알 수 있습니다. 
이차항 계수를 입력해주세요 3
일차항 계수를 입력해주세요 -3
상수항 계수를 입력해주세요 1
이 방정식은 허근을 갖습니다. 
0.5+-2.598i

이차식의 계수를 그대로 입력하면 허근이 나오는 게 맞다.

2차방정식의 근의 공식은 다음과 같습니다: 
a, b, c가 실수이며 a<>0일때 이차방정식 ax^2 + bx + c의 해를 구하는 공식 -b +- 루트(b^2 - 4ac) / 2a
또한 이차방정식의 판별식인 b^2 - 4ac를 이용해 근이 중근인지, 서로 다른 실근인지, 허근인지도 알 수 있습니다. 
이차항 계수를 입력해주세요 3
일차항 계수를 입력해주세요 -3
상수항 계수를 입력해주세요 -12
이 방정식은 서로 다른 두 실근을 가집니다. 
2.562
-1.562

0이 들어갈 자리에 13을 넣고 이항정리를 하면 이렇게 나온다. (반올림하면 3 맞음) 그럼 이제 IDE를 켜보자.

import sys
a=int(sys.stdin.readline())
# 역시나 유서깊은(?) sys.stdin.readline()입니다. 
# 뭐요.

입력은 역시나 유서깊은 sys.stdin.readline()으로 해 준다.

(-b + math.sqrt((b*b)-4*a*c))/(2*a)

근의 공식 코드에 쓰였던 건 얜데, math가 모듈이다. 그래서 저걸 불러와야 쓸 수 있다. …사실 백준에서 sys말고 뭐 불러본 적이 없음… 아무튼 그럼 제곱근 못써요?

a ** 0.5

걍 지수승에 분수 주면 된다. 일반적으로 루트 끼고 들어가는 제곱근은 1/2승으로 주면 된다.

import sys
a=int(sys.stdin.readline())
# 역시나 유서깊은(?) sys.stdin.readline()입니다. 
# 뭐요. 
c = 1 - a
n = (-(-3) + ((9-12*c) ** 0.5))/6
print(int(n)+1)

그리고 이렇게 한 다음 와 됐다 하고 냈더니 틀렸대. 알고보니 1 넣으면 1이 나와야 하는데 2가 나오는 것이었다

import sys
a=int(sys.stdin.readline())
# 역시나 유서깊은(?) sys.stdin.readline()입니다. 
# 뭐요. 
c = 1 - a
n = -(-(3 + ((9-12*c) ** 0.5))//6)
print(int(n))

일단 연산자를 //로 바꾸고(//는 몫만 나온다. 6//5=1), 저게 음수를 나눌 때는 숫자가 올림이 되기 때문에 참고문헌에서는 음수로 바꾼 다음 나누고 양수로 바꾸셨다. (그리고 형변환은 덤)

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 2869번 풀이  (0) 2022.08.18
백준 1193번 풀이  (0) 2022.08.18
백준 1712번 풀이  (0) 2022.08.18
백준 2941번 풀이  (0) 2022.08.18
백준 5622번 풀이  (0) 2022.08.18
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 1712번 풀이

BOJ/[BOJ] Python 2022. 8. 18. 02:11

문제

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

 

1712번: 손익분기점

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

www.acmicpc.net

손익분기점을 구하는 문제. 참고로 부등식이다.

 

방정식과 부등식

방정식은 식에 등호(=)가 있고, 부등식은 식에 부등호(<,>)가 있다. (대충 펀쿨섹좌 짤)

 

그래서 x+y=1은 방정식이고, x+y>1은 부등식이다. 여기서 왜 부등식을 쓰느냐… 손익분기점은 비용보다 커야 하기 때문. 어디서 많이 본 것 같다고? 저거 중학생때 배우는겁니다 여러분.

 

일반화

그럼 이제 일반화를 해 보도록 하자.

 

고정비용 A, 가변비용 B가 있고 가변비용은 생산량에 따라 비용이 배가된다. 즉 물건을 하나 생산할 때는 A+B, 두 개 생산할 때는 A+2B 이런 식이 된다. 그리고 C는 물건의 판매가. 그래서 일반화한 식이 A + Bx < Cx가 된다. 그리고 이항정리를 하게 되면 A < Cx – Bx를 거쳐서 A < (C – B)x가 된다.

 

그리고 이 식을 다시 x에 맞게 정리하게 되면 최종적으로 A / (C – B) < x가 된다.

 

풀이

일단 Python에서도 모듈을 깔면 방정식을 풀 수 있다. 바로 sympy와 mpmath.

import sys
from sympy import *
from mpmath import mp
init_printing()
# Sympy
A,B,C=map(int,sys.stdin.readline().split(" "))
x=Symbol('x')
# A, B, C는 입력받는 변수(고정비용, 가변비용, 판매가)
# 이 때 손익분기점에 대한 부등식은 A+Bx<Cx이다. 
expr=A < (C - B) * x
print(solve(expr))

x를 심볼화하고 solve() 던지면

(10 < x) & (x < oo)

이렇게 나온다. 그러면 x가 10보다 커야 하니 제일 가까운 정수는 11. 근데 이걸로 내면 출력 형식때문에 틀려요…

import sys
A,B,C=map(int,sys.stdin.readline().split(" "))
# A, B, C는 입력받는 변수(고정비용, 가변비용, 판매가)
# 이 때 손익분기점에 대한 부등식은 A+Bx<Cx이다. 항을 정리해주게 되면 A < (C - B)x가 된다. 
# 단, sympy를 부를 수 없으므로... 
x = 0
y = C - B
while x * y <= A:
    x += 1
    x * y
print(x)
# 뺑뺑이 돌릴거다.

그럼 어쩌겠음 뺑뺑이 돌려야지. 근데 문제가 하나 있다. 이 코드도 맞는 답을 내놓는 건 맞는데, 이걸로 주면 시간초과 나온다. 그리고 저 코드는 한가지가 빠졌다. 바로 답이 없는 경우에 -1로 처리하는 코드가 없다. 그니까 아싸 끝 하고 저거 갖다 내면 뭐다? 틀린다.

import sys
A,B,C=map(int,sys.stdin.readline().split(" "))
# A, B, C는 입력받는 변수(고정비용, 가변비용, 판매가)
# 이 때 손익분기점에 대한 부등식은 A+Bx<Cx이다. 항을 정리해주게 되면 A < (C - B)x가 된다. 
# 단, sympy를 부를 수 없으므로... 
x = 0
y = C - B
if y < 0:
    print(-1)
else: 
    while x * y <= A:
        x += 1
        x * y
    print(x)
# 뺑뺑이 돌릴거다.

손익분기점이 있는 케이스와 없는 케이스 둘 다 sympy로 만든 코드에 넣었을 때 해가 어떻게 되느냐, 손익분기점이 있는 케이스는 C – B, 즉 판매 비용과 가변 비용의 차가 양수이고 손익분기점이 없는 케이스(3 2 1)는 C – B가 음수, 즉 0보다 작다. 거기에 대한 처리를 한 게 저 코드인데 아직 내지 말아봐… 저거 시간초과여.

import sys
A,B,C=map(int,sys.stdin.readline().split(" "))
# A, B, C는 입력받는 변수(고정비용, 가변비용, 판매가)
# 이 때 손익분기점에 대한 부등식은 A+Bx<Cx이다. 항을 정리해주게 되면 A < (C - B)x가 된다. 
# 단, sympy를 부를 수 없으므로... 
x = 0
if C - B < 0:
    print(-1)
else:  
    x = A / (C - B)
    print(int(x+1))
# 루프문 시간초과 실화냐고

루프를 안 돌리고 다이렉트로 구해버리면 시간초과는 해결이다. 와! 그럼 내도 돼요? 아니 있어봐 저거 내면 Zerodivision 떠… 선생님 되게 행복회로 태웠는데 에러나면 엿같잖아요…

import sys
A,B,C=map(int,sys.stdin.readline().split(" "))
# A, B, C는 입력받는 변수(고정비용, 가변비용, 판매가)
# 이 때 손익분기점에 대한 부등식은 A+Bx<Cx이다. 항을 정리해주게 되면 A < (C - B)x가 된다. 
# 단, sympy를 부를 수 없으므로... 
x = 0
if C - B <= 0:
    print(-1)
else:  
    x = A / (C - B)
    print(int(x+1))
# 루프문 시간초과 실화냐고

Zerodivision은 어떤 수를 0으로 나누려고 하면 생기는 문제이다. n / 0 (n != 0)이면 불능, 0 / 0은 부정이다. 아무튼 그러한 이유로 C – B가 0일때도 -1이 뜨도록 처리해야 한다.

 

Appendix. 부정과 불능

부정은 해가 더럽게 많은거고, 불능은 알파고 할아버지가 와도 답이 없는 케이스. 알파고는 할아버지가 없는데요

 

0으로 나누는 케이스의 경우 0 / 0이 부정인 이유를 이해하려면 나눗셈이 곱셈과 서로 역연산 관계라는 것을 알고 가야 한다. 부정은 해가 개 많은거라고 했는데, 0 / 0 = C라고 하면 0 = C * 0이 되고 여기에 들어갈 수 있는 C가 사실상 정말 겁나 완전 핵 많기 때문에 부정. 불능은 n / 0 = C (단, n != 0)라고 할 때 n = C * 0이고 이를 만족하는 C가 없으므로 불능.

 

계산기에서 0으로 나누면 에러 뜨는 이유도 그것때문이다. 나눗셈이라는 건 피제수에서 제수를 빼고 빼고 빼고 하는거고, 최종적으로 몇 번 뺐느냐가 몫, 얼마 남았느냐가 나머지(몫보다 작은 수)가 되는데 0을 빼게 되면 아주 주구장창 0만 빼야 한다. 사용자가 종료하거나(…) 비스무트 방사성 동위원소 반감기 도래하거나(대략 (1.9±0.2) ×1019년) 우주 멸망하거나 프로그램이 뻗을때까지 해야 한다. 대충 break 조건 없는 while True: 에 갇힌다고 생각하면 된다.그래서 대부분의 프로그램이나 계산기는 0으로 나누려고 하면 에러를 토한다.

 

아, !=는 다르다는 얘기다.

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 1193번 풀이  (0) 2022.08.18
백준 2292번 풀이  (0) 2022.08.18
백준 2941번 풀이  (0) 2022.08.18
백준 5622번 풀이  (0) 2022.08.18
백준 2908번 풀이  (0) 2022.08.18
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 2941번 풀이

BOJ/[BOJ] Python 2022. 8. 18. 02:08

문제

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

 

2941번: 크로아티아 알파벳

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z=

www.acmicpc.net

크로아티아 알파벳을 포함해 몇 글자인지 세기. (그러니까 (c=,c-,dz=,d-,lj,nj,s=,z=)를 포함해서 세는거다)

 

풀이

import sys
a = sys.stdin.readline().strip()
croatian_alphabet=["c=","c-","dz=","d-","lj","nj","s=","z="]
for i in croatian_alphabet:
    if a.find(i) != -1: 
        a=a.replace(i,"*")
print(len(a))

이건 사실 크로아티아 알파벳 만들어놓고 문자열에서 크로아티안 알파벳을 찾았을 때 한 글자짜리로 바꾼 다음(코드에서는 *) 길이 쟀다. 어쨌든 길이 제대로 재 주면 되는 거 아님? 이런 논리왕같으니

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 2292번 풀이  (0) 2022.08.18
백준 1712번 풀이  (0) 2022.08.18
백준 5622번 풀이  (0) 2022.08.18
백준 2908번 풀이  (0) 2022.08.18
백준 1152번 풀이  (0) 2022.08.18
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

방명록