# 1) 3차원 공간에서 임의의 점 3개를 생성한다. 생성된 좌표들로 삼각형을 만들 수 있는지 판별하시오.
# 1-1) numpy의 random을 사용하여 3차원 공간에서 [-100, 100] 사이의 임의의 정수를 추출해 3좌표 a, b, c를 만드시오. [1]
# 1-2) 위 추출된 3좌표로 삼각형을 만들 수 있는 지 확인하시오. [7]
#    불가능할 시 가능할 때까지 좌표를 랜덤하게 추출하시오.
#    이 후, 삼각형이 완성가능한 좌표를 생성할 때 출력하시오.
# Hint) 3좌표 중 임의의 2점을 이어 선분을 벡터로 a,b로 만들었을 때, a = kb꼴로 나타나진다면, 삼각형을
#      이룰 수 없음. (단, k는 임의의 실수)
#      a-b, a-c를 계산한 후, x좌표, y좌표, z좌표가 모두 임의의 실수 k배로 꼴로 표현되는지 확인해보세요!
      
# 1-1
def generate_3dots() :
  i = np.array((np.random.randint(-100, 101), np.random.randint(-100, 101), np.random.randint(-100, 101))) # 정수 범위 : [-100, 100]
  j = np.array((np.random.randint(-100, 101), np.random.randint(-100, 101), np.random.randint(-100, 101)))
  k = np.array((np.random.randint(-100, 101), np.random.randint(-100, 101), np.random.randint(-100, 101)))
  return i, j, k

a, b, c = generate_3dots()

# 1-2
v1 = a - b; v2 = a - c
v_check = v1 / v2

while (v_check[0] == v_check[1] and v_check[1] == v_check[2]) == True :
  a, b, c = generate_3dots()
  v1 = a - b; v2 = a - c
  v_check = v1 / v2

print(a[:], b[:], c[:])

# 2) 행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 된다.
#   최대 10X10 크기인 두 개의 행렬을 랜덤으로 만들고, 그 두개의 행렬 덧셈의 결과를 반환하는 함수,
#   solution을 완성하시오.
# 2-1) 최대 크기가 10X10인 두 행렬을 랜덤으로 생성하시오. [2]
# 2-2) 두 행렬의 덧셈을 하시오. [2]
# 2-3) 행렬의 덧셈 값을 출력하시오. [2]
# 2-4) 행렬의 크기를 출력하시오. [2]

# 2-1
m = np.random.randn(100).reshape((10,10))
n = np.random.randn(100).reshape((10,10))
# 2-2
x = m + n
# 2-3
print(x)
# 2-4
x.shape
# 모든 문제는 O, X 문제입니다.
# 1) numpy의 np.append()함수에서 axis를 설정하지 않았을 때, 두 배열의 차원이 일치하지 않아도 1차원 배열을 반환한다. [2]
# 2) np.sort() 함수를 사용하면 원본 배열이 직접 변경된다. [2]
# 3) np.reshape 함수를 사용하여 배열의 총 원소 수가 변할 수 있다. [2]
# 4) np.concatenate() 함수는 기본적으로 배열을 0축(행 방향)으로 병합한다. [2]
# 5) numpy 배열을 수평으로 병합하기 위해 np.hstack() 함수를 사용할 수 없다. [2]

1. O -> np.append() 디폴트값이 axis=None이고, 이는 차원과 상관없이 원소를 추가하여 1차원 배열을 return해줌 / numpy.append(arr, values, axis=None)
2. X -> 원본 변경 안됨 / np.sort()함수는 정렬된 배열을 return을 해주는데, return값이 있는 것은 대부분 원본이 변경이 안됨. 즉, return값이 없으면 원본이 변경되니 조심해야함
3. X -> reshape은 차원(형태) 변경에 주로 사용됨
4. O -> numpy.concatenate((a1, a2, ...), axis=0, out=None, dtype=None, casting="same_kind")
5. X -> 수평 병합 : hstack