코딩테스트/SWExpertAcademy

조 만들기 C++(SW Expert Academy)

멍토 2020. 4. 9.

난이도 : D3

문제번호 : 8104

※ 저의 풀이가 무조건적인 정답은 아닙니다.

다른 코드가 좀더 효율적이고 좋을 수 있습니다.

다른사람들의 풀이는 언제나 참고만 하시기 바랍니다.

문제 주소 및 출처입니다.

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWwXCn2KQjEDFATu&categoryId=AWwXCn2KQjEDFATu&categoryType=CODE

 

SW Expert Academy

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

swexpertacademy.com


목차

1. 문제 설명

2. 문제 해석

3. 소스 코드


1. 문제 설명

삼성대학교 프로그래밍 기초 과목에서 조별과제를 위해 N명으로 구성된 조를 K개 만들고자 한다.

프로그래밍 과목의 수강 인원은 정확히 N × K명이기 때문에, 완벽하게 조를 구성하는 것이 가능하다.

조에 들어가는 사람들의 실력을 최대한 균등하게 하기 위해 이미 치른 중간고사 성적을 이용한다.

성적은 모든 학생들이 달랐기 때문에, 1등에서 N × K등의 학생이 정해져 있다.

각 조에 1번에서 K번까지의 번호를 붙인 다음과 같이 K개의 조를 구성한다.

- 1등에서 K등인 학생은 순서대로 1번 조에서 K번 조까지 들어간다.

- K+1등에서 2K등인 학생은 역순으로 1번 조에서 K번 조까지 들어간다.

- 2K+1등에서 3K등인 학생은 순서대로 1번 조에서 K번 조까지 들어간다.

- …

예를 들어, N = 10 K = 20이면, 1번 조에는 1등, 40등, 41등, 80등, 81등, 120등, 121등, 160등, 161등, 200등인 학생이 들어간다.

교수님은 각 조의 실력이 조원인 학생들의 등수를 모두 더한 것이라고 생각한다.

즉, 앞의 예에서 든 1번 조의 실력은 1+40+41+80+81+120+121+160+161+200=1005이다.

N, K가 주어질 때, 1번 조에서 K번 조까지 실력을 순서대로 모두 구하는 프로그램을 작성하라.

입력

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

각 테스트 케이스의 첫 번째 줄에는 두 정수 N, K(1 ≤ N, K ≤ 20)가 공백 하나로 구분되어 주어진다.

출력

각 테스트 케이스마다 ‘#x’(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고,

각 테스트 케이스마다 1번 조의 실력에서 K번 조의 실력을 나타내는 K개의 정수를 순서대로 공백 하나로 구분하여 출력한다.

예시

입력 출력

1
4 6

#1 50 50 50 50 50 50 

2. 문제풀이

규칙만 찾으면 바로 풀 수 있다고 하는데 그냥 시키는 대로 풀었다...

아래 위로 지그지그로 돌면서 배열을 채워주고

밑에서 row를 각각 더해서 값을 만들었다.


3. 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <vector>
using namespace std;
 
//D3 8104 조 만들기
 
int main(){
    int T, n, k = 0;
    cin >> T;
    for (int t = 1; t <= T; t++) {
        cin >> n >> k;
        vector<vector<int>> arr(k);
        int count = 1;
        //정방향, 역방향으로 계산
        for (int i = 0; count <= n*k; i++) {
            for (int j = 0; j < k; j++)
                arr[j].push_back(count++);
            //조원이 홀수인경우를 위해 멈춤
            if (count > n*k) break;
            for (int j = k-1; j>=0; j--)
                arr[j].push_back(count++);
        }
        cout << "#" << t << " ";
        for (int i = 0; i < k; i++) {
            int answer = 0;
            for (int j = 0; j < arr[i].size(); j++) {
                answer += arr[i][j];
            }
            cout << answer << ' ';
        }
        cout << endl;
    }
    return 0;
}

댓글

💲 광고입니다.