문제

 

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

문제

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

문제

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

문제

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

문제

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

문제

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

문제

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

문제

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. 합의 기호, 시그마

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

아 역시 클럽 시그마져.

 

시그마는 그리스어 알파벳으로, ∑ 혹은 σ라고 쓴다. 아 이거요? 일어 자판 세팅해두면 독음 맞으면 그리스어 기호 쓸 수 있다. 아무튼… 왼쪽이 대문자 오른쪽이 소문자인데 오늘 설명할 합의 기호 시그마는 대문자이고, 소문자 시그마는 통계쪽에서 모표준편차(왜 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

문제

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

문제

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

Profile

Lv. 34 라이츄

요즘 날씨 솔직히 에바참치김치꽁치갈치넙치삼치날치기름치준치학꽁치임..