본문 바로가기
알고리즘(코딩테스트)

백준 5073번 삼각형과 세 변(JAVA)

qbang 2024. 2. 28.
 

5073번: 삼각형과 세 변

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

www.acmicpc.net

 

풀이코드

ArrayList 활용

import java.util.*;
import java.io.*;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
        
        ArrayList<Integer> list = new ArrayList<>();
        int x, y, z = 0;
        String s;
        
        while (true) {
            st = new StringTokenizer(br.readLine(), " ");

            list.clear();
            
            list.add(Integer.parseInt(st.nextToken()));
            list.add(Integer.parseInt(st.nextToken()));
            list.add(Integer.parseInt(st.nextToken()));
            
            Collections.sort(list);
            
            x = list.get(0);
            y = list.get(1);
            z = list.get(2);
            
            if (x + y + z == 0) {
                break;
            }
            
            if (z >= x + y) {
                s = "Invalid";
            } else {
                s = "Scalene";
                
                if (x == y || y == z) {
                    s = "Isosceles";
                    
                    if (x == y && y == z) {
                        s = "Equilateral";
                    }
                }
            }
            
            bw.write(s);
            bw.newLine();
        }
        
        bw.flush();
    }
}

 

조건문 나열 

import java.util.*;
import java.io.*;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
        
        int x, y, z = 0;
        String s = "";
        
        while (true) {
            st = new StringTokenizer(br.readLine(), " ");
            
            x = Integer.parseInt(st.nextToken());
            y = Integer.parseInt(st.nextToken());
            z = Integer.parseInt(st.nextToken());
            
            if (x + y + z == 0) {
                break;
            }
            
            if (z >= x + y || x >= y + z || y >= x + z) {
                s = "Invalid";
            } else if (x != y && y != z && x != z) {
                s = "Scalene";
            } else if ((x == y && y != z) || (x == z && z != y) || (y == z && z != x)) {
                s = "Isosceles";
            } else if (x == y && y == z && x == z) {
                s = "Equilateral";                
            }
            
            bw.write(s);
            bw.newLine();
        }
        
        bw.flush();
    }
}

 

풀이과정

문제에 있는 조건을 코드로 그대로 표현하면 해결할 수 있는 문제이다. 

나는 세 변의 길이를 정렬을 해서 풀이해보았다가(ArrayList 활용 방법), 조건을 나열해서 풀이하는 방법이 시간복잡도 면에서 더 나은 것을 보고 두 번 채점을 진행하였다. 

 

ArrayList 활용

  1. 세 변의 길이를 정렬
  2. 제일 긴 변의 길이가 나머지 변의 길이 합보다 크면 삼각형이 성립할 수 없음 -> Invalid
  3. 2번에서 걸리지만 않으면 최소한 삼각형의 형태는 띌 수 있음 ->  Scalene
  4. 최소한 삼각형의 형태는 띄지만 두 변의 길이가 같으면 -> Isosceles
  5. 심지어 세 변의 길이가 같으면 -> Equilateral

해당 방법의 경우는 Isosceles, Equilateral를 판단하려면 조건문을 여러번 타면서 체크해야 한다는 단점이 있다. 그래서 시간복잡도가 다소 높게 나온 듯 하다.

 

조건문 나열

문제에 있는 조건을 정말 고대로 if 문으로 작성한 방법이다. 단계적으로 검사하는 방식이 아니어서 비교적 코드 실행 시간이 짧다.

'알고리즘(코딩테스트)' 카테고리의 다른 글

백준 2162번 카드2(JAVA)  (0) 2024.03.06
백준 2292번 벌집(JAVA)  (0) 2024.03.04
백준 23971번 ZOAC 4(JAVA)  (1) 2024.02.27
백준 1655번 가운데를 말해요  (0) 2023.05.09
백준 1912번 연속합(JAVA)  (0) 2022.03.02

댓글