[알고리즘] 세 수 중 최솟값 구하기 / 삼각형 판별하기
인프런 알고리즘 문제풀이
세 수 중 최솟값 구하기
문제
100 이하의 자연수 a, b, c를 입력받아 세 수 중 가장 작은 값을 출력하는 프로그램을 작성하세요.(정렬 사용 X)
내 풀이
//일일이 하나씩 다 비교하기
if (a > b && b > c) answer = c;
else if (b > a && a > c) answer = c;
else if (a > c && c > b) answer = b;
else if (c > a && a > b) answer = b;
else answer = a;
코딩의 기본은 짧을수록 좋다고 들었는데, 결과와 무관하게 쓰면서 이상하다... 싶었다. 그러면 선생님의 풀이를 보자.
선생님 풀이
//두개로 나눠서 생각하기(a,b)
if (a < b) answer = a;
else answer = b;
//a와 b의 관계가 성립되었음
if (c < answer) answer = c;
return answer;
훨씬 짧아졌다. 다른 점이라면, 나는 세 개를 한꺼번에 해서 경우 수를 나눴다면, 선생님은 경우의 수를 두 개씩 나눠서 생각했다는 점이다. 그럼 이걸 응용한 문제 삼각형을 보도록 하자.
삼각형 판별하기
문제
길이가 서로 다른 a,b,c 세 개의 막대 길이가 주어지면 이 세 막대로 삼각형을 만들 수 있으면 "YES"를 출력하고, 만들 수 없으면 "NO"를 출력한다.
내 풀이
최솟값 구하기의 응용 문제이다. 삼각형의 세 변을 알았을 때, 삼각형이 성립되는지 안되는지 판별하는 방법은, 가장 긴 변의 길이가 나머지 두 변의 길이의 합보다 작아야한다. 결국 a, b, c의 최댓값 max을 최솟값을 구했을 때의 방식으로 구한 다음, 최댓값과 나머지 길이의 합을 계산하면 되겠다.
let answer = "YES",
max; // let max를 선언한거 뿐임, answer에 여러개를 넣은게 아님
let total = a + b + c;
if (a > b) max = a;
else max = b;
if (c > max) max = c;
let two = total - max;
if (two <= max) answer = "NO";
※ 풀다가 깜짝 놀랜 부분
처음에 let answer = "YES", max;로 되어있어 배열도 아닌 변수에 두 가지 값을 어떻게 넣은거지 하면서 엄청 찾아봤다. 역시 코린이다. let 변수를 여러 개 선언한 거 뿐인데, 완전 바보.
마무리
알고리즘 공부 시작이다. 늦깍이 학생이고, 일본학과를 공부하다가, 복수전공으로 듣다보니 아무것도 준비하지 못하고 2년을 띵가띵가 보냈다. 늦깍인데 정신이 없다. 아주 그냥. 1년, 1년만 꾸준히 해보자. 조급해하지말자. 화이팅