<프로그래머스, 폰켓몬>

Minwoong Kim·2022년 8월 28일
0

2022-Aug-28, today getting of my comfort zone

문제 설명

정수 1~200,000 의 숫자가 각각 서로 다른 포켓몬이라고 가정하자. 포켓몬의 종류(번호)가 담긴 1~10,000 길이(N)의 짝수 배열이 주어질 때, N/2 개의 포켓몬을 선택하는 방법 중, 가장 많은 종류의 폰켓몬을 선택하는 방법을 찾아, 그때의 폰켓몬 종류(번호)의 갯수를 return 하는 함수를 완성해라.

문제 예시

nums = [3,1,2,3] => result = 2
nums = [3,3,3,2,2,4] => result =3
nums = [3,3,3,2,2,2] => result =2

My Comfort zone

중복되는 값을 제거하여 새로운 배열을 만드는 Set 메서드를 활용해 보았다.

만약, 새로운 배열의 길이가 골라야 하는 폰켓몬의 갯수와 같거나 크다면 당연히 중복이 제거된 배열에서 아무 폰켓몬이나 골라야 하는 만큼 고를 수 있고, 그것이 곧 문제에서 원하는 정답이 된다.

그 외의 경우, 즉 새로운 배열의 길이가 골라야 하는 폰켓몬의 갯수보다 적다면 새로운 배열에 포함되어 있는 폰켓몬의 종류의 수가 곧 문제에서 원하는 정답이 된다. 어쨌든 문제에서 원하는 것은 '폰켓몬 종류의 최대 수' 이기 때문에 새로운 배열에 포함된 폰켓몬을 고른 후, 부족한 폰켓몬을 고를 때 어떻게 골라도 이미 새로운 배열에 포함된 폰켓몬일 것이므로 상관이 없는 것이다.

Getting out of comfort zone

기존 If ~ else 문 대신 삼항 연산자 식을 사용해 보았다. 성능면에서 유의미한 차이는 없을 것 같으나, 한 번 해봤다. 구글링 해보니, 삼항연산자는 조건이 충족될 때 바로 값의 할당이 가능하여 불필요한 코드를 줄일 수 있다고 한다. 또한, Scope 적인 측면에서도 if문과 달리 블럭{ }이 없기 때문에 전역 변수를 활용할 수 있다는 장점도 있었다. 삼항 연산자 사용에 있어서 아직 익숙하지 않지만, 의식적으로 사용 연습을 해봐야겠다.

다중 삼항 연산

let a = 10;

a > 1 ?
( console.log('안녕!'),console.log('안뇽!'))
: (console.log('안녕?'),console.log('안뇽?'));

실행해야할 내용이 하나가 아니라면 쉼표(,)를 사용하여 나열하고 중괄호( )를 사용하여 묶어준다. 나머지는 기본 문법과 동일하다.

삼항 연산자의 조건 중첩 - 1

let a = true; 
let b = false; 
let = answer;
a ? (b ? answer = True2 : answer = TrueFalse) 
: (b ? answer = FalseTrue : answer = False2);

하나의 조건에 대한 참 : 거짓 구조 내부에 또 다른 조건에 대한 참 : 거짓 구조를 삽입할 수 있다. If - else 문의 조건식에 논리 연산자 && 를 사용하는 것과 비슷한 원리인 것 같다.

삼항 연산자의 조건 중첩 -2

let a = false;
let b = false;
let c = false;
let d = true;
  a ? answer = a
: b ? answer = b
: c ? answer = c
: answer = d;

[if ~ else if ~ else if ~ else] 문과 동일하게 작성이 가능하다.


문제 자체는 쉬웠으나, 익숙하지 않은 삼항연산자에 대한 스터디에 시간이 좀 걸렸다. 삼항 연산자는 구조가 까다롭다 라는 선입견에 자주 사용하지 않았는데 이번 기회에 시도해보니 나름 깔끔하게 코드가 떨어지는 것 같다. 앞으로 자주 사용해야겠다.

profile
Get out of my comfort zone

0개의 댓글