본문 바로가기

Algorithm/Algorithm Test

[프로그래머스] 두 개 뽑아서 더하기(C++, Java)

카테고리

기본 알고리즘

나만의 카테고리

함수 활용 문제

문제 링크

programmers.co.kr/learn/courses/30/lessons/68644

 

코딩테스트 연습 - 두 개 뽑아서 더하기

정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요. 제한

programmers.co.kr

요점

  • 중복제거에 대한 요령이 필요하다 (Set활용, Sort와 unique활용 등)

참고 지식

  • [C++] sort(start, end)
  • [C++] unique(start, end)
  • [Java] Set 컨테이너 

풀이 (C++)

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> numbers) {
    vector<int> answer;
    
    int size = numbers.size();
    for (int index = 0; index < size; index++) {
        for (int secondIndex = 0; secondIndex < size; secondIndex++) {
            if (index == secondIndex) continue;
            answer.push_back(numbers[index] + numbers[secondIndex]);
        }
    }
    
    sort(answer.begin(), answer.end());
    answer.erase(unique(answer.begin(), answer.end()), answer.end());
    
    return answer;
}

풀이 (Java)

import java.util.stream.Stream;
import java.util.stream.Collectors;
import java.util.*;

class Solution {
    public int[] solution(int[] numbers) {
        //int[] numbersCopy = numbers.clone();
        
        Set<Integer> answerSet = new HashSet<>();
        
        int numbersLength = numbers.length;
        for (int index = 0; index < numbersLength; index++) {
            for (int copyIndex = 0; copyIndex < numbersLength; copyIndex++) {
                if (index == copyIndex) continue;
                answerSet.add(numbers[index] + numbers[copyIndex]);
            }
        }
        List<Integer> answer = answerSet.stream()
            .map(t -> Integer.parseInt(t.toString()))
            .collect(Collectors.toList());
        
        Collections.sort(answer);
        
        int[] answerArray = new int[answer.size()];
        
        int index = 0;
        for(int t : answer) {
            answerArray[index++] = t;
        }
        
        return answerArray;
    }
}

C++ 코드에서는 Vector에서 중복제거하기 요령을 숙지하고 있어서 바로 쉽게 사용했지만 그렇지 않았다면 약간 헤맸을 수도 있겠다. 

  • unique 함수 : Vector 배열에서 중복되지 않은 원소들을 앞에서부터 채워나간다. Vector의 크기는 변경되지 않으므로 뒷부분은 원래 Vector의 값이 그대로 남는다. 그리고 앞의 원소와 뒤의 원소를 비교하는 방식으로 진행되므로 반드시 정렬과 같이 사용해야 원하는 로직대로 수행된다.
    예시) 1,1,4,5,5,6 => 1,4,5,6,5,6 / 1,2,1,4,5,5,6 => 1,2,1,4,5,6

위의 unique 함수 특성에 따라 sort를 먼저 진행하고 수행하면 오름차순 문제까지 해결할 수 있다. 중복제거 요령은 외워두면 좋을 것 같다.

 

C++은 간단하게 코드가 나왔지만 Java는 아주 더러운 코드로 풀게 되었다. Java에서 중복제거를 위해 Set를 활용하려다 보니 Primitive 자료형인 int를 사용할 수 없이 계산을 진행했고 실질적으로 필요한 부분 이외에 변환 과정이 더 복잡해졌다.

 


알고리즘 초보가 정리한 글입니다

더 좋은 방법이나 코드에 대한 코멘트 언제나 환영합니다!

반응형