728x90

코드 단축 연습이 필요합니다. 

진짜 심각합니다 이거

진짜 내가 쓴 코드의 비효율성에 소름이 돋음... 숏코딩을 진지하게 연습해야할까 생각중

 

먼저 내 끔찍한 코드 공개:

 

t=int(input())
startend=[]

for _ in range(t):
  centre=[]
  startend = list(map(int, input().split()))
  n=int(input())
  cnt=0
  x1=startend[0]
  y1=startend[1]
  x2=startend[2]
  y2=startend[3]
  
  for k in range(n):
    line = []             
    line = list(map(int, input().split()))
    centre.append(line)
    r=centre[k][2]
    if(centre[k][0]-r<x1<centre[k][0]+r and centre[k][1]-r<y1<centre[k][1]+r):
      cnt+=1
    elif(centre[k][0]-r<x2<centre[k][0]+r and centre[k][1]-r<y2<centre[k][1]+r):
      cnt+=1
      
  print(cnt)

 

그리고 단축시킨 코드 공개. 

수학 상 원방에 나온 내용인데 아직 과외학생 진도가 여기까지 안나가서 존재를 까먹고 미처 쓸 생각을 못했다.

이건 프로그래머 지망생으로써 문제가 아니라 수학과외 선생으로써 자격이 있는지 심히 의심된다.

(까먹었던 내용을 과외학생과 같이 공부하는급ㅋㅋㅋ)

 

여튼 원방을 기억해내고 고치긴 했다.

 

t = int(input())
for i in range(t):
    cnt = 0
    x1, y1, x2, y2 = map(int, input().split())
    n = int(input())
    for i in range(n):
        cx, cy, cr = map(int, input().split())
        d1 = (((x1 - cx) ** 2) + ((y1 - cy) ** 2)) ** 0.5
        d2 = (((x2 - cx) ** 2) + ((y2 - cy) ** 2)) ** 0.5
        if (d1 < cr and d2 > cr) or (d1 > cr and d2 < cr):
            cnt += 1
    print(cnt)

 

728x90
728x90
t=int(input())
n=1
ans=[]
i=0
for i in range(t):
  a,b = map(int,input().split())
  x=b-a
  while(1):
    if(n*(n-1)<x<=n**2): 
      ans.append(2*n-1)
      break
  
    elif(n**2<x<=n*(n+1)):
      ans.append(2*n)
      break
      
    else:
      n+=1

for p in range(t):
  print(ans[p])

 

ㅋㅋ시간초과;

 

그래서 짠 두번째 코드 (간략화)

 

t=int(input())
i=0
for i in range(t):
  a,b = map(int,input().split())
  x=b-a
  n=0
  while True:
    if x <= n*(n+1):
      break
    n+=1

  if x <= n**2:
    print(2*n-1)

  else:
    print(2*n)​

 

 

중간지점을 찾으면 풀릴거라 생각했던 탄소 

 

 

시간제한이 2초라 ㅈ밥이라 생각했던 탄소

그리고 시간제한에 걸려버렸고ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

2초라 널널하게 짜도 될거라 생각해서 효율 버리고 편한대로 짰지만 생각보다 깐깐했던 백준

 

그래서 탄소는

 

"수학"을 하기로 한다.

 

 

사실 장난으로 노가다 컨셉 잡아본거였는데 의외로 돼서 놀랐음.

처음엔 저것들 간의 규칙을 방정식으로 나타내서 근의공식을 쓸까 생각했지만 그거보다 더 간단한게 있다는걸 깨달음.

그건 바로...

 

"수열"

 

 

킹갓수열.

 

 

그렇다. 이번 문제는 아예 100퍼센트 순수 수학이였던 것이다.

알고리즘따위 1도 필요없는 고등학교 2학년 이상이면 다 배운 '수열'.

 

요즘 과외애들 하는게 이차부등식이랑 수열 이런건데 너무 숙제로 내주고싶게 생김

진짜 존나 적당히 그 두 컨셉을 섞은 응용문제야... 너무 이뻐...

근데 애들은 존나 싫어할듯

내가 '허수아비' 드립만 쳐도 정색하던데ㅠ

 

여튼 대충 수열의 합공식 이용하니까 저런 규칙이 나와서

범위에 따라서 값이 바뀌니까 대충 부등식을 쓴 모습.

 

그리고 파이썬은 진짜 무적임 부등기호 두개를 한 식에 쓸 수 있다니 

이러다가 진짜 파이썬 중독돼서 '아마추어'그래머 될거같음

파이썬은 알고리즘 공부할때만 쓰는거로. 

 

라고 말하고 알고리즘 피해서 수학문제만 푸는 사람입니다. 

 

다음 골드는 꼭 알고리즘으로...

728x90
728x90
import math
n=int(input()) 

def star(k):
    a=int(k/3)
    if k==6: 
        return ['  *  ',' * * ','*****']
    arr=star(k//2) 
    stars=[]
    for i in arr: 
        
        stars.append(' '*(3*(2**((int(math.log2(a)))-2)))+i+' '*(3*(2**((int(math.log2(a)))-2)))) 
    for i in arr:
        stars.append(i+' '+i) 
  
    return stars 
        


print("\n".join(star(n*2)))

 

후 마지막에 저 수식을 어케짤까 하다가 도저히 로그 쓰는거 말고는 생각이 안나서 math를 import해버렸다...

더 효율적인지 아닌지는 모르겠지만 일단 돌아는 감.

 

2447번 코드에서 살짝 수정만 한것. 

 

일단 알고리즘은 평범한 재귀함수임. 

어떤 함수냐면 일단 기본 베이스가 되는 삼각형을 만들고, 그 삼각형으로 프랙탈마냥 계속 만들어내는거

근데 만드는 과정에서 좀 수학적인게 필요했음 (수1 수열에 해당하는 부분인듯)

 

코드는 뭐 12넣어보고 24넣어보고 그러다보면 이해 가능할거고

 

중간에 몇번 에러떴는데 이유:

 

1. 공백 수를 정하는 코드를 짜야하는데, 6은 1, 12는 2, 24는 3 이런식으로 매칭시키는게 필요했음. 

무지성으로 다 6으로 나눴다가 24나누기 6을 3이 아니라 4라는걸 깨달음. 어쩐지 공백이 12더라 ㅅ발

 

2. log를 쓸때는 차피 int만 들어간다는걸 알아도 컴퓨터는 모르기 때문에 int형으로 바꿔줘야함. (당연하지만 실수함)

 

 

728x90
728x90
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)

  elif abs(r1-r2)==distance or r1+r2==distance:
    print(1)
  
  elif abs(r1-r2) < distance < (r1+r2) :  
        print(2)
  else:
      print(0)
728x90
728x90
n=int(input()) #n 값 입력. 3^a꼴로 될 예정

def star(k):
    if k==3: #프렉탈의 가장 기본이 되는 사각형
        return ['***','* *','***']
    arr=star(k//3) #3이 아니라면 3으로 나눈 값을 star에 넣고 그걸 arr에 넣음.
    stars=[]
    for i in arr: #만약 n이 9라면, arr에는 *이 들어있는 배열이 들어있을 예정. 배열 크기는 3.
        stars.append(i*3) #n이 9라면 i는 k==3일때 리턴되는 값
    for i in arr:
        stars.append(i+' '*(k//3)+i) #공백은 k//3크기만큼
    for i in arr:
        stars.append(i*3)
    return stars #배열임
        


print("\n".join(star(n)))

 

728x90
728x90
import sys

n=int(sys.stdin.readline())
ex=list(map(int, sys.stdin.readline().split()))
num=0;
have=0;
ans =[0 for i in range(n)]

for j in range(0,n):
  if(j==0):
    ans[j]=0

  else:
    for k in range(j-1,0,-1):
      if(ex[j]-ex[k]<=0):
        ans[j]=k+1
        have=1
        break
    if(have==0):
      ans[j]=0

print(*ans)

 

728x90

'언어는 과-학인가요? > python 파이썬' 카테고리의 다른 글

백준 1072 파이썬 - 게임  (0) 2022.07.27
백준 골드 (2447번) 파이썬 - 별찍기  (0) 2022.07.27
백준 2108  (0) 2022.07.26
백준 골드 (2981번) 파이썬  (0) 2022.07.26
백준 1단계 문제풀이  (0) 2022.07.04
728x90

어이없어서 올림. 

pypy3으론 잘돌아감.

python3 쓰면 시간초과남. 

 

from collections import Counter

N=int(input())
list=[]
ave=0
for i in range(N):
  list.append(int(input()))

list.sort()

for i in range(N):
  ave+=list[i]

print(round(ave/N))
mid=int((N-1)/2)
print(list[mid])

cnt_li = Counter(list).most_common()
if len(cnt_li) > 1 and cnt_li[0][1]==cnt_li[1][1]: #최빈값 2개 이상
    print(cnt_li[1][0])
else:
    print(cnt_li[0][0])


dif=max(list)-min(list)
print(dif)

 

시간초과 해결하려면 

 

input() 대신에 sys import 한다음에 int(sys.stdin.readline())쓰면 됨 

728x90
728x90

N = input()
list = []
M=[]
check=0
for x in range(int(N)):
  inp=int(input())
  list.append(inp)

for x in range(2,int(min(list))+1):
  for y in range(int(N)):
    ms=list[y]%(x)
    M.append(ms)
    a=M[0]
    b=M[y]
    if(a!=b):
      check=1
      break
      
  if(check!=1):
    print(x)

  M=[]
  check=0

 

(일단은 돌아가는 코든데 쓴게 아까워서 올리는 오답)

 

이건 오답이다. 

사실 이거 돌려봐도 답은 제대로 나온다. 

근데 왜 오답이냐고?

 

만약 이게 정답이였다면 문제가 골드일 리가 없겠지. 

시간초과가 뜬다. 

 

이유는 다음과 같다:

N이 1,000,000,000 보다 작거나 같은 수 이기에 일일히 나머지를 찾는 방식을 쓰면 컴퓨터가 좆된다ㅋㅋㅋㅋㅋㅋ

문제를 제대로 안읽은걸 반성하자. 

시발.

 


그래서 쓴 방법은 수학을 사용하는것이다. 

한국수학 수학 상에 나오는 내용을 그대로 사용해서 연립방정식을 풀면 답이 나온다 (이건 내 과외 말버릇)

마침 내 학생중 하나가 수학 상을 하니 이걸 숙제로 내줄까도 생각중임 

 

이렇게 연립방정식을 만들어서 나머지 R을 없애주고 M에 대한 식을 만듧

 

import math
N = int(input())
s = []
M = []
gcd = 0 #greatest commend divisor (최대공약수)
for i in range(N):
    s.append(int(input()))
    if i == 1:
        gcd = abs(s[1] - s[0])
    gcd = math.gcd(abs(s[i] - s[i - 1]), gcd)
gcd_last = int(gcd ** 0.5) #너무 많이 돌리면 시간초과뜸
for i in range(2, gcd_last + 1):
    if gcd % i == 0: #최대공약수가 어떤 수로 나눠졌을때 나머지가 0이 되면 그 어떤 수는 최대공약수의 약수가 된다 (즉 약수찾는 반복문임)
        M.append(i) 
        M.append(gcd // i) #최대공약수를 반갈죽해서 넣어주는거랑 동시에 하면 연산이 줄어듦 (gcd ** 0.5 최대공약수의 루트만큼만 계산하기 때문) 시간초과 방지
M.append(gcd) #당연히 최대공약수도 넣어줘야지
M = list(set(M)) #중복제거
M.sort() #정리함
for i in M:
    print(i, end = ' ')

 

자세한 설명은 생략한다. (위에 이미 다 주석으로 설명되있음)

728x90

'언어는 과-학인가요? > python 파이썬' 카테고리의 다른 글

백준 1072 파이썬 - 게임  (0) 2022.07.27
백준 골드 (2447번) 파이썬 - 별찍기  (0) 2022.07.27
백준 골드 (2493번) 파이썬  (0) 2022.07.27
백준 2108  (0) 2022.07.26
백준 1단계 문제풀이  (0) 2022.07.04
728x90

2557

print('Hello World!')

 

10718

print('강한친구 대한육군\n강한친구 대한육군')

 

10171

print('\\    /\\\n )  ( \')\n(  /  )\n \\(__)|')

역슬래쉬 (\) 와 따음표 (",') 앞에는 \를 붙여줍니다.

 

10172

print('|\\_/|\n|q p|   /}\n( 0 )\"\"\"\\\n|\"^\"`    |\n||_/=\\\\__|')

10171과 동일

 

1000

A,B=input().split()
print(int(A)+int(B))

.split()으로 A 와 B에 input 값을 나누어 넣는다

A와 B를 int형으로 바꿔 프린트한다

 

1001

A,B=input().split()
print(int(A)-int(B))

1000번과 동일 

int 형으로 바꾼 두 input값 사이에 부호만 바꿈.

 

10998

A,B=input().split()
print(int(A)*int(B))

1000번과 동일

 

1008

A,B=input().split()
print(int(A)/int(B))

1000번과 동일

 

10869

A,B=input().split()
print(int(A)+int(B))
print(int(A)-int(B))
print(int(A)*int(B))
print(int(int(A)/int(B)))
print(int(A)%int(B))

나누기 할때는 나누면 정수로 안나오는 경우도 있기에 int를 다시한번 더 붙여주는

 

10926

A=input()
print(A+'??!')

input형태를 안알려줘도 알아서 되는 갓이썬

 

18108

A=input()
print(int(A)-543)

꼭 형태를 int로 바꿔줍시다

 

10430

A,B,C=input().split()
A=int(A)
B=int(B)
C=int(C)
print((A+B)%C)
print(((A%C) + (B%C))%C)
print((A*B)%C)
print(((A%C)*(B%C))%C)

A, B, C를 인트로~

 

2588

A = int(input())
B = input()
for i in range(3, 0, -1) :
    print(A * int(B[i - 1]))
print(A * int(B))

A 는 정수니까 int형으로 받고, B는 그냥 문자열로 저장해 준다. 

문자열 (배열)은 이제 for반복문 안에 들어가서 2번째 배열부터 0번째 배열까지 순서대로 뽑힌다

그리고 마지막에 그냥 AB값 곱해준거 하면 끝

 

25083

print('         ,r\'\"7\nr`-_   ,\'  ,/\n \\. \". L_r\'\n   `~\\/\n      |\n      |')

10171과 동일

728x90

+ Recent posts