ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 두개 뽑아서 더하기
    알고리즘/프로그래머스 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
Designed by Tistory.