해시-Level1-폰켓몬 (Java,C++,Python,Javascript)

설탕유령·2022년 8월 24일
0
post-custom-banner

대부분이 그러듯이, 알고리즘을 Python으로 풀어왔다.
새롭게 Javascript를 이용해서 알고리즘을 풀어보는데, 제법 어렵다는 것을 깨달았다.
그래서 지금까지 거쳐온 언어들을 사용해 알고리즘을 풀어보면 어떻게 다른지 궁금해 해보기로 했다.

[문제 참조]
https://school.programmers.co.kr/learn/courses/30/lessons/1845

공통로직

  1. 중복되는 요소를 제거한다.
  2. 남은 요소에서 고를 수 있는 수 만큼 고른다.(최솟값을 반환한다)

Python

def solution(ls):
    return min(len(ls)/2, len(set(ls)))

Python은 코드가 매우 깔끔하다.
1. set을 이용한 중복 제거
2. len을 이용한 길이 반환
3. min을 이용해 최소값을 구한 뒤 반환

C++

#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 입력 반복자를 넣어야한다는게 특징이다.

Java

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한다.

  1. 배열을 stream을 사용해 처리한다(컬렉션의 저장 요소를 하나씩 참조해 람다식으로 처리할 수 있도록 해주는 반복자)
  2. .boxed()를 사용해 원시 타입에 대한 스트림 지원을 클래스 타입으로 전환해 실행
  3. .collect()를 사용해 Steam 데이터의 변형 처리를 진행
  4. collectingAndThen을 통해 Collecting을 한 결과를 형식으로 반환해 .collect() 대상으로 사용
  5. collectingAndThen 타입 대상은 toSet()을 통해 데이터의 중복 제거를 실행
  6. 중복 제거 된 phonekemons를 람다 형식으로 펼쳐 각각(phonekemons, nums)의 길이를 비교해 최솟값 반환

기능을 위한 전처리나, 라이브러리간 형식 변경에 많은 코드가 쓰이는 듯 하다.
하도 오랜만이라 java 8 버전을 처음으로 접했지만, 갈수록 복잡해지는 느낌이다.

Javascript

function solution(nums) {
  const max = nums.length / 2;
  const arr = [...new Set(nums)];

  return arr.length > max ? max : arr.length
}

특이사항은 다음과 같다.

  1. 펼침연산자와 Set을 활용한 중복 제거된 리스트 반환
  2. 삼항연산자를 통해 최소값 반환

다른 언어에서는 그냥 set을 호출해 사용하는 것에 반해, 펼침연산자를 통해 새롭게 리스트를 또 할당 시킨다.

또한 별도 라이브러리를 선호하지 않는 걸까, min을 사용하지 않고 작성한다.

정리

python: 간결한 코드, 단순한 기능 호출

C++: 라이브러리 선언 필요, 추가적으로 약간 복잡한 자료형 변환

Java: 복잡함, 형변환에 Collect이 복잡도를 야기함

Javascript: 단순하고 직관적, 오히려 단순함 때문인지 편리함이 줄어듬

profile
달콤살벌
post-custom-banner

0개의 댓글