반응형

@notepad_jj2

츄르사려고 코딩하는 코집사입니다.


1. [SW expert Academy] SWEA 3499번 퍼펙트 셔플 자바(Java)

1) 난이도 : D3

 

2) 문제번호 : 3499번

 

3) 문제 출처

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWGsRbk6AQIDFAVW

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

2. 문제

카드를 퍼펙트 셔플 한다는 것은, 카드 덱을 정확히 절반으로 나누고 나눈 것들에서 교대로 카드를 뽑아 새로운 덱을 만드는 것을 의미한다. 

정확한 방식은 다음 그림과 같다.


N개의 카드가 있는 덱이 주어질 때 이를 퍼펙트 셔플하면 어떤 순서가 되는지 출력하는 프로그램을 작성하라.

만약 N이 홀수이면, 교대로 놓을 때 먼저 놓는 쪽에 한 장이 더 들어가게 하면 된다.

3. 제약사항

 

4. 입력

첫 번째 줄에 테스트 케이스의 수 T가 주어진다.

각 테스트 케이스의 첫 번째 줄에는 자연수 N(1 ≤ N ≤ 1,000)이 주어진다.

두 번째 줄에는 덱에 카드가 놓인 순서대로 N개의 카드 이름이 공백으로 구분되어 주어진다.

카드의 이름은 알파벳 대문자와 ‘-’만으로 이루어져 있으며, 길이는 80이하이다.

 

5. 출력

각 테스트 케이스마다 주어진 덱을 퍼펙트 셔플한 결과를 한 줄에 카드 이름을 공백으로 구분하여 출력한다.

6. 풀이

- boolean을 사용하여 서로 번갈아가면서 대입

- 재귀호출 방법으로 풀 수 있을거 같은데 생각이 떠오르진 않는다.

7. 소스 코드

import java.util.*;

public class Solution {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		for (int tc = 1; tc <= T; tc++) {
			int N = sc.nextInt();
			String[] arr = new String[N];
			String[] result = new String[N];
			int first = 0;
			int mid = 0;
			if(N%2==0) {
				mid = N/2;
			}
			else {
				mid = N/2+1;
			}

			boolean sign = true;
			
			for(int i=0;i<N;i++) {
				arr[i] = sc.next();
			}
			
			
			for(int i=0;i<N;i++) {
				if(sign) {
					result[i] = arr[first];
					first++;
					sign = false;
				}
				else {
					result[i] = arr[mid];
					mid++;
					sign = true;
				}
				
			}
				
			System.out.printf("#%d ", tc);
			for(int i=0;i<N;i++) {
				System.out.print(result[i] + " ");				
			}
			System.out.println();

		}

	}
}

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기