본문 바로가기
programming/알고리즘 풀이

[SWEA] 3499. 퍼펙트 셔플

by 몽구스_ 2021. 8. 6.
728x90

 

[SWEA] 3499. 퍼펙트 셔플

 

 

SW Expert Academy

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

swexpertacademy.com

 

 

 

 

[입력]

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

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

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

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

[출력]

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

 

 

[풀이]

 

처음에 카드를 반 나눈 뒤, 앞쪽은 S1 배열에 넣고 뒷쪽은 S2 배열에 넣는다.

카드가 4장일 경우 2장, 2장으로 나눌 수 있지만

카드가 5장일 경우 홀수여서 3장, 2장으로 나눠야 한다.

따라서 half라는 변수는 N/2을 하면 소수점이 떨어져서 2가 되니까 N-half해준것을 앞쪽 배열에 적용해준다.

이 작업으로 앞쪽은 홀수일때 무조건 한장 더 많은 카드를 갖게 된다.

그리고 S 라는 배열에 S1과 S2를 번갈아 뽑아 저장해준다.

0 2 4 같은 짝수 인덱스에는 S1이 순서대로 들어가고

1 3 5 같은 홀수 인덱스에 S2가 들어가면 모든 카드가 번갈아서 S에 들어간다.

 

 

public class al3499 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int T;
		T=sc.nextInt(); //테스트케이스 몇개인지 입력받기
		

		for(int test_case = 1; test_case <= T; test_case++) //테스트케이스 수만큼 반복
		{
			int N = sc.nextInt(); //카드 장수
			int half = N/2; //반으로 나눠서 두개의 배열 만들기
			String[] S = new String[N]; //섞인 카드가 들어갈 배열
			String[] S1 = new String[N - half]; //반 나눈 것의 앞쪽
			String[] S2 = new String[half]; //반 나눈 것의 뒷쪽
			
			for (int i = 0; i < N - half; i++) {
				S1[i] = sc.next();
			}
			
			for (int i = 0; i < half; i++) {
				S2[i] = sc.next();
			}
			
			int idx = 0;
			
			for (int i = 0; i < N; i++) {
				if(i % 2 == 0) { //처음엔 앞쪽 카드부터 들어가기
					S[i] = S1[idx];
				}else { //그 뒤엔 뒤쪽 카드의 처음부터 들어가기
					S[i] = S2[idx++];
				}
				
			}
			
			System.out.print("#" + test_case + " ");
			for (String str : S) {
				System.out.print(str + " ");
			}
			System.out.println();
		}
	}

}

 

  • 40,484 kb메모리
  • 200 ms실행시간
  • 801코드길이
  • Pass결과

'programming > 알고리즘 풀이' 카테고리의 다른 글

[백준(Baekjoon)] 2563.색종이  (0) 2021.08.11
[백준(Baekjoon)] 2493. 탑  (0) 2021.08.10
[SWEA] 1873. 상호의 배틀필드  (0) 2021.08.05
[SWEA] 1218. 괄호 짝짓기  (0) 2021.08.05
[SWEA] 2001. 파리 퇴치  (0) 2021.08.05

댓글