백준 10101 삼각형 외우기[JAVA]

Ga0·2023년 3월 28일
0

baekjoon

목록 보기
10/121

문제 해석

  • 삼각형의 각을 모두 입력받는다.
    - 만약, 입력받은 3개의 각이 모두 60이면, Equilateral을 출력
    • 만약, 세각의 합이 180이고 입력받은 3개의 각 중 2개의 각이 같을 경우, Isosceles을 출력
    • 만약, 세각의 합이 180이고 입력받은 3개의 각 중 같은 각이 없는 경우, Scalene을 출력
    • 만약, 세각의 합이 180 되지 않을 경우 Error을 출력

-> 문제는 간단하면서 쉬운 문제이다.

작성한 코드

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

public 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));

        int angle[] = new int[3]; //각도를 저장하는 배열
        int wholeangle = 0;

        for(int i = 0; i < 3; i++){
            angle[i] = Integer.parseInt(br.readLine());
            wholeangle += angle[i];
        }
        br.close();

        if(wholeangle != 180){
            bw.write("Error");
        }else{
            int[] distinct = removeDuplicate(angle);

            if(distinct.length == 1){ //세각이 전부 같을 경우(중복값을 제거한 후 1개가 남은거니까)
                bw.write("Equilateral");
            }else if(distinct.length == 2){//세각 중 두각이 같을 경우(중복값을 제거한 후 2개가 남은거니까)
                bw.write("Isosceles");
            }else if(distinct.length == 3){ //세각이 전부 다를 경우(중복값을 제거해도 3개가 남은거니까)
                bw.write("Scalene");
            }
        }

        bw.flush();
        bw.close();

    }
	//배열의 중복값을 삭제하여 배열을 반환해주는 메서드
    public static int[] removeDuplicate(int[] arr) {
        //받은 배열을 크기만큼 반복문을 돌림(forEach) = Stream()
        // distinct() 메소드는 스트림에서 중복되는 요소들을 모두 제거해주고 새로운 스트림을 반환
        //  List 컨테이너의 인스턴스를 배열(array)로 만드는것이 'toArray' 메서드
        return Arrays.stream(arr).distinct().toArray();
    }
}
  • 나는 일단, 각들을 배열에 저장하면서 세각의 합을 저장할 변수를 따로 선언하여 누적 더하기를 하였다.
  • 모든 각을 입력 받았다면, 일단 누적더하기 한 세각의 합이 180인 경우, 180이 아닌 경우로 나눠서 수행하였다.
  • 만약 180이 아닌 경우는 BufferedWriter에 Error을 저장하여 출력하였고, 180인 경우는 세각을 모두 입력받은 배열을 removeDuplicate()이라는 메소드로 중복값을 처리하여 경우의 수를 나눴다.
  • 각이 같다는 것은 중복된다는 것과 같은 의미이기 때문에 중복값을 제거해서 남은 각의 수가 몇개인지로 따져서(array.length) 이 문제를 풀었다.

결과

  • 하지만 풀이 방식이 조금 그런건지.. 시간을 많이 나왔다.

참고한 코드2

import java.io.*;
import java.util.ArrayList;
import java.util.HashSet;

public 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));

        ArrayList<Integer> angle = new ArrayList<>();

        angle.add(Integer.parseInt(br.readLine()));
        angle.add(Integer.parseInt(br.readLine()));
        angle.add(Integer.parseInt(br.readLine()));

        br.close();

        if((angle.get(0) + angle.get(1) + angle.get(2))== 180){ //세각이 180일 경우

            HashSet data = new HashSet(angle);

            if(data.size() == 1){
                bw.write("Equilateral");
            }else if(data.size() == 2){
                bw.write("Isosceles");
            }else if(data.size() == 3){
                bw.write("Scalene");
            }

        }else{ //세각이 180아닌 경우
            bw.write("Error");
        }
        bw.flush();
        bw.close();

    }
}
  • 다른 분이 한 코드를 보니 HashSet 클래스를 사용했음을 알 수 있다.
  • 일단, 세각 전부를 알아야하기 때문에 ArrayList로 저장을 한 후 세각을 모두 더한 값을 알고 난 후부터는 HashSet을 사용하여 중복값을 없앴다.
    • HashSet은?
      • Set 인터페이스에서 지원하는 구현 클래스(Set은 주머니 형태로 비선형 구조이기에 저장 순서가 없으며 그렇기에 인덱스도 존재X)
      • 순서대로 입력되지 않고, 일정하게 유지되지 않는게 특징
      • null값도 요소로 허용
      • 중복을 허용하지 않는다
      • HashSet은 객체를 저장하기 전에 먼저 객체의 hashcode()메서드를 호출해서 해시코드를 얻어낸 다음 저장되어 있는 객체들의 해시 코드와 비교한 후 해시 코드가 잇다면 equals()메서드를 사용하여 두 객체를 비교한다.
      • 이 과정에 true가 나온다면 동일한 객체로 판단하고 중복저장을 하지 않는다.
  • 즉, 다시말하면 new String()을 쓰면 모두 다른 객체임은 우리가 아는 사실인데, 만약 String의 값이 같다면 new String()을 두번썼다고 한들... 같은 객체로 간주한다.
    -> 이유 : String 클래스가 hashcode()와 equals()메서드를 재정의해서 같은 문자열일 경우 hsahCode()의 리턴 값을 같게, equals()의 리턴값은 true가 나오도록 했기 때문!
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        
        //객체 새로 생성
        String a = new String("Hello");
        String b = new String("Hello");

        System.out.println(a == b); //false
        System.out.println(a.hashCode());
        System.out.println(b.hashCode());

        //기본적으로 String은 HashMap 자료구조형태로 중복된 데이터면 저장되지 않고 동일한 주소를 참조
        // new연산자를 안쓸 경우 
        String c = "Hello";
        String d = "Hello";
        System.out.println(c == d);
        System.out.println(c.hashCode());
        System.out.println(d.hashCode());
    }
}

결과2

  • 메모리와 시간이 많이 줄은 것을 확인할 수 있다.
  • HashSet을 사용하는게 좋은 코드인 것 같다!

느낀점

  • 효율적인 코드를 짜는게 아직 어려운 것 같지만, 다른 사람분들의 코드를 보고 이해하는 속도가 좀 빨라진 것 같다.
  • 음... 그리고 자바에서 기본으로 제공하는 다양한 클래스/라이브러리를 적절하게 잘 사용해야한다는 것을 느꼈다.

0개의 댓글