코딩 테스트

[HackerRank] Zig Zag Sequence

juble 2024. 10. 4. 17:01

Problem


 

In this challenge, the task is to debug the existing code to successfully execute all provided test files.


Given an array of n distinct integers, transform the array into a zig zag sequence by permuting the array elements. A sequence will be called a zig zag sequence if the first  elements in the sequence are in increasing order and the last k elements are in decreasing order, where k=(n+1)/2 . You need to find the lexicographically smallest zig zag sequence of the given array.

 

Example.

a = [2, 3, 5, 1, 4]

Now if we permute the array as [1, 4, 5, 3, 2] , the result is a zig zag sequence.

Debug the given function findZigZagSequence to return the appropriate zig zag sequence for the given input array.

 

Note: You can modify at most three lines in the given code. You cannot add or remove lines of code.

To restore the original code, click on the icon to the right of the language selector.

Input Format

The first line contains t the number of test cases. The first line of each test case contains an integer n, denoting the number of array elements. The next line of the test case contains n elements of array a.

Constraints

1 ≤ t   20 
1    n    10000 (n is always odd)

1    a i   10^9

Output Format

For each test cases, print the elements of the transformed zig zag sequence in a single line.

 


제공된 모든 테스트 파일을 성공적으로 실행하기 위해 기존 코드를 디버깅하는 것입니다.

 

서로 다른 정수로 이루어진 배열이 주어졌을 때, 배열 요소들을 순열하여 지그재그 시퀀스로 변환하는 것이 목표입니다. 시퀀스는 첫 번째 절반의 요소들이 오름차순으로 정렬되고, 마지막 절반의 요소들이 내림차순으로 정렬될 때 지그재그 시퀀스라고 합니다. 여기서 마지막 절반의 요소 수는 k=(n+1)/2 로 정의됩니다. 주어진 배열의 사전순으로 가장 작은 지그재그 시퀀스를 찾아야 합니다.

 

예시

배열 a = [2, 3, 5, 1, 4일 때, 배열을 [1, 4, 5, 3, 2로 순열하면 결과적으로 지그재그 시퀀스가 됩니다.

 

문제 해결을 위해 주어진 함수 findZigZagSequence를 디버깅하여 주어진 입력 배열에 대해 올바른 지그재그 시퀀스를 반환하도록 해야 합니다.

 

제한 사항

코드에서 최대 세 줄만 수정할 수 있으며, 코드에 새로운 줄을 추가하거나 기존 줄을 제거할 수 없습니다.

 

입력 형식

  • 첫 번째 줄에는 테스트 케이스의 수를 나타내는 정수 T가 주어집니다.
  • 각 테스트 케이스의 첫 번째 줄에는 배열 요소의 개수를 나타내는 정수 n이 주어집니다.
  • 각 테스트 케이스의 다음 줄에는 배열의 요소들로 이루어진 n개의 정수가 주어집니다.

제약 사항

  • 1 ≤ T ≤ 20
  • 1 ≤ n ≤ 10000 (n은 항상 홀수입니다.)
  • 배열 요소는 모두 서로 다른 정수입니다.

출력 형식

각 테스트 케이스에 대해 변환된 지그재그 시퀀스의 요소들을 한 줄에 출력하세요.

 

Solution


import java.util.*;
import java.lang.*;
import java.io.*;
import java.math.*;
public class Main {
    
    public static void main (String[] args) throws java.lang.Exception {
        Scanner kb = new Scanner(System.in);
        int test_cases = kb.nextInt();
        for(int cs = 1; cs <= test_cases; cs++){
            int n = kb.nextInt();
             int a[] = new int[n];
            for(int i = 0; i < n; i++){
                a[i] = kb.nextInt();
            }
            findZigZagSequence(a, n);
        }
   }
   
    public static void findZigZagSequence(int [] a, int n){
        Arrays.sort(a);
        int mid = n/2;  // 수정된 부분
        int temp = a[mid];
        a[mid] = a[n - 1];
        a[n - 1] = temp;
    
        int st = mid + 1;
        int ed = n - 2;  // 수정된 부분
        while(st <= ed){
            temp = a[st];
            a[st] = a[ed];
            a[ed] = temp;
            st = st + 1;
            ed = ed - 1;  // 수정된 부분
        }
        for(int i = 0; i < n; i++){
            if(i > 0) System.out.print(" ");
            System.out.print(a[i]);
        }
        System.out.println();
    }
}

 

이게 문제의 정답이다. 

다만 이 문제를 굉장히 오래 잡고 있었는데, 그 이유는 ... 내가 푸는 문제에는 기존 코드가 없었기 때문이다. 

그럼 위 코드는 어디서 왔느냐?

 

https://www.hackerrank.com/challenges/zig-zag-sequence/problem

 

Zig Zag Sequence | HackerRank

Find a zig zag sequence of the given array.

www.hackerrank.com

이 사이트에 들어가면 각 언어별로 코드가 주어진다. 

여기에서 3줄을 수정한 후 실행해보면 잘 실행된다. 

하지만 내가 원래 1주 연습 하던 Day3 문제에서는 빈 코드이다. 

Java15 - 똑같은 코드를 붙여놔도 테스트 통과가 되지 않는다.

위 사진처럼 Wrong Answer이라고 뜨며 내 Output에는 no response on stdout 이라고 뜬다. 

즉, 위 문제는 오류가 있는 문제라는 것 같다. 

문제에서도 코드를 수정하라고 나와있는데, 실제 위 문제에서는 코드도 주어지지 않았기 때문이다. 

그런데 다시 보니, 내가 위에 준 사이트에는 Java15버전 코드가 없다. 

그런데 나는 Java15 를 선택하고 위 코드로 작성하니 통과되질 않았던 것이다. 

 

다시 Java8로 선택하고 위 코드로 작성했더니 

Java8 - 위 코드로도 잘 실행된다.

위 사진과 같이 잘 통과했다. 버전 문제였나보다... 이것때문에 다른 사람들 코드도 보고 여러가지 다 해봤는데 안돼서 왜 이러나 싶었는데 버전 문제였다니 조금 .. 어이없긴 하다 흑.. 

 

그래도 문제 자체도 꽤 난이도가 있었다고 생각한다. 

그래서 주석을 포함하면 이렇다. 

import java.util.*;
import java.lang.*;
import java.io.*;
import java.math.*;

public class Main {
    
    public static void main (String[] args) throws java.lang.Exception {
        Scanner kb = new Scanner(System.in); // Scanner 객체를 사용하여 입력을 받습니다.
        int test_cases = kb.nextInt(); // 테스트 케이스 수를 입력받습니다.

        for(int cs = 1; cs <= test_cases; cs++) { // 각 테스트 케이스에 대해 반복합니다.
            int n = kb.nextInt(); // 배열의 크기를 입력받습니다.
            int a[] = new int[n]; // 주어진 크기로 배열을 생성합니다.
            for(int i = 0; i < n; i++) {
                a[i] = kb.nextInt(); // 배열의 요소를 입력받습니다.
            }
            findZigZagSequence(a, n); // 지그재그 시퀀스를 찾는 메서드를 호출합니다.
        }
        kb.close(); // Scanner 객체를 닫습니다.
    }
   
    public static void findZigZagSequence(int [] a, int n) {
        Arrays.sort(a); // 배열을 오름차순으로 정렬합니다.
        int mid = n / 2; // 중간 인덱스를 계산합니다.

        // 중간 요소와 마지막 요소를 교환합니다.
        int temp = a[mid];
        a[mid] = a[n - 1];
        a[n - 1] = temp;
    
        // 중간 인덱스 이후의 요소들을 내림차순으로 정렬합니다.
        int st = mid + 1; // 시작 인덱스
        int ed = n - 2; // 끝 인덱스
        while(st <= ed) {
            // 시작과 끝의 요소를 교환합니다.
            temp = a[st];
            a[st] = a[ed];
            a[ed] = temp;
            st = st + 1; // 시작 인덱스를 증가시킵니다.
            ed = ed - 1; // 끝 인덱스를 감소시킵니다.
        }
        
        // 결과를 출력합니다.
        for(int i = 0; i < n; i++) {
            if(i > 0) System.out.print(" "); // 첫 번째 요소 앞에는 공백을 추가합니다.
            System.out.print(a[i]); // 배열의 요소를 출력합니다.
        }
        System.out.println(); // 줄 바꿈
    }
}

 

728x90
반응형