문제
삼각형의 세 변의 길이가 주어질 때 변의 길이에 따라 다음과 같이 정의한다.
- Equilateral : 세 변의 길이가 모두 같은 경우
- Isosceles : 두 변의 길이만 같은 경우
- Scalene : 세 변의 길이가 모두 다른 경우
단 주어진 세 변의 길이가 삼각형의 조건을 만족하지 못하는 경우에는 "Invalid" 를 출력한다. 예를 들어 6, 3, 2가 이 경우에 해당한다. 가장 긴 변의 길이보다 나머지 두 변의 길이의 합이 길지 않으면 삼각형의 조건을 만족하지 못한다.
세 변의 길이가 주어질 때 위 정의에 따른 결과를 출력하시오.
입력
각 줄에는 1,000을 넘지 않는 양의 정수 3개가 입력된다. 마지막 줄은 0 0 0이며 이 줄은 계산하지 않는다.
출력
각 입력에 맞는 결과 (Equilateral, Isosceles, Scalene, Invalid) 를 출력하시오.
문제 링크
https://www.acmicpc.net/problem/5073
풀이
풀이는 정말 간단하다.
세 변을 간단하게 비교만 해보면 된다.
이게 끝이다... 이렇게만 알고 코드만 보면 된다.
그러나 분기를 어떻게 짜냐에 따라 효율적으로 코드를 줄일 수 있다.
필자는 이 문제를 두 번 풀었는데, 처음엔 Swift로, 두번째는 C++로 풀었다.
각각 풀이가 약간 다르긴 하지만 얼추 비슷하다.
각각 장점이 달라 둘을 합치면 더 나은 코드가 될 거 같다.
Swift로 처음 풀었을 때
Swift로 처음 풀었을 때는 삼각형의 조건을 확인하기 위해 들어온 값들을 정렬했다.
작은 값 순서대로 `A`, `B`, `C`에 배치 했고, `C`가 가장 크니 `A`와 `B`를 더한 값보다 `C`가 크거나 같으면 삼각형 조건에 맞지 않는 것으로 간주했다.
그 이후에는 각 조건을 확인했다.
세 변이 같은 것, 세 변이 다른 것을 각각 검사하고, 만약 이 둘이 아니라면 두 변이 같은 것으로 간주하게 했다.
두 변이 같은 것은 코드로 두지 않고 위에서 체크되지 않았을 때 자동으로 출력하게 했는데, 이렇게 한 이유는 두 변이 같은 것을 코드로 검사하는게 가장 길다고 생각했기 때문이다.
C++로 다시 풀었을 때
C++로 풀었을 때는 조금 비효율적으로 풀었다.
대신 이번에는 정렬하는 코드는 뺐다.
삼각형의 조건을 확인하기 위해 정렬하는 코드 대신 셋 중 가장 큰 값을 찾는 코드를 넣었다.
셋 중 가장 큰 값을 알기만 하면, 셋을 다 더한 후 가장 큰 값을 빼면 나머지 둘의 합을 구할 수 있기 때문이다.
그러면 나머지 둘의 합과 셋 중 가장 큰 값을 비교함으로써 삼각형의 조건을 확인할 수 있다.
그 이후에는 각 조건을 확인했는데, Swift로 풀었을 때 보다 조금 더 비효율적으로 작성했다.
`else if`를 사용해서 분기를 넘겨주면 되는데 다 `if`문으로만 작성해서 `continue`를 넣어야했다.
또한 두변이 같은 조건을 마지막으로 빼면 더 나았을 텐데, 세 변의 길이가 모두 다른 것을 마지막으로 빼서 조건문 길이가 더 길어졌다.
심지어 이것도 앞에서 조건이 이미 확인된걸 또 검사해서 비효율적으로 코드가 작성됐다...
Swift 코드
while true {
let ABC = readLine()!.split(separator: " ").map { Int(String($0))! }
let sortedABC = ABC.sorted(by: <)
let A = sortedABC[0]
let B = sortedABC[1]
let C = sortedABC[2]
if A == 0 || B == 0 || C == 0 {
break
}
if C >= B + A {
print("Invalid")
continue
}
if A == B && B == C {
print("Equilateral")
} else if A != B && B != C && A != C {
print("Scalene")
} else {
print("Isosceles")
}
}
그렇게 효율적이진 않지만 C++ 코드에 비하면 효율적이다...
C++ 코드
#include <iostream>
using namespace std;
int a, b, c;
int main() {
while (true) {
cin >> a >> b >> c;
int m = max(a, max(b, c));
if (a == b && b == c && c == 0) {
break;
}
if (m >= (a + b + c - m)) {
cout << "Invalid\n";
continue;
}
if (a == b && b == c) {
cout << "Equilateral\n";
continue;
}
if ((a == b && b != c) || (a == c && b != c) || (b == c && a != c)) {
cout << "Isosceles\n";
continue;
}
cout << "Scalene\n";
}
}
비효율의 끝판왕...
'Algorithm > PS' 카테고리의 다른 글
백준 1157번 단어 공부 - SWIFT, C++ (0) | 2024.05.23 |
---|---|
백준 2292번 벌집 - SWIFT, C++ (0) | 2024.05.23 |
백준 23971번 ZOAC 4 - C++ (0) | 2024.05.23 |
백준 2407번 조합 - SWIFT (0) | 2024.05.13 |
백준 2346번 풍선 터뜨리기 - SWIFT (0) | 2024.05.13 |