백준 기하

2024. 12. 7. 13:48Algorithms/백준알고리즘 연습

27323번 직사각형 넓이 구하기 

초기 코드

a,b = map(int,input().split())
print(a*b)

 

value error 가 뜬다 

a = int(input())
b = int(input())
print(a*b)

너무 자동적으로 인풋을 잘못받아옴 

 

1085 직사각형에서 탈출

 

초기 코드 - 주피터로 돌리면 답이 나오나, 백준에서는 틀렸다고 함

x,y,w,h = map(int,input().split())
if w-x > h-y:
    print(h-y)
else :
    print(w-x)

왜지 ?

다른건 맞는데

예제 입력 4 복사

161 181 762 375

예제 출력 4 복사

161

 

얘가 안나옴

다른분 답안

x,y,w,h=map(int,input().split())
print(min(x,y,w-x,h-y))
  • 직사각형의 경계선만 닿으면 되기때문에 직사각형의 영역인 (0,0)~(w,h) 영역안에서 고려하면 된다.
  • 직사각형의 영역안에서 x,y,w-x,h-y를 중 최소값을 구해주면 된다

왔던 161을 다시 갈 수도 있음

 

3009번 네번째 점

네 번째 점 다국어

한국어   
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 128 MB 65083 47286 42363 73.451%

문제

세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.

입력

세 점의 좌표가 한 줄에 하나씩 주어진다. 좌표는 1보다 크거나 같고, 1000보다 작거나 같은 정수이다.

출력

직사각형의 네 번째 점의 좌표를 출력한다.

예제 입력 1 복사

5 5
5 7
7 5

예제 출력 1 복사

7 7

예제 입력 2 복사

30 20
10 10
10 20

예제 출력 2 복사

30 10
찾은 로직
x 에는 두번이상 나오지 않은 수, y 도 똑같이 그렇게 찾으면 됨 
그러면 x,y에 3번씩 주어지는 값을 x, y 리스트로 넣고 1번만 나온 숫자를 print로 반환
루프를 돌려서 해당 숫자를 count 할 수 있음
3번의 인풋을 따로 어떻게 저장하지? 

 

초기 코드 

x_list = []
y_list = []
for _ in range(3):
    x, y = map(int, input().split())
    x_list.append(x)
    y_list.append(y)

if x_list.count(x_list[0]) == 2:
    newx_List  = [x for x in x_list if x != x_list[0]]
else : 
    newx_List =[x for x in x_list if x == x_list[0]]
if y_list.count(y_list[0]== 2:
    newy_List  = [y for y in y_list if x != y_list[0]]
else : 
    newy_List =[y for y in y_list if x == y_list[0]]
 print(newx_List[0], newy_List[0])

카운트가 2번 나오면, 그 숫자가 아닌 다른 숫자를 newx_List에 저장하고 뽑는 방법 

gpt 가 고쳐준 코드 

x_list = []
y_list = []

# Input the points
for _ in range(3):
    x, y = map(int, input().split())
    x_list.append(x)
    y_list.append(y)

# Find the unique x value
if x_list.count(x_list[0]) == 1:
    unique_x = x_list[0]
else:
    unique_x = [x for x in x_list if x_list.count(x) == 1][0]

# Find the unique y value
if y_list.count(y_list[0]) == 1:
    unique_y = y_list[0]
else:
    unique_y = [y for y in y_list if y_list.count(y) == 1][0]

# Print the unique point
print(unique_x, unique_y)

 

반복분으로 더 짧게 작성한 다른 코드

int[] answer = new int[2];
for(int i=0;i<answer.length;i++){
     if(v[0][i]==v[1][i]){
        answer[i] = v[2][i];
    }else if(v[0][i]==v[2][i]){
        answer[i] = v[1][i];
    }else if(v[1][i]==v[2][i]){
        answer[i] = v[0][i];
    }
}
 
return answer;

 

 

비트연산자를 이용해 최단시간으로 푸는분

https://m.blog.naver.com/PostView.nhn?blogId=bsos1202&logNo=221090473029&proxyReferer=https:%2F%2Fwww.google.com%2F

answer[0] = v[0][0]^v[1][0]^v[2][0];
answer[1] = v[0][1]^v[1][1]^v[2][1];
 
return answer;

XOR 연산을 활용함

 

XOR연산은 두 수가 같으면 같은 값을, 다르면 다른값을 반환

 A A ^ B
0

 

 

9063번

대지

 

로직 : x max - x min * y max - y min 해주어야 함 

좌표가 negative도 나온다고 해서 absolute로 바꾸어서 풀어주려고 한건데 

시간복잡도가 문제인지 시간초과되어서 종료됨 

n = int(input())
x_list = []
y_list =[]

for _ in range(n):
    x, y = map(int, input().split())
    x_list.append(x)
    x_list = [abs(x) for x in x_list]
    y_list.append(y)
    y_list = [abs(x) for y in y_list]

print((max(x_list)-min(x_list))*(max(y_list)-min(y_list)))

list로 하나씩 빼오는 것은 데이터 숫자가 많을때는 시간 복잡도를 증가시킴 

 

perplexity 가 optimize 해준 코드

n = int(input())
x_min, x_max = float('inf'), float('-inf')
y_min, y_max = float('inf'), float('-inf')

for _ in range(n):
    x, y = map(int, input().split())
    
    x_min = min(x_min, x)
    x_max = max(x_max, x)
    y_min = min(y_min, y)
    y_max = max(y_max, y)

area = (x_max - x_min) * (y_max - y_min)
print(area)

이 코드에서는 x,y 값중에 min max 만 데려옴 

The role of these two lines:
python
x_min, x_max = float('inf'), float('-inf')
y_min, y_max = float('inf'), float('-inf')
These lines initialize the variables that will track the minimum and maximum x and y coordinates:
  • float('inf') represents positive infinity. It's used for x_min and y_min so that any real number will be smaller than this initial value.
  • float('-inf') represents negative infinity. It's used for x_max and y_max so that any real number will be larger than this initial value.
This initialization allows the subsequent min() and max() operations to correctly update these values with the first input and all following inputs, regardless of whether the coordinates are positive or negative.This approach eliminates the need for separate lists and allows the algorithm to find the bounding rectangle in a single pass through the input data, improving both time and space efficiency.
 
 
 
10101번

삼각형 외우기 다국어

한국어   
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 256 MB 49943 27043 24844 56.749%

문제

창영이는 삼각형의 종류를 잘 구분하지 못한다. 따라서 프로그램을 이용해 이를 외우려고 한다.

삼각형의 세 각을 입력받은 다음,

  • 세 각의 크기가 모두 60이면, Equilateral
  • 세 각의 합이 180이고, 두 각이 같은 경우에는 Isosceles
  • 세 각의 합이 180이고, 같은 각이 없는 경우에는 Scalene
  • 세 각의 합이 180이 아닌 경우에는 Error

를 출력하는 프로그램을 작성하시오.

입력

총 3개의 줄에 걸쳐 삼각형의 각의 크기가 주어진다. 모든 정수는 0보다 크고, 180보다 작다.

출력

문제의 설명에 따라 Equilateral, Isosceles, Scalene, Error 중 하나를 출력한다.

예제 입력 1 복사

60
70
50

예제 출력 1 복사

Scalene​
 
 

초기 코드

a = int(input())
b = int(input())
c = int(input())
a_list = []
a_list = a_list[a,b,c]  
for i in a_lists:
    if sum(a_list) == 180 : 
        if  count[i] > 2 :
            print('Equilateral')
        elif count[i] == 2 :
            print('Isosceles')
        elif count[i]==1 :
            print('Scalene')
    else :
        print('Error')

 

perplexity 가 잡아준 코드 

 

5073번

삼각형과 세 변 다국어

한국어   
초기 코드
for i in range(5):
    a,b,c = map(int,input().split())
    while a !=0:
        if a == b and b == c:
            print('Equilateral')
        elif a == b and b !=c :
            print('Isosceles')
        elif a !=b and b == c:
            print('Isosceles')
        elif a == c and b != c:
            print('Isosceles')
        elif a != c and b != c and a !=b:
            print('Scalene')
        else :
            print('Invalid')
    break
항상 5개가 주어지는 것이 아니기 때문에 저렇게 돌리기보다는 while 문을 써서 돌리는것이 맞음 
 
 
수정 코드
while에 break 가 되는 코드를 앞에 넣어도 괜찮음
그리고 리스트를 구지 안만들어도 됨 (더 복잡해짐) 
while True:
    a, b, c = map(int, input().split())
    
    if a == 0 and b == 0 and c == 0:
        break  # Exit the loop if all sides are 0
    
    if max(a, b, c) >= a + b + c - max(a, b, c):
        print('Invalid')
    elif a == b == c:
        print('Equilateral')
    elif (a == b and b != c) or (b == c and c != a) or (a == c and c != b):
        print('Isosceles')
    else:
        print('Scalene')

 

'Algorithms > 백준알고리즘 연습' 카테고리의 다른 글

백준 부루트 포스 (복습 필요)  (2) 2024.12.09
백준 시간복잡도  (0) 2024.12.07
백준  (1) 2024.12.05
백준 알고리즘 연습 : 약수, 배수와 소수  (0) 2024.12.04
백준 일반 수학 1  (0) 2024.12.04