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형으로 바꿔줘야함. (당연하지만 실수함)
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)
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)))
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)
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())쓰면 됨
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 = ' ')
이걸 다시 복습해보자. 일단 int, double, char을 제일 많이쓸거니까 heighlight 쳐놓을게
type
description
range
boolean
true or flase
true, false
byte
twos-complement integer
-128 to 127
char
Unicode character
ASCII value 0 to 255
short
twos-complement integer
-32768 to 32767
int
twos-complement integer
-2147483648 to 2147483647
long
twos-complement integer
-9223372036854755808 to 922337203685475587
float
IEEE 754 floating point
up to 7 decimal digits
double
IEEE 754 floating point
up to 16 decimal digits
Integer overflow
Number conversion
class Main {
public static void main(String[] args) {
int big;
byte small;
big = 10;
small = big;
System.out.println(big);
System.out.println(small);
}
}
이렇게 하면 compile error 남. 왜? big(int) 에 들어가있는 value가 small(byte)에 들어가려고하면 에러나지. C면 돌아가기라도 할텐데 자바는 바로 에러난다는걸 보여주는 예시.
+number conversion 예시:
3.75를 integer 로 바꾸면 3이 나온다. 이걸 다시 floatfh 바꾸면 3.0이 나온다. 즉 3.75를 int에 넣으면 3이되는거임. 0.75 순삭됨
Character type: Char
char c;
c='a';
Single quotation mark 으로 c 에 character를 넣으면 됨.
ASCII table 에서 character 0랑 integer 0 는 다르다.
보셈 character 0은 48에 있음.
Relational Operators
>,< 이런걸 뜻한다.
근데 여기 룰이 있는데,
Rule #1. The two inputs must be numbers, not necessarily of the same type.
Rule #2. If the two inputs are numbers with different types, the inferior one will be upgraded automatically.
relational operator를 사용한 코드:
class Main {
public static void main(String[] args) {
double UV_level = 12;
boolean UV_danger;
UV_danger = (UV_level > 10);
// warn the user
System.out.println("UV Danger: " + UV_danger);
}
}
자 이 코드를 분석하자면, UV_danger라는 이름을 가진 boolean 변수는 0또는 1이다. boolean 이니까.
그니까 UV_danger는 UV_level이 10보다 클시에 true 인 1, 크지 않을시에 false 인 0이 되는거다.
지금같은 케이스는 UV_level에 12이고, 10보다 크니까 true 인 1이 UV_danger에 들어갈것이당
이러한 operator가 있다.
== 랑 =는 다르다. =는 assignment operator고 ==는 equality operator다.
쉽게말하면 =는 걍 값 넣는거고 ==는 같다는뜻.
Boolean (or logical) operator
걍 true 냐 false냐 따지는 operator 말하는거다.
이처럼 !나 &&따위의 operator 를 말한다.
&&(and라는뜻) 는 걍
condition a && condition b 가 있다면,
a랑 b 둘다 true 일 시에 true가 나오는거고
두게중 하나라도 false거나 둘다 false면 걍 가차없이 false 나오는거지.
마치 하나라도 틀리면 0점주는 문제처럼
||(or라는뜻) 은 뭐냐면
condition a || condition b 이렇게 있으면
둘다 false 가 아닌이상 다 true로 나온다. or이니까 둘중에 하나라도 true가 있으면 true인거지.
Operator Precedence & Associativity
자 이런식으로! 뭐가 더 중요하냐 이거임. 지금 저기에선 10>=4+10&&4+6==10이 있으면, (10>=4+10)랑 (4+6==10)를 비교해서 둘다 true이냐를 따지는건데, 일단 첫번째 condition 인 10>=4+10 부터가 false니까 가차없이 false 나오는거지.