C언어 2차원배열 중복제거 질문.

4X6 의 2차원 배열에 rand 함수를 사용해 중복수가 없이 1부터 24까지 넣어야 합니다.

goto 문을 사용 안합니다.

4중 for을 꼭 사용해서 만들어야 합니다.ㅠ
현재는 여기까지 해봤는데 잘모르겠습니다 …

    for (i = 0; i < 4; i++) {
		for (j = 0; j < 6; j++) {
			score[i][j] = 1 + rand() % 24;
			for (k = 0; k < i; k++) {
				if(s==1) {
					s=0;
					j--;
					break;
				}
				for (z = 0; z<j; z++) {
					if (score[i][j] == score[k][z]) {
						j--;
						s++;
						break;
					}
				}
			}
		}
	}

안녕하세요. ㅎㅎㅎ

일단 중복수가 없어야 하므로, 지금까지 나온 숫자들을 체크해야겟죠?
하지만 그렇게 구현하면 귀찮자나요 ㅎㅎㅎ

이렇게 하는건 어떨까요?

  1. 1부터 24까지 숫자를 배열에 넣습니다.

  2. 그리고 그 배열을 섞어줍니다. 셔플셔플~

  3. 섞인 배열 앞부터 순서대로 2차원배열에 복사합니다.

2 Likes
for(전체 세로 범위)
 for(전체 가로 범위)
  random
  for(이전 세로 범위)
   for(이전 가로 범위)
    중복검사
  실패시 가로--

for 4개 써야한다면 이 솔루션일듯 하네요.

j--;

가 중복되네요.
그리고 s를 저 if에서 초기화 한다면 저 If로 들어가지 않는 분기가 있겠죠 k == i - 1 일 때

1 Like

for문도 못쓰는 뉴비는 늅늅하고 웁니다

C++이면 다음과 같이 가능합니다.

#include <random>
#include <vector>
#include <numeric>
#include <algorithm>
using namespace std;

int main() {
    vector<int> v(24);
    iota(v.begin(), v.end(), 1);
    shuffle(v.begin(), v.end(), mt19937(random_device{}()));
    constexpr size_t R = 4, C = 6;
    vector<vector<int>> matrix(R, vector<int>(C, 0));
    for (size_t i = 0; i < R; i++) {
        copy(v.begin() + i * C, v.begin() + (i + 1) * C, matrix[i].begin());
    }
}

이 로직을 C로 잘 바꿔봅시다

3 Likes

C로 짜면 이런 식이 되겠네요

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define R 4
#define C 6
#define SIZE (R)*(C)

void swap(int a[static 1], int b[static 1]) {
    int tmp = a[0];
    a[0] = b[0];
    b[0] = tmp;
}

int main(void) {
    // random seed initialization
    struct timespec ts;
    timespec_get(&ts, TIME_UTC);
    srand(ts.tv_sec * 1000 + ts.tv_nsec / 1000);

    // initialization
    int array[SIZE] = {0};
    for (size_t i = 0; i < SIZE; i++) {
        array[i] = i + 1;
    }

    // shuffle
    for (size_t i = SIZE - 1; i >= 1; i--) {
        size_t j = rand() % (i + 1);
        swap(array[i], array[j]);
    }

    // verify
    for (size_t r = 0; r < R; r++) {
         for (size_t c = 0; c < C; c++) {
              printf("%d ", array[r * C + c]);
         }
         puts("\n");
    }
}
3 Likes

c가 확실히 불편하긴 하네요

제가 말씀드린게 바로 이겁니다. 우왕 ^^/
멋져요!!

그런데 static 1은 무엇인가요?

https://en.cppreference.com/w/c/language/array

함수 파라미터 내의 배열 인덱스에 static을 달면 컴파일러가 null pointer가 넘어오지 못하도록 검사합니다. [static N]의 경우 넘어오는 배열이 최소 N개 원소가 null이 아니어야 합니다

C++에는 없어요

2 Likes

우와 그런기능이 있다니 좋네요 ㅎㅎㅎ

c++에서는 레퍼런스형태로 받으면 그만이라 없는걸까요? ㅋㅋㅋ

예 하나면 reference로 받으면 되고, 여러개면 std::arraystd::vector에서는 size()가 있기 때문에 C++에는 저 기능이 필요없죠. 최근엔 std::span같은 것도 나왔구요.

static array indices는 C++의 하위호환인 C에서 머리를 굴린 자구책인 셈…

2 Likes