풀이
배열에 저장해서 풀기위해 직접 손으로 배열을 그려가며 하던 중!
우연히 규칙을 발견하고 이 규칙으로 풀릴까해서 풀어봤더니 풀려서 당황스러웠던 문제였습니다.
우선, 첫 번째 조를 구하는 방법은
N = 4, K = 6인 경우
1조 | 2조 | 3조 | 4조 | 5조 | 6조 | |
조원 1 | 1 | 2 | 3 | 4 | 5 | 6 |
조원 2 | 12 | 11 | 10 | 9 | 8 | 7 |
조원 3 | 13 | 12 | 11 | 10 | 9 | 8 |
조원 4 | 24 | 25 | 26 | 27 | 28 | 29 |
위 표에서 1조의 조원을 잘 보면 첫 번째와 세 번째 조원은 (0 * 6) + 1, (2 * 6) + 1이고 두 번째와 네 번째 조원은 2 * 6, 4 * 6인 것을 확인할 수 있습니다.
이를 통해서 1조의 경우 조원을 i로 표현하면 홀수 조원은 ((i - 1) * k) + 1 이고 짝수 조원은 i * k 가 될 수 있음을 알 수 있습니다.
N = 2, K = 3 | 1 | 2 | 3 |
6 | 5 | 4 | |
합계 | 7 | 7 | 7 |
N = 3, K = 3 | 1 | 2 | 3 |
6 | 5 | 4 | |
7 | 8 | 9 | |
합계 | 14 | 15 | 16 |
위의 표를 잘 보시면 N = 2인 경우 모든 조의 등수의 합이 똑같고 N = 3인 경우는 1조부터해서 1씩 증가함을 알 수 있습니다.
이를 통해서 N이 짝수라면 첫 번째 조의 등수의 합이 다른 조와 같고 N이 홀수라면 첫 번째 조의 등수의 합에서 조의 번호가 늘어갈 때 마다 +1씩 해주면 정답이 됩니다!
코드
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringBuilder answer = new StringBuilder("");
int T = sc.nextInt();
for (int tc = 1; tc <= T; ++tc) {
int n = sc.nextInt();
int k = sc.nextInt();
answer.append("#" + tc + " ");
int group_1_score = 0;
for (int i = 1; i <= n; ++i) {
if (i % 2 == 0) {
// 짝수면 조원의 등수가 i * k씩 증가
group_1_score += (i * k);
}
else {
// 홀수면 조원의 등수가 (k * (i - 1)) + 1씩 증가
group_1_score += ((i - 1) * k) + 1;
}
}
for (int i = 0; i < k; ++i) {
if (n % 2 != 0) {
// 팀원의 수가 홀수면 첫 번째 팀 부터 맨 마지막 팀까지 +1 씩 증가
answer.append((group_1_score + i) + " ");
}
else {
// 짝수라면 모든 조의 합이 동일
answer.append(group_1_score + " ");
}
}
System.out.println(answer);
answer.setLength(0);
}
sc.close();
}
}
'알고리즘 > SWEA' 카테고리의 다른 글
[Java] SWEA 6019번 기차사이의 파리 (0) | 2021.02.02 |
---|---|
[Java] SWEA 3376번 파도반 수열 (0) | 2021.02.01 |
[Java] SWEA 2805번 농작물 수확하기 (0) | 2021.01.31 |
[Java] SWEA 5215번 햄버거 다이어트 (0) | 2021.01.29 |
[Java] SWEA 6808번 규영이와 인영이의 카드게임 (0) | 2021.01.27 |