백준 - 4

서희찬·2021년 7월 23일
0

백준

목록 보기
4/105

으아,,,

제주도 50일 살이하고 돌아왔다!

그 와중에 파이썬 백준 스터디를 해서 앞에 있는 문제들은 전부 파이썬으로 다시풀었다

그러고 단계별로 하나씩 스터디 진도대로 풀어나가고 있는 중이다 !

그럼 바로 시작하겠다

9020 : 골드바흐의 추측


def prime_list(n): #소수 판독기 
    n+=1 #n이하의 숫자를 확인해야하므로 ! 
    # 에라토스테네스의 체 초기화: n개 요소에 True 설정(소수로 간주)
    primeList = [True] * n
    # n의 최대 약수가 sqrt(n) 이하이므로 i=sqrt(n)까지 검사
    m = int(n ** 0.5)
    for i in range(2, m + 1):
        if primeList[i] == True:           # i가 소수인 경우 참 
            for j in range(2*i, n, i): # i이후 i의 배수들을 False 판정
                primeList[j] = False

    return [i for i in range(2,n) if primeList[i]==True] #소수반환  
    

def total(n):
    li = prime_list(n)
    idx = max([i for i in range(len(li)) if li[i]<=n/2]) #최댓값 li길이 만큼 for 실행 그런데..n/2이하일경우 최대인 인덱스값 출력 
    for i in range(idx,-1,-1): #인덱스 이하의 배열 요소 접근 
        for j in range(i,len(li)): #i이상의 배열 요소 접근 
            if li[i]+li[j]==n: #합 비교 
                return [li[i],li[j]] #소수 찾기 성공 

test = int(input()) 
for _ in range(test):
    a = int(input())
    print(" ".join(map(str,total(a)))) #join으로 나타내주기 

함수를 두개짜줬다

첫번째 함수는 에라토스테네스의 체로 소수를 판별해주는 함수이다.

두번째 함수는 첫번째 함수에서 찾은 소수리스트를 가져와서 두개의 합이 입력받은 n값과 동일한 소수 짝을 찾는 함수이다!

그러고 마지막에 join 과 map함수를 활용해서 출력하였다.

배운점

    for i in range(idx,-1,-1): #인덱스 이하의 배열 요소 접근 

이런 방식으로 idx값이 3이라면 3,2,1,0에 내림차순으로 접근할 수 있다 !

print(" ".join(map(str,total(a)))) #join으로 나타내주기 

join,map함수를 활용하여 원하는대로 출력할 수 있다 .

1085

x,y,w,h = map(int,input().split()) # x,y,w,h 값 입력받기 
print(min(x,y,h-y,w-x))

그냥 최솟값 출력을 하면 된다...!

3009

xList=[]
yList=[]
#x,y리스트받기 
for i in range(3):
    x,y = map(int,input().split())
    xList.append(x)
    yList.append(y)

for i in range(3):
    if xList.count(xList[i]) == 1: #x 1개인 요소 찾기 
        x = xList[i]
    if yList.count(yList[i]) == 1: #y 1개인 요소 찾기 
        y = yList[i]

print(f"{x} {y}")

x,y값을 요소별 리스트로 입력 받고
한개있는 값을 찾아 그 각각의 값을 출력하여 평행을 맞춰준다.

4153

#4153

while True :
    length = list(map(int,input().split()))
    if sum(length)==0:
        break
    max_len = max(length)
    length.remove(max_len) #긴 길이 지우기 
    if (length[0]**2 + length[1]**2 == max_len**2):
        print("right")
    else:
        print("wrong")

배운점

    length = list(map(int,input().split()))

이 방식을 통해 리스트도 띄어쓰기로 입력받을 수 있다 !!!

length.remove(max_len) #긴 길이 지우기 

remove를 통해 요소를 지움으로서 배열의 인덱스 값을 하나씩 당길 수 있다.

3053

import math 
r = int(input())
print(r*r*math.pi) 
print(r*r*2)

배운점

import math 를 통해 math.pi를 가져올 수 있다.
택시 기하학에서 원은 사각형이다 !
원에 내접하는 !

1002

test = int(input())
for _ in range(test):
    x1,y1,r1,x2,y2,r2 = map(int,input().split())
    distance = ((x1-x2)**2 +(y1-y2)**2)**(1/2)
    maxR=r1+r2
    minR=abs(r1-r2) 
    if distance==0:
        if r1 == r2: #원이 겹치는 경우 
            print(-1) 
        else : #원이 접하지 않는 경우 
            print(0)
    else:
        if distance == maxR or distance == minR:
            print(1)
        elif distance<maxR and distance > minR: # 
            print(2)
        else : #아예 딴 곳 
            print(0) 

배운점

두 원의 반지름길이와 중심사이에 따른 접하는 점의 갯수...
수학을 안한지 너무 오래됐다...바로 생각이 안났다니 ㅋㅋ... 씁쓸...
원 중심이 (x1,y1)이고 반지름이 r1인 C1인 원이 있고
원 중심이 (x2,y2)이고 반지름이 r2인 C2인 원이 있다.
d=두 원의 중심사이의 거리이다.

교점 2개

r1-r2 < d < r1+r2 일 경우

교점 1개

r1+r2 = d or r1-r2=d 일 경우

교점 0개

r1+r1 > d, r1-r2>d 인 경우
중심이 동일할때 반지름이 다른경우 2개

총6가지가 있다!!

까먹지 말자 !

profile
부족한 실력을 엉덩이 힘으로 채워나가는 개발자 서희찬입니다 :)

0개의 댓글