대부분이 그러듯이, 알고리즘을 Python으로 풀어왔다.
새롭게 Javascript를 이용해서 알고리즘을 풀어보는데, 제법 어렵다는 것을 깨달았다.
그래서 지금까지 거쳐온 언어들을 사용해 알고리즘을 풀어보면 어떻게 다른지 궁금해 해보기로 했다.
[문제 참조]
https://school.programmers.co.kr/learn/courses/30/lessons/1845
def solution(ls):
return min(len(ls)/2, len(set(ls)))
Python은 코드가 매우 깔끔하다.
1. set을 이용한 중복 제거
2. len을 이용한 길이 반환
3. min을 이용해 최소값을 구한 뒤 반환
#include <bits/stdc++.h>
using namespace std;
int solution(vector<int> nums) {
unordered_set<int> s(nums.begin(), nums.end());
return min(nums.size() / 2, s.size());
}
일단 상단에 선언부를 통해 라이브러리를 가져와야한다.
1. vector를 이용해 동적 배열을 선언
2. unordered_set을 이용해 중복이 제거된 집합을 생성 ⇒ Vector의 시작과 끝에 대한 입력 반복자를 넘겨줌
3. 각각의 size를 잰 뒤, min을 통해 최솟값 반환
파이썬과 동일한 동작이지만, 코드 및 네이밍이 길고 복잡하다.
추가로 중복제거 집합을 만들기 위해 Vector 입력 반복자를 넣어야한다는게 특징이다.
import java.util.Arrays;
import java.util.stream.Collectors;
class Solution {
public int solution(int[] nums) {
return Arrays.stream(nums)
.boxed()
.collect(Collectors.collectingAndThen(Collectors.toSet(),
phonekemons -> Integer.min(phonekemons.size(), nums.length / 2)));
}
}
C++과 비슷하게 계산에 사용될 라이브러리를 import한다.
기능을 위한 전처리나, 라이브러리간 형식 변경에 많은 코드가 쓰이는 듯 하다.
하도 오랜만이라 java 8 버전을 처음으로 접했지만, 갈수록 복잡해지는 느낌이다.
function solution(nums) {
const max = nums.length / 2;
const arr = [...new Set(nums)];
return arr.length > max ? max : arr.length
}
특이사항은 다음과 같다.
다른 언어에서는 그냥 set을 호출해 사용하는 것에 반해, 펼침연산자를 통해 새롭게 리스트를 또 할당 시킨다.
또한 별도 라이브러리를 선호하지 않는 걸까, min을 사용하지 않고 작성한다.
python: 간결한 코드, 단순한 기능 호출
C++: 라이브러리 선언 필요, 추가적으로 약간 복잡한 자료형 변환
Java: 복잡함, 형변환에 Collect이 복잡도를 야기함
Javascript: 단순하고 직관적, 오히려 단순함 때문인지 편리함이 줄어듬