본문 바로가기

기타/백준

10. 기하: 직사각형과 삼각형

https://www.acmicpc.net/step/50

 

기하: 직사각형과 삼각형 단계

기하: 직사각형과 삼각형

www.acmicpc.net

 

8문제


백준 / 27323번

문제

정수 A, B 가 주어진다. 세로 길이가 A cm, 가로 길이가 B cm 인 아래와 같은 직사각형의 넓이를 cm2 단위로 구하시오.

입력

표준 입력에 다음과 같은 형태로 입력이 주어진다.

A
B

 

출력

세로 길이가 A cm, 가로 길이가 B cm인 직사각형의 넓이를 cm2 단위로 구하고, 단위 (cm2)를 생략하여 출력한다.

 

풀이

-Python3

A = int(input())
B = int(input())

print(A*B)

세로가 A, 가로가 B인 직사각형의 넓이는 A*B이다.


백준 / 1085번

문제

한수는 지금 (x, y)에 있다. 직사각형은 각 변이 좌표축에 평행하고, 왼쪽 아래 꼭짓점은 (0, 0), 오른쪽 위 꼭짓점은 (w, h)에 있다. 직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 x, y, w, h가 주어진다.

 

출력

첫째 줄에 문제의 정답을 출력한다.

 

풀이

한수가 직사각형의 모서리에 가는 최단거리는 x, y, w-x, h-y 중 하나이다.

각 조건을 세우면 풀릴 문제... 일 수도 있겠지만!!

생각해보면 결과는 x, y, w-x, h-y 중 하나인데 그 중에서 가장 작은 값을 뽑으면 되는 거 아닌가?

 

 

 

-Python3

x, y, w, h = map(int, input().split())
print(min(x,y,w-x,h-y))

한수의 거리를 구해야하므로 w, h에서 각각 x와 y를 빼줘야 하는 점을 주의

근데 min 함수에 저런 식으로 변수 여러 개 줘서 계산할 수 있는지 처음 알았다


백준 / 3009번

문제

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

 

입력

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

 

출력

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

 

풀이

요런 느낌? 쌍이 4개 주어지는데 직사각형이면 어쨌든 똑같은 값 쌍이 4개 나올 거라서

쌍이 안 나온 x, y를 출력하면 되는 문제

리스트에 x랑 y값을 저장해두고 count가 1인 애들을 출력하면 될 것 같음

 

-Python3

xlist = []
ylist = []

#입력값을 xlist와 ylist에 저장
for _ in range(3) :
    x, y = map(int, input().split())
    xlist.append(x)
    ylist.append(y)
    
#count가 1개인 x, y값을 x4, y4로 저장
for i in range(3) :
    if xlist.count(xlist[i]) == 1 :
        x4 = xlist[i]
    if ylist.count(ylist[i]) == 1 :
        y4 = ylist[i]

#x4, y4 출력
print(x4, y4)

값이 1개인 걸 어떻게 구하지?

-> list로 저장하고 count로 센다. 

는 로직만 기억하면 될 


백준 / 15894번

문제

"한 변의 길이가 1인 정사각형을 아래 그림과 같이 겹치지 않게 빈틈없이 계속 붙여 나간다. 가장 아랫부분의 정사각형이 n개가 되었을 때, 실선으로 이루어진 도형의 둘레의 길이를 구하시오."

가장 아랫부분의 정사각형 개수가 주어지면 그에 해당하는 답을 출력하는 프로그램을 만들어 형석이를 도와주자!

(성원이 제정신 아닌 것 같다...)

 

입력

첫 번째 줄에 가장 아랫부분의 정사각형 개수 n이 주어진다. (1 ≤ n ≤ 109)

 

출력

첫 번째 줄에 형석이가 말해야 하는 답을 출력한다.

 

풀이

1 -> 4

2 -> 8

3 -> 12

이 패턴에서 입력값이 n이면 둘레는 4n일 거라고 예측.

 

-Python3

x = int(input())
print(x * 4)

수학을 잘하는 편이 아니라서.. ? 설명은 못하겠음


백준 / 9063번

문제

임씨는 즉시 민사소송을 통해 자신의 땅을 찾고자 했고 논리적인 근거를 들어 옥구슬이 나오는 지점이 원래 자신의 땅의 한 지점이었다는 것을 주장하여 결국 담당판사를 설득하는 데에 성공하였다. 담당판사는 다음과 같은 판결을 내렸다. “ 6.25 이전의 개인소유 대지들은 99%가 남북, 동서 방향으로 평행한 직사각형 모양이었으므로, 임씨의 이름이 새겨진 옥구슬이 나오는 모든 지점을 포함하는 가장 작은 남북, 동서 방향으로 평행한 변을 갖는 직사각형의 대지를 임씨의 소유로 인정한다.” 임씨는 많은 손해를 보는 셈이지만 더 이상을 요구할 만한 근거가 없었기 때문에 이 판결을 따르기로 했다.

임씨의 이름이 새겨진 옥구슬의 위치 N 개가 주어질 때에, 임씨에게 돌아갈 대지의 넓이를 계산하는 프로그램을 작성하시오. 단, 옥구슬의 위치는 2 차원 정수 좌표로 주어지고 옥구슬은 같은 위치에 여러 개가 발견될 수도 있으며, x 축의 양의방향을 동쪽, y 축의 양의방향을 북쪽이라고 가정한다. 

예를 들어 위와 같이 (2, 1), (3, 2), (5, 2), (3, 4) 네 점에서 옥구슬을 발견하였다면, 임씨에게 돌아갈 대지는 (2, 1), (5, 1), (2, 4), (5, 4)를 네 꼭짓점으로 하는 직사각형이며, 넓이는 (5 - 2) × (4 - 1) = 9 가 된다. 

 

입력

첫째 줄에는 점의 개수 N (1 ≤ N ≤ 100,000) 이 주어진다. 이어지는 N 줄에는 각 점의 좌표가 두 개의 정수로 한 줄에 하나씩 주어진다. 각각의 좌표는 -10,000 이상 10,000 이하의 정수이다. 

 

출력

첫째 줄에 N 개의 점을 둘러싸는 최소 크기의 직사각형의 넓이를 출력하시오. 

 

풀이

-Python3

N = int(input())
xlist = []
ylist = []

#입력값을 xlist와 ylist에 저장
for i in range(N) :
    x, y = map(int, input().split())
    xlist.append(x)
    ylist.append(y)
    
#최대 x, 최소 x, 최대 y, 최소 y를 구해 직사각형의 넓이를 계산
print((max(xlist)-min(xlist)) * (max(ylist)-min(ylist)))

결국 점이 몇 개라도 가장 작은 x,y를 가진 게 왼쪽 아래 점일 거고 가장 큰 x,y를 가진 게 오른쪽 위 점일 거다. 

xlist와 ylist를 만들어서 최소x,y와 최대x,y를 계산해 넓이를 구해주면 된다.


백준 / 10101번

문제

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

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

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

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

 

입력

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

 

출력

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

 

풀이

-Python3

#세 각 입력받기
a = int(input())
b = int(input())
c = int(input())

if (a+b+c)==180 : 
    if a==b==c==60 :
        print("Equilateral")
    elif a==b or b==c or a==c :
        print("Isosceles")
    else :
        print("Scalene")
else :
    print("Error")

그냥 조건대로 if문 달기


백준 / 5073번

문제

삼각형의 세 변의 길이가 주어질 때 변의 길이에 따라 다음과 같이 정의한다.

  • Equilateral :  세 변의 길이가 모두 같은 경우
  • Isosceles : 두 변의 길이만 같은 경우
  • Scalene : 세 변의 길이가 모두 다른 경우

단 주어진 세 변의 길이가 삼각형의 조건을 만족하지 못하는 경우에는 "Invalid" 를 출력한다. 예를 들어 6, 3, 2가 이 경우에 해당한다. 가장 긴 변의 길이보다 나머지 두 변의 길이의 합이 길지 않으면 삼각형의 조건을 만족하지 못한다.

세 변의 길이가 주어질 때 위 정의에 따른 결과를 출력하시오.

 

입력

각 줄에는 1,000을 넘지 않는 양의 정수 3개가 입력된다. 마지막 줄은 0 0 0이며 이 줄은 계산하지 않는다.

 

출력

각 입력에 맞는 결과 (Equilateral, Isosceles, Scalene, Invalid) 를 출력하시오.

 

풀이

-Python3

#계속 반복
while True :
    #a, b, c 세 변의 입력 받기
    a, b, c = map(int, input().split())

    #0 0 0이 들어오면 종료
    if a==b==c==0 :
        break

    #아니면 프로그램 진행
    if max(a,b,c) < sum((a,b,c))-max(a,b,c) : 
        if a==b==c :
            print("Equilateral")
        elif a==b or b==c or a==c :
            print("Isosceles")
        else :
            print("Scalene")
    else :
        print("Invalid")

계속 입력 받고 특정키가 들어오면 그만하기 <- 이건 항상 나오는데 항상 헷갈리는 듯

 

그리고 삼각형의 조건 만족시키기.. 가장 큰 변은 max(a,b,c)로 하면 되는데 나머지 두 개를 어떻게 하지? 리스트로 받았어야 했나? 하고 고민했는데 sum-max 하면 나머지 두 개의 합이었다. 계산 문제는 헷갈릴 때 변수를 수식으로 쓰면 도움이 되는듯


백준 / 14215번

문제

영선이는 길이가 a, b, c인 세 막대를 가지고 있고, 각 막대의 길이를 마음대로 줄일 수 있다.

영선이는 세 막대를 이용해서 아래 조건을 만족하는 삼각형을 만들려고 한다.

  • 각 막대의 길이는 양의 정수이다
  • 세 막대를 이용해서 넓이가 양수인 삼각형을 만들 수 있어야 한다.
  • 삼각형의 둘레를 최대로 해야 한다.

a, b, c가 주어졌을 때, 만들 수 있는 가장 큰 둘레를 구하는 프로그램을 작성하시오. 

 

입력

첫째 줄에 a, b, c (1 ≤ a, b, c ≤ 100)가 주어진다.

 

출력

첫째 줄에 만들 수 있는 가장 큰 삼각형의 둘레를 출력한다.

 

풀이

-Python3

a, b, c = map(int, input().split())

#조건을 충족하면 셋의 합 출력
if max(a,b,c) < sum((a,b,c))-max(a,b,c) :
    print(sum((a,b,c)))
#아니면 두 변의 길이 + (두 변의 길이-1) 출
else :
    print((sum((a, b, c)) - max(a, b, c)) + (sum((a, b, c)) - max(a, b, c) - 1))

삼각형의 조건 : 가장 큰 변의 길이가 나머지의 합보다 작아야 함

 

계산식이 복잡하면 두 변의 길이를 변수로 지정해주면 된다 (결과는 똑같음)

a, b, c = map(int, input().split())

#조건을 충족하면 셋의 합 출력
if max(a,b,c) < sum((a,b,c))-max(a,b,c) :
    print(sum((a,b,c)))
#아니면 두 변의 길이 + (두 변의 길이-1) 출
else :
    two_sides = sum((a, b, c)) - max(a, b, c)
    print(two_sides + (two_sides - 1))

'기타 > 백준' 카테고리의 다른 글

11. 시간 복잡도  (2) 2023.11.24
9. 약수, 배수와 소수  (0) 2023.10.09
8. 일반 수학 1단계 (2)  (0) 2023.10.09
8. 일반 수학 1 (1)  (0) 2023.08.29
7. 2차원 배열(2)  (0) 2023.08.07