Date:     Updated:

카테고리:

태그: ,


💡 백준(Baekjoon Online Judge)은 온라인으로 프로그래밍 문제를 풀고 채점받을 수 있는 웹사이트입니다.
백준 ‘단계별로 풀어보기’ 문제풀이가 아래에 수록되었습니다.


9단계 기본 수학2

단계 문제 번호 제목 정답률
1 1978 소수 찾기 47.640%
2 2581 소수 38.832%
3 11653 소인수분해 52.624%
4 1929 소수 구하기 26.792%
5 4948 베르트랑 공준 40.337%
6 9020 골드바흐의 추측 40.816%
7 1085 직사각형에서 탈출 60.375%
8 3009 네번째점 73.091%
9 4153 직각삼각형 51.628%
10 3053 택시기하학 45.780%
11 1002 터렛 21.499%

Q1. 소수 찾기(1978)

❓ 문제

주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.

입력

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

출력

주어진 수들 중 소수의 개수를 출력한다.

💯 답(정답률: 47.640%)

n = int(input())
num = map(int, input().split())
prime = 0
for i in num:
    non_prime = 0
    if i>1:
        for j in range(2, i):
            if i%j == 0:
                non_prime += 1
        if non_prime == 0:
            prime += 1
print(prime)


Q2. 소수(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을 출력한다.

💯 답(정답률: 38.832%)

m = int(input())
n = int(input())
prime_list = []
for _ in range(m,n+1):
    non_prime = 0
    if _ > 1:
        for i in range(2, _):
            if _%i == 0:
                non_prime += 1
                break  #break를 넣어주어 불필요한 반복문 최소화시킴.
        if non_prime == 0:
            prime_list.append(_)
if len(prime_list) == 0:
    print(-1)
else:
    print(sum(prime_list))
    print(min(prime_list))

#오답노트
m = int(input())
n = int(input())
prime_list = []
for _ in range(m,n+1):
    non_prime = 0
    if _ > 1:
        for i in range(2, _):
            if _%i == 0:
                non_prime += 1  #이 뒤에 break가 없어서 시간초과!
        if non_prime == 0:
            prime_list.append(_)
if len(prime_list) == 0:
    print(-1)
else:
    print(sum(prime_list))
    print(min(prime_list))


Q3. 소인수분해(11653)

❓ 문제

정수 N이 주어졌을 때, 소인수분해하는 프로그램을 작성하시오.

입력

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

출력

N의 소인수분해 결과를 한 줄에 하나씩 오름차순으로 출력한다. N이 1인 경우 아무것도 출력하지 않는다.

💯 답(정답률: 52.624%)


n = int(input())
prime = 2
while n != 1:
    if n%prime ==0:
        n = n/prime
        print(prime)
    else:
        prime += 1

#오답노트.
n = int(input())
prime_list = [] # 리스트 안 만들고 제때 출력해도 됐음
if n == 1: # n이 1인 경우는 어차피 아래 while문에서 알아서 걸러줄거임
    print()
else:
    prime = 2
    while n != 1:
        if n % prime == 0:
            prime_list.append(prime)
            n = n/prime
            prime = 2
        else:
            prime += 1

for i in prime_list:
    print(i)


Q4. 소수 구하기(1929)

❓ 문제

M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.

입력

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

출력

한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.

💯 답(정답률: 26.792%)

m, n = map(int, input().split())
for i in range(m,n+1):
    if i == 1:
        continue
    for j in range(2,int((i**0.5)+1)):
        if i%j == 0:
            break
    else:
        print(i)
#break(반복 중단)과 continure(반복 유지한 채 스킵)을 잘 구분해서 사용할 것.

#오답노트(시간초과)
#답은 맞게 나오는데, 시간초과가 뜬다.
m, n = map(int, input().split())
for i in range(m,n+1):
    non_prime = 0
    for j in range(2,i):
#검사 구간을 2부터 i가 아니라 2부터 i의 제곱근으로 해줘도 무방. 더 빨라짐.
        if i%j == 0:
            non_prime += 1
            break
    if non_prime == 0:
        print(i)


Q5. 베르트랑 공준(4948)

❓ 문제

베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다.

이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 체비쇼프가 1850년에 증명했다.

예를 들어, 10보다 크고, 20보다 작거나 같은 소수는 4개가 있다. (11, 13, 17, 19) 또, 14보다 크고, 28보다 작거나 같은 소수는 3개가 있다. (17,19, 23)

자연수 n이 주어졌을 때, n보다 크고, 2n보다 작거나 같은 소수의 개수를 구하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 케이스는 n을 포함하는 한 줄로 이루어져 있다.

입력의 마지막에는 0이 주어진다.

출력

각 테스트 케이스에 대해서, n보다 크고, 2n보다 작거나 같은 소수의 개수를 출력한다.

💯 답(정답률: 40.328%)

import math

#소수 만드는 함수
def prime(num):     
    if num == 1:  #1이면
        return False #소수가 아니다
    else :
        for i in range(2,int(math.sqrt(num))+1) : #굳이 제곱근으로 만든 건 실행시간 줄이기 위함
            if num%i == 0: #주어진 num이 자기 외의 2이상의 수로 나눠떨어지면
                return False #소수가 아니다
        return True #두 가지 조건 외에 값은 소수다

natural = list(range(2,246912)) 
#문제에 나온 조건만큼만 알아보면 됨. 다 알아보려면 시간초과

prime_list = []
for i in natural:
    if prime(i):
        prime_list.append(i)
        
n = int(input())
while n!=0:
    prime_count = 0
    for i in prime_list:
        if n < i <= 2*n:
            prime_count += 1
    print(prime_count)
    n = int(input())

#오답노트
while True:
    n = int(input())
    prime_count = 0
    if n == 0:
        break
    for i in range(n+1,2*n+1):
        if i == 1:
            continue
        for j in range(2, int((i**0.5)+1)):
            if i%j == 0:
                break
        else:
            prime_count += 1
    print(prime_count)


Q6. 골드바흐의 추측(9020)

❓ 문제

1보다 큰 자연수 중에서  1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아니다.

골드바흐의 추측은 유명한 정수론의 미해결 문제로, 2보다 큰 모든 짝수는 두 소수의 합으로 나타낼 수 있다는 것이다. 이러한 수를 골드바흐 수라고 한다. 또, 짝수를 두 소수의 합으로 나타내는 표현을 그 수의 골드바흐 파티션이라고 한다. 예를 들면, 4 = 2 + 2, 6 = 3 + 3, 8 = 3 + 5, 10 = 5 + 5, 12 = 5 + 7, 14 = 3 + 11, 14 = 7 + 7이다. 10000보다 작거나 같은 모든 짝수 n에 대한 골드바흐 파티션은 존재한다.

2보다 큰 짝수 n이 주어졌을 때, n의 골드바흐 파티션을 출력하는 프로그램을 작성하시오. 만약 가능한 n의 골드바흐 파티션이 여러 가지인 경우에는 두 소수의 차이가 가장 작은 것을 출력한다.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고 짝수 n이 주어진다.

출력

각 테스트 케이스에 대해서 주어진 n의 골드바흐 파티션을 출력한다. 출력하는 소수는 작은 것부터 먼저 출력하며, 공백으로 구분한다.

💯 답(정답률: 40.816%)

import math

#소수 만드는 함수 지정
def prime(num):     
    if num == 1:  
        return False
    else :
        for i in range(2,int(math.sqrt(num))+1) :
            if num%i == 0:
                return False
        return True
    
t = int(input())
for i in range(t):
    n = int(input())
    r = n//2 #두 소수의 차가 가장 적게 하기 위해 절반부터 역순으로 세야 함.
    #8을 예로 들면 r=4가 되고, 4부터 1까지 역순으로 점검한다는 뜻.
		for j in range(r,1,-1):
        if prime(j) and prime(n-j):
            print(j, n-j)
            break #소수 찾았으니 그 뒤의 소수는 어차피 지금 찾은 두 소수보다 차가 클 것이므로 반복문 종료


Q7. 직사각형에서 탈출(1085)

❓ 문제

한수는 지금 (x, y)에 있다. 직사각형은 각 변이 좌표축에 평행하고, 왼쪽 아래 꼭짓점은 (0, 0), 오른쪽 위 꼭짓점은 (w, h)에 있다. 직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 x, y, w, h가 주어진다.

출력

첫째 줄에 문제의 정답을 출력한다.

💯 답(정답률: 60.375%)

x, y, w, h = map(int, input().split())
num_list = [w-x, h-y, x, y] # (x,y)에서 가장 가까운 변까지의 거리이므로 거리 네 개를 설정하고
print(min(num_list)) #그 중 가장 짧은 거리를 출력하면 된다.


Q8. 네번째점(3009)

❓ 문제

세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.

입력

세 점의 좌표가 한 줄에 하나씩 주어진다. 좌표는 1보다 크거나 같고, 1000보다 작거나 같은 정수이다.

💯 출력

직사각형의 네 번째 점의 좌표를 출력한다.

답(정답률: 73.091%)

#좌표가 (5,5) (5,7) (7,5)로 주어진다면 직사각형이 되기 위해 x좌표가 5 2개, 7 2개로 맞아야 한다
#고로 두 번 나온 5 말고 한 번 나온 7이 우리가 찾는 x좌표다
#마찬가지로 y좌표도 두 번 나온 5가 아닌 한 번 나온 7이 우리가 찾는 y좌표다.

x_list=[] # x값과 y값을 담을 리스트를 만든다
y_list=[]
for i in range(3):
    x, y = map(int, input().split()) #나머지 세 개 좌표를 반복해서 받는다
    x_list.append(x) #각 리스트에 값을 넣어준다
    y_list.append(y)

for i in range(3): #index0,1,2 순으로 탐색하며
    if x_list.count(x_list[i])==1: #1번만 카운팅 된 수는(2번 카운팅 된 수가 아닌 수)
        result_x = x_list[i] # #우리가 찾는 x좌표다
    if y_list.count(y_list[i])==1:
        result_y = y_list[i]
        
print(result_x, result_y)


Q9. 직각삼각형(4153)

❓ 문제

과거 이집트인들은 각 변들의 길이가 3, 4, 5인 삼각형이 직각 삼각형인것을 알아냈다. 주어진 세변의 길이로 삼각형이 직각인지 아닌지 구분하시오.

입력

입력은 여러개의 테스트케이스로 주어지며 마지막줄에는 0 0 0이 입력된다. 각 테스트케이스는 모두 30,000보다 작은 양의 정수로 주어지며, 각 입력은 변의 길이를 의미한다.

💯 출력

각 입력에 대해 직각 삼각형이 맞다면 “right”, 아니라면 “wrong”을 출력한다.

답(정답률: 51.628%)


while True:
    side = list(map(int, input().split())) #세 변을 리스트에 담는다
    max_side = max(side) #가장 긴 변을 변수로 만든다
    if sum(side) == 0: #모든 변이 0이면
        break #반복문 중단한다
    side.remove(max_side) #가장 긴 변을 빼놓고 리스트를 만든다. 인덱스를 쉽게 하기 위함이다.
    if side[0]**2 + side[1]**2 == max_side**2: #피타고라스
        print('right')
    else:
        print('wrong')

#오답노트
#단순히 세 수만 나열하고 풀었더니 오답
#y가 가장 긴 변일 수도 있으므로 오답이 된 것
while True:
    x, y, z = map(int, input().split())
    if x==0 and y==0 and z==0:
        break
    
    elif x>0 and y>0 and z>0 and x**2+y**2 == z**2:
        print('right')
    else:
        print('wrong')


Q9. 택시기하학(3053)

❓ 문제

19세기 독일 수학자 헤르만 민코프스키는 비유클리드 기하학 중 택시 기하학을 고안했다.

택시 기하학에서 두 점 T1(x1,y1), T2(x2,y2) 사이의 거리는 다음과 같이 구할 수 있다.

D(T1,T2) = x1-x2 + y1-y2

두 점 사이의 거리를 제외한 나머지 정의는 유클리드 기하학에서의 정의와 같다.

따라서 택시 기하학에서 원의 정의는 유클리드 기하학에서 원의 정의와 같다.

원: 평면 상의 어떤 점에서 거리가 일정한 점들의 집합

반지름 R이 주어졌을 때, 유클리드 기하학에서 원의 넓이와, 택시 기하학에서 원의 넓이를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 반지름 R이 주어진다. R은 10,000보다 작거나 같은 자연수이다.

💯 출력

첫째 줄에는 유클리드 기하학에서 반지름이 R인 원의 넓이를, 둘째 줄에는 택시 기하학에서 반지름이 R인 원의 넓이를 출력한다. 정답과의 오차는 0.0001까지 허용한다.

#3053 택시 기하학
import math
r = int(input())

#택시기하학에서 원은 대각선을 지름으로 하는 마름모이다.

#f스트링을 활용하여 소숫점 6자리까지 나타내자
print(f'{r*r*math.pi: .6f}') 
print(f'{r*r*2: .6f}')


Q10. 터렛(1002)

❓ 문제

조규현과 백승환은 터렛에 근무하는 직원이다. 하지만 워낙 존재감이 없어서 인구수는 차지하지 않는다.

이석원은 조규현과 백승환에게 상대편 마린(류재명)의 위치를 계산하라는 명령을 내렸다. 조규현과 백승환은 각각 자신의 터렛 위치에서 현재 적까지의 거리를 계산했다.

조규현의 좌표 (x1, y1)와 백승환의 좌표 (x2, y2)가 주어지고, 조규현이 계산한 류재명과의 거리 r1과 백승환이 계산한 류재명과의 거리 r2가 주어졌을 때, 류재명이 있을 수 있는 좌표의 수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 이루어져 있다.

한 줄에 x1, y1, r1, x2, y2, r2가 주어진다. x1, y1, x2, y2는 -10,000보다 크거나 같고, 10,000보다 작거나 같은 정수이고, r1, r2는 10,000보다 작거나 같은 자연수이다.

출력

각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.

💯 답(정답률:21.499%)

#단순하게 생각하면, (x1,y1)을 중심으로 하고 r1이 반지름인 원과
#(x2,y2)를 중심으로 하고 r2가 반지름인 원을 생각하고
#이 원들의 접점이 곧 류재명이 있을 수 있는 좌표가 된다.
import math
t = int(input())
for i in range(t):
    x1, y1, r1, x2, y2, r2 = map(int, input().split())
    distance = math.sqrt((x1-x2)**2+(y1-y2)**2) #두 원 사이 거리
    if distance == 0 and r1==r2: #두 원이 동심원인 경우
        print(-1) #접점이 무한대이므로 -1 출력
    elif distance == abs(r1-r2) or distance == r1+r2: #원이 내접하는 경우거나 외접하는 경우
        print(1) #접점은 하나
    elif abs(r1-r2) < distance < r1+r2: #두 원이 서로 다른 두점에서 만나는경우
        print(2) #접점은 두 개
    else: #나머지 경우는 원이 아예 만나지 않는 경우
        print(0)