728x90
[SWEA] 3499. 퍼펙트 셔플
[입력]
첫 번째 줄에 테스트 케이스의 수 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 |
댓글