코드 그라데이션

[Lv.0] 삼각형의 완성 조건 본문

Java/알고리즘

[Lv.0] 삼각형의 완성 조건

완벽한 장면 2023. 5. 18. 23:10

https://school.programmers.co.kr/learn/courses/30/lessons/120889

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.

  • 가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.

삼각형의 세 변의 길이가 담긴 배열 sides가 매개변수로 주어집니다.

세 변으로 삼각형을 만들 수 있다면 1, 만들 수 없다면 2 를 리턴하도록 함수를 작성하세요.

 

제한사항

입출력 예

입출력 예 설명

아이디어

- 중복된 코드는 분리해서 한 번만 쓰자! 

 

  • sides[0] < sides[1] +sides[2]; 이것의 타입 자체는 int가 아니라 boolean이다.

 

작성한 초기 코드

class Solution {
  public int solution(int[] sides) {
    boolean segment = sides[0] <sides[1] + sides[2];
    
    if (segment) {
      return 1;
    }
    else {
      return 2;
    }    
  }
}

- 테스트 케이스 일부만 통과

  • 여기서 고려해봄직한 상황은 반드시 sides[0]이 가장 긴 변이라고만 가정했다는 것이다.
  • 근데 다른 테스트 케이스에서는 1이나 2가 가장 긴 변일 수도 있음.
  • 0번이 클 때, 1번이 클 때, 2번이 클 때라는 경우의 수 다 포함해줘야 하고, 그 조건 먼저 검사하고 세부조건으로          들어가야 함.
  • 결국 답을 알려면, 가장 긴 변이 무엇인지만 알면 된다.
  • 그 가정을 전부 해서 확인해줘야 함.

 

수정하면

class Solution {
  public int solution(int[] sides) {

    if (sides[0]>sides[1] && sides[0] >sides[2]) {
      boolean segment1 = sides[0] <sides[1] + sides[2];

      if (segment1) {
        return 1;
      }
      else {
        return 2;
      }
    }

    if (sides[1]>sides[0] && sides[1] >sides[2]) {
      boolean segment2 = sides[1] < sides[0] + sides[2];
      if (segment2) {
        return 1;
      }
      else {
        return 2;
      }
    }
    else  {
      boolean segment3 = sides[2] < sides[0] + sides[1];
      if (segment3) {
        return 1;
      }
      else {
        return 2;
      }
    }

  }
}

 

 

그런데 이걸 더 줄일 수 있다.

- 중복 부분 하나로 합쳐서 반복 제거.

- 참이면 1, else면 2 이 부분. 하는 일이 똑같다는 것.

- 이 것을 아예 한 번만 써줄 수 있도록 수정해야.

- 분기문을 만들었는데, 분기문마다 똑같이 하는 일이라면,

- 분기문 밖에다가 한 번만 만들어서 공통적으로 수행하게 하면 되는 것이니까.

 

 

정리한 제출 코드

class Solution {
    public int solution(int[] sides) {
        
        boolean segment;
        
        if(sides[0]>sides[1] && sides[0] > sides[2]) {
            segment = sides[0] < sides[1] +sides[2];
        }
        else if(sides[1]>sides[0] && sides[1] > sides[2]) {
            segment = sides[1] < sides[0] +sides[2];            
        }
        else {
            segment = sides[2] < sides[0] +sides[1];   
        }
        
        if(segment) {
                return 1;
            }
            else {
                return 2;
            }
    }
}
728x90
Comments