본문 바로가기
Programming/Cos Pro 1급

Cos Pro 1급 - 샘플 문제 풀이 5차 3번 - 배열을 정렬하기

by 우공80 2022. 11. 10.
728x90

배열을 정렬하기

문제 지문 #3


서로 다른 정수 n개가 담긴 배열이 있습니다. 이 배열을 앞 (n+1)/2개 원소는 증가하고 뒤 (n+1)/2개 원소는 감소하도록 정렬하려고 합니다. 이때, 조건을 만족하는 배열이 여럿인 경우 사전 순으로 가장 먼저 나오는 배열을 답으로 합니다. 예를 들어, 주어진 배열이 [7, 3, 4, 1, 2, 5, 6]라면 정렬한 이후에는 [1, 2, 3, 7, 6, 5, 4]가 됩니다.

정수 배열 numbers가 매개변수로 주어질 때, 문제의 조건에 맞게 정렬하여 return 하도록 solution 메서드를 작성했습니다. 그러나, 코드 일부분이 잘못되어있기 때문에, 몇몇 입력에 대해서는 올바르게 동작하지 않습니다. 주어진 코드에서 _한 줄_만 변경해서 모든 입력에 대해 올바르게 동작하도록 수정하세요.


매개변수 설명

정수 배열 numbers가 solution 메서드의 매개변수로 주어집니다.

  • numbers의 각 원소는 -1,000 이상 1,000 이하인 정수이며, 중복되는 수는 없습니다.
  • numbers의 길이는 3 이상 10,000 이하인 홀수입니다.

return 값 설명

주어진 배열을 앞 (n+1)/2개 원소는 증가하고 뒤 (n+1)/2개 원소는 감소하도록 정렬하여 return 합니다.
조건을 만족하는 배열이 여럿인 경우 사전 순으로 가장 먼저 나오는 배열을 답으로 합니다.


입출력 예
numbers return
[7, 3, 4, 1, 2, 5, 6] [1, 2, 3, 7, 6, 5, 4]
입출력 예 설명

문제에 나온 예와 같습니다.

728x90

 

혼자 풀이


한 줄 고치기 문제입니다. 주어진 배열을 반으로 나누어 앞쪽은 오름차순으로 뒤쪽은 내림차순으로 정렬하는 문제입니다.
주어진 코드는 배열을 우선 오름차순 정렬을 하고(Arrays.sort() 함수 사용), 나머지 절반에 대해 right, left 인덱스를 정하고 하나씩 줄이고 늘려가면서 수를 swap 하다가 left가 right보다 크게 되면 중단합니다. 비교적 쉬운 난이도입니다. 

import java.util.*;

class Main {
	//numbers의 i번째 원소와 j번째 원소의 순서를 바꾸는 함수
	public void swap(int[] numbers, int i, int j) {
		int tmp = numbers[i];
		numbers[i] = numbers[j];
		numbers[j] = tmp;
	}

    public int[] solution(int[] numbers) {
    	int[] answer = {};
        //nubers를 오름차순 정열
        Arrays.sort(numbers);
        //반으로 나누는 지점 계산
        int mid = (numbers.length - 1) / 2;
        //mid와 numbers의 마지막 수를 맞바꿈
        swap(numbers, mid, numbers.length-1);
        
        int left = mid + 1;
        //int right = numbers.length - 1; 이미 앞에서 마지막 수는 맞바꿨음
        int right = numbers.length - 2;
        //left가  right보다 작거나 같은 동안 mid이후의 수를 순차적으로 맞바꿈
        while(left <= right) {
        	swap(numbers, left, right);
        	left = left + 1; 
        	right = right - 1;
        }

        answer = numbers;
        return answer;
    }

    //아래는 테스트케이스 출력을 해보기 위한 main 메소드입니다. 
    //아래에는 잘못된 부분이 없으니 위의 코드만 수정하세요.
    public static void main(String[] args) {
    	Main sol = new Main();
    	int[] numbers = {7, 3, 4, 1, 2, 5, 6};
    	int[] ret = sol.solution(numbers);

    	// [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
    	System.out.print("solution 메소드의 반환 값은 [");
    	for(int i = 0; i < ret.length; i++) {
    		if(i != 0)
    			System.out.print(", ");
    		System.out.print(ret[i]);
    	}
    	System.out.println("] 입니다.");
    }
}

다른 방법으로도 풀어보고 싶어서 코드를 다시 작성해보았습니다. 주어진 numbers를 오름차순 정렬한 것과 내림차순 정렬한 것 두 개를 만들어서 조합하는 방식입니다. 시험을 한번 보았더니, 틀린 부분만 찾아서 고치는 것으로는 부족한 것 같아서 전체 작성하는 문제처럼 연습해 보고 있습니다. 아래에서는 Arrays.sort()로 내림차순 정렬하는 것과 버블 정렬 알고리즘으로 정렬하는 두 가지 방식으로 정렬해보았습니다.

import java.util.*;

class Solution {
    public int[] solution(int[] numbers) {
        int[] answer = {};

        Arrays.sort(numbers);

		//1. Arrays.sort 이용하여 내림차순 정렬
		Integer[] numbersReverse = new Integer[numbers.length];

		for(int k=0;k<numbers.length;k++){
			numbersReverse[k]=numbers[k];
		}
		//배열을 내림차순 정렬하기 위해서는 기본타입인 int면 안되고 Integer여야 함
		Arrays.sort(numbersReverse, Collections.reverseOrder());

		int[] numbersReverse = numbers.clone();

		//2. 버블정렬로 내림차순 정렬
//		int tmp;
//		for(int k=0;k<numbersReverse.length;k++){
//			for(int l=0;l<numbersReverse.length-k-1;l++){
//				if(numbersReverse[l+1]>numbersReverse[l]){
//					tmp=numbersReverse[l];
//					numbersReverse[l]=numbersReverse[l+1];
//					numbersReverse[l+1]=tmp;
//				}
//			}
//		}

		//중간지점을 저장하고
		int mid = (numbers.length - 1) / 2;

		int i=mid;
		int j=0;
		//중간지점부터 끝까지 내림차순 정렬한 값으로 대체
		while(i<numbers.length){
			numbers[i]=numbersReverse[j];
			i++;
			j++;
		}

        answer = numbers;
        return answer;
    }

    // 아래는 테스트케이스 출력을 해보기 위한 main 메소드입니다. 아래에는 잘못된 부분이 없으니 위의 코드만 수정하세요.
    public static void main(String[] args) {
    	Solution sol = new Solution();
    	int[] numbers = {7, 3, 4, 1, 2, 5, 6};
    	int[] ret = sol.solution(numbers);

    	// [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
    	System.out.print("solution 메소드의 반환 값은 {");
    	for(int i = 0; i < ret.length; i++) {
    		if(i != 0)
    			System.out.print(", ");
    		System.out.print(ret[i]);
    	}
    	System.out.println("} 입니다.");
    }
}

 

정답


혼자 풀이와 정답이 동일합니다.

실습은 아래 참고


2022.10.25 - [Programming/Cos Pro 1급] - Cos Pro 1급 공부 사이트 추천 - 구름 에듀(https://edu.goorm.io/)

 

Cos Pro 1급 공부 사이트 추천 - 구름에듀(https://edu.goorm.io/)

구름 EDU??? YBM 공식 사이트에서 받은 문제 지문/문제 코드/정답 코드를 intellij에서 공부하다가 후배 추천으로 구름 에듀를 알게 되었습니다. 문제 지문 따로 문제 코드 따로 열어보는 게 여간 불

woogong80.tistory.com

 

728x90

댓글