import sys
import math
w, h, count_x, count_y = [int(i) for i in input().split()]
x = ['']*(count_x)
y = ['']*(count_y)
# x축, y축을 나누는 숫자 입력
tmp = 0
for i in input().split():
x[tmp] = int(i)
tmp +=1
tmp = 0
for i in input().split():
y[tmp] = int(i)
tmp = tmp+1
# x와 y리스트를 각각 set으로 변환 후 list로 재변환해서 중복되는 데이터를 제거한다.
x = list(set(x))
x.sort()
y = list(set(y))
y.sort()
count =0 # 정사각형의 개수 0으로 초기화.
# 리스트 x와 y의 길이 미리 계산하여 저장해둔다.
lx = len(x)
ly = len(y)
dpx = [int(0)]*(w+1)
dpy = [int(0)]*(h+1)
for x_s in range(lx):
for x_inc in range(x_s, lx+1):
if x_inc==x_s: # 건너뛰는 간격이 0이면 본인.
dpx[ x[x_s] ] +=1
elif x_inc==lx:
dpx[ w-x[x_s] ] +=1 # 제일 끝으로 가면 전체 길이에서 본인 뺀다.
else: # 건너뛰는 간격 크기만큼 간 후 본인과 뺀다.
dpx[x[x_inc]-x[x_s]] +=1
dpx[w] = 1
for y_s in range(ly):
for y_inc in range(y_s, ly+1):
if y_inc==y_s:
dpy[ y[y_s] ] +=1
elif y_inc==ly:
dpy[ h-y[y_s] ] +=1
else:
dpy[ y[y_inc]-y[y_s] ] +=1
dpy[h] = 1
#print(dpx)
#print(dpy)
for i in range(w+1):
for j in range(h+1):
if dpx[i]==0 or dpy[j]==0:
continue
if i==j:
#print(i, j, dpx[i], dpx[j], dpx[i]*dpy[j])
count += dpx[i]*dpy[j]
print(count)
import sys
import math
w, h, count_x, count_y = [int(i) for i in input().split()]
x = ['']*(count_x)
y = ['']*(count_y)
# x축, y축을 나누는 숫자 입력
tmp = 0
for i in input().split():
x[tmp] = int(i)
tmp +=1
tmp = 0
for i in input().split():
y[tmp] = int(i)
tmp = tmp+1
# x와 y리스트를 각각 set으로 변환 후 list로 재변환해서 중복되는 데이터를 제거한다.
x = list(set(x))
x.sort()
y = list(set(y))
y.sort()
count =0 # 정사각형의 개수 0으로 초기화.
x_diff=0
y_diff=0
# 리스트 x와 y의 길이 미리 계산하여 저장해둔다.
lx = len(x)
ly = len(y)
for x_s in range(lx+1):
for y_s in range(ly+1):
for x_inc in range(lx-x_s+1):
if x_inc==0 and x_s!=lx: # 건너뛰는 간격이 0이면 본인.
x_diff = x[x_s]
elif x_inc==lx-x_s and x_s==lx:
x_diff = w
elif x_inc==lx-x_s:
x_diff = w-x[x_s] # 제일 끝으로 가면 전체 길이에서 본인 뺀다.
else: # 건너뛰는 간격 크기만큼 간 후 본인과 뺀다.
x_diff = x[x_s+x_inc]-x[x_s]
for y_inc in range(ly-y_s+1):
if y_inc==0 and y_s!=ly:
y_diff = y[y_s]
elif y_inc==ly-y_s and y_s==ly:
y_diff = h
elif y_inc==ly-y_s:
y_diff = h-y[y_s]
else:
y_diff = y[y_s+y_inc]-y[y_s]
#print("x_s: "+str(x_s)+" x_inc: "+str(x_inc)+" y_s: "+ str(y_s)+" y_inc: "+str(y_inc))
#print(str(x_diff)+" "+str(y_diff), end="\n")
# 두 간격이 같고, 0이 아니면 count 추가.
if x_diff==y_diff and x_diff!=0:
count = count+1
print(count)
첫 번째 코드는 hi-density는 물론, low-density case를 통과하지 못한다.
두 번째 코드는 hi-density만 통과하지 못한다...
이미 계산한 정보는 저장하래서 저장했는데 뭐가 문제일까?
import sys
import math
w, h, count_x, count_y = [int(i) for i in input().split()]
x = ['']*(count_x)
y = ['']*(count_y)
# x축, y축을 나누는 숫자 입력
tmp = 0
for i in input().split():
x[tmp] = int(i)
tmp +=1
tmp = 0
for i in input().split():
y[tmp] = int(i)
tmp = tmp+1
# x와 y리스트를 각각 set으로 변환 후 list로 재변환해서 중복되는 데이터를 제거한다.
x = list(set(x))
x.sort()
y = list(set(y))
y.sort()
count =0 # 정사각형의 개수 0으로 초기화.
x_diff=0
y_diff=0
# 리스트 x와 y의 길이 미리 계산하여 저장해둔다.
lx = len(x)
ly = len(y)
dpx = []
dpy = []
for x_s in range(lx):
for x_inc in range(x_s, lx+1):
if x_inc==x_s: # 건너뛰는 간격이 0이면 본인.
dpx.append(x[x_s])
elif x_inc==lx:
dpx.append(w-x[x_s]) # 제일 끝으로 가면 전체 길이에서 본인 뺀다.
else: # 건너뛰는 간격 크기만큼 간 후 본인과 뺀다.
dpx.append(x[x_inc]-x[x_s])
dpx.append(w)
for y_s in range(ly):
for y_inc in range(y_s, ly+1):
if y_inc==y_s:
dpy.append(y[y_s])
elif y_inc==ly:
dpy.append(h-y[y_s])
else:
dpy.append(y[y_inc]-y[y_s])
dpy.append(h)
# dpx와 dpy를 정렬한다.
dpx.sort()
dpy.sort()
for i in range(len(dpx)):
for j in range(len(dpy)):
if dpx[i]==dpy[j]:
count = count+1
print(count)
부분 선분의 길이를 인덱스로 하는 배열에 부분 선분이 몇 개 등장하는지 저장하여 나중에 x기준, y기준으로 같은 길이의 선분이 있으면 배열의 값만 곱해서 더해주면 되는 코드이다.
이 코드는 hi-density만 통과하지 못한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import sys
import math
w, h, count_x, count_y = [int(i) for i in input().split()]
x = []
y = []
# x축, y축을 나누는 숫자 입력
for i in input().split():
x.append(int(i))
for i in input().split():
y.append(int(i))
# x와 y의 부분 선분 리스트에 시작점 0과 끝점 w/h를 추가한다.
x.append(0)
x.append(w)
y.append(0)
y.append(h)
# x와 y리스트를 각각 set으로 변환 후 list로 재변환해서 중복되는 데이터를 제거한다.
lat = input() 형식으로 입력받으면 43,50982가 스트링 형식으로 입력된다. 43.50982의 실수 형태로 변환해가며 입력받기 위해서는 lat = float(input().replace(",", "."))으로 입력받아야한다. 위의 문제에서 사용하기 위해서는 라디안으로 변환해야하므로 lat = math.radians(lat)으로 변환해준다.
내가 사용했던
lat = input().split(",")
lat = lat[0]+"."+lat[1]
lat = float(lat)
위의 코드에 비하면 아주 간단하게 변환할 수 있다!
+) 파이썬에서 cos 함수와 sqrt함수는 math.cos(), math.sqrt()로 사용한다.