알고리즘/프로그래머스

두개 뽑아서 더하기

가다파하 2020. 11. 19. 18:01

문제 : https://programmers.co.kr/learn/courses/30/lessons/68644

 

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

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

programmers.co.kr

1) 풀이 방법

 기준 인덱스를 기준으로, 기준 인덱스보다 큰 인덱스들의 값들의 합과 비교해서 리스트 담기.

 

2) 나의 코드

import java.util.TreeSet;

/**
 *https://programmers.co.kr/learn/courses/30/lessons/68644
 *두개 뽑아서 더하기.
 *
 */
public class PickUpDataAndPlus {
	
	/**
	 *  테스트 1 〉	통과 (0.72ms, 52.7MB)
		테스트 2 〉	통과 (0.75ms, 53MB)
		테스트 3 〉	통과 (0.75ms, 52.5MB)
		테스트 4 〉	통과 (0.76ms, 53.6MB)
		테스트 5 〉	통과 (1.28ms, 52.3MB)
		테스트 6 〉	통과 (1.36ms, 53MB)
		테스트 7 〉	통과 (5.05ms, 53.9MB)
		테스트 8 〉	통과 (3.50ms, 52.4MB)
		테스트 9 〉	통과 (3.04ms, 52.1MB)
	 */
	public static void main(String[] args) {
		// numbers에 있는 데이터중 서로 다른 인덱스에 있는 두개의 수를 뽑아 더해서 만들수 있는 모든 수를 배열에 담기.
		
		int[] numbers = {2,1,3,4,1};
		//int[] numbers = {5,0,2,7};
		
		TreeSet<Integer> result = new TreeSet<Integer>();
		
		for(int i=0; i< numbers.length; i++) {
			for(int j=i+1; j<numbers.length; j++) {
				result.add(numbers[i]+numbers[j]);
			}
		}

		/*
		int[] answer = new int[result.size()];
		int i=0;
		for(int value : result) {
			answer[i] = value;
			System.out.print(value + " ");
		}*/
        int[] answer = result.stream().mapToInt(Integer::intValue).toArray();
        // stream 사용법 익숙해져보자
	}
}

 

 

# 순열을 푼 직후에 풀어서 처음에 n개중 2개만 뽑는 순열문제로 접근했다가 시간초과 남.

import java.util.ArrayList;
import java.util.List;
import java.util.TreeSet;

import org.apache.commons.collections4.list.TreeList;

/**
 *https://programmers.co.kr/learn/courses/30/lessons/68644
 *두개 뽑아서 더하기.
 * 시간초과 난 코드
 
 */
public class PickUpDataAndPlus {
	/*테스트 1 〉	통과 (0.99ms, 52.3MB)
	테스트 2 〉	통과 (2.69ms, 52.4MB)
	테스트 3 〉	통과 (0.86ms, 53.3MB)
	테스트 4 〉	통과 (3.04ms, 52.4MB)
	테스트 5 〉	통과 (274.94ms, 55MB)
	테스트 6 〉	실패 (시간 초과)
	테스트 7 〉	실패 (시간 초과)
	테스트 8 〉	실패 (시간 초과)
	테스트 9 〉	실패 (시간 초과)
	정확성: 55.6
	합계: 55.6 / 100.0*/
	static TreeSet<Integer> sumOfValues = new TreeSet<Integer>();
	public static void main(String[] args) {
		// numbers에 있는 데이터중 서로 다른 인덱스에 있는 두개의 수를 뽑아 더해서 만들수 있는 모든 수를 배열에 담기.
		
		//int[] numbers = {2,1,3,4,1};
		int[] numbers = {5,0,2,7};
		
		List<Integer> list = new ArrayList<>();
		for(int number : numbers) {
			list.add(number);
		}
		
		List<Integer> tempList = new ArrayList<>();
		for(int i=0; i<list.size(); i++) {
			permutation(list, tempList, list.size(), 2);
		}

		int i=0;
		int[] result = new int[sumOfValues.size()];
		for(int sum : sumOfValues) {
			result[i] = sum;
			i++;
			System.out.print(sum + " ");
		}
	}
	
	public static void permutation(List<Integer> list, List<Integer> temp, int n, int r) {
			if(r==0) {
				int sum = Math.addExact(temp.get(0), temp.get(1));
				sumOfValues.add(sum);
			}
			
			for(int i=0; i<n; i++) {
				temp.add(list.remove(i));
				permutation(list, temp, n-1, r-1);
				list.add(i, temp.remove(temp.size() - 1));
			}
	}

}

 

처음에 단순하게 푸는 생각을 먼저하자!