-
두개 뽑아서 더하기알고리즘/프로그래머스 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)); } } }
처음에 단순하게 푸는 생각을 먼저하자!
'알고리즘 > 프로그래머스' 카테고리의 다른 글
가장 큰 수 (0) 2020.11.02 크레인 인형뽑기 게임 (0) 2020.11.01 나누어 떨어지는 숫자 배열 (0) 2020.11.01 이상한 문자 만들기 (0) 2020.11.01 가운데 글자 가져오기 (0) 2020.11.01