C언어 (제 기준) 어려운 문제

문제 4-1하고 4-2는 풀었는데, 4-3을 도저히 못풀겠어요.
사실 4-2도 겨우 겨우 끼워맞춰서 풀은 느낌이라, 4-3에 적용을 못시키는 거 같긴 해요…
(제 풀이방식대로 가면 아예 말려버려서 제 코드는 첨부 안하겠습니다. 아, 물론 돌아가지도 않지만요…ㅠㅠ)
이 문제만 5시간 넘게 붙잡고 있었는데 못풀겠어요…
혹시 해결해주실 수 있는 분 계실까요? 부탁드립니다 ㅠㅠㅠㅠ 머리 터질 거 같아요… 하…

#pragma warning(disable:4996)
#include <stdio.h>

참고로 맨 위에는 이 2개만 써야 해요.

4-3을 안올리셨는데요…

그리고 혹시 모르니 4-1, 4-2 코드 첨부해주세요. 어느정도 수준까지 이해하셨는지 판단하는데에 좋은 근거가 됩니다.

이미지 클릭하면 전체 이미지로는 보이네염

1 Like

제가 씨언어는 잘 몰라서 일단 파이썬으로 짜 보았는데 조금이나마 도움이 되시길 바랍니다

def splitBy3(lst):
    return [lst[i: i+3] for i in range(0, len(lst), 3)]


def main():
    intList = [int(i) for i in input().split()]
    print("input is:", intList)
    print(list(reversed(intList)))

    lstlst = splitBy3(intList)

    getMinMaxLst(lstlst, lstlst)
    print()


def getMinMaxLst(maxLstLst, minLstLst):
    maxLst = [max(i) for i in maxLstLst]
    minLst = [min(i) for i in minLstLst]
    print(maxLst)
    print(minLst)

    if len(maxLst) == 1 and len(minLst) == 1:
        return

    getMinMaxLst(splitBy3(maxLst), splitBy3(minLst))


if __name__ == "__main__":
    main()

결과값은 다음과 같습니다.

3 Likes

우선 세문제 순서대로 풀어보긴 했는데 대충 풀기도해서 기존 출력 테스트케이스랑은 좀 다르긴 하네요 그래도 비슷한 로직으로 해결할 순 있을 것 같습니다. 우선 코드부터 보여드리면…

/*
							< 4 - 1 >
*/
#include <stdio.h>

#define BUF_SIZE 20

int main() {

	int N = 0;

	scanf_s("%d", &N);
	if (!(N >= 1 && N <= 20))
		return -1;

	int buf[BUF_SIZE];

	for (int i = 0; i < N; i++)
		scanf_s("%d", buf + i);

	for (int i = N - 1; i >= 0; i--)
		printf("%d ", *(buf + i));

	return 0;
}

/*
							< 4 - 2 >
*/
#include <stdio.h>

#define BUF_SIZE 20
#define TOKEN_SIZE 3

int main() {

	int N = 0;
	int buf[BUF_SIZE];
	int max[BUF_SIZE] = { 0, };
	int min[BUF_SIZE] = { 0, };
	int MAX_NUM, MIN_NUM;
	scanf_s("%d", &N);
	if (!(N >= 1 && N <= 20))
		return -1;

	for (int i = 0; i < N; i++)
		scanf_s("%d", buf + i);

	for (int i = 0; i < N; i += TOKEN_SIZE) {
		MAX_NUM = MIN_NUM = buf[i];
		for (int j = i; j < N && j < i + 3; j++) {
			if (MAX_NUM < buf[j])
				MAX_NUM = buf[j];
			if (MIN_NUM > buf[j])
				MIN_NUM = buf[j];
		}
		max[i / TOKEN_SIZE] = MAX_NUM;
		min[i / TOKEN_SIZE] = MIN_NUM;
	}

	for (int i = N - 1; i >= 0; i--)
		printf("%d ", *(buf + i));
	printf("\n\n");

	for (int i = 0; max[i]; i++)
		printf("%d ", *(max + i));
	printf("\n\n");

	for (int i = 0; min[i]; i++)
		printf("%d ", *(min + i));
	printf("\n\n");

	return 0;
}

/*
							< 4 - 3 >
*/
#include <stdio.h>

#define TOKEN_SIZE 3
#define BUF_SIZE 20

void FIND_MAX_MIN(int buf[], int max[], int min[], int N);
void FIND_MAX(int max[], int N);
void FIND_MIN(int min[], int N);
void Show_array(int arr[], int N);

int main() {

	int min[BUF_SIZE] = { 0, };
	int max[BUF_SIZE] = { 0, };
	int buf[BUF_SIZE] = { 0, };
	int N = 0;
	scanf_s("%d", &N);
	if (!(N >= 1 && N <= 20))
		return -1;

	for (int i = 0; i < N; i++)
		scanf_s("%d", buf + i);

	FIND_MAX_MIN(buf, max, min, N);

	Show_array(buf,N);

	printf("Max : %d, Min : %d\n", max[0], min[0]);

	return 0;
}

void FIND_MAX_MIN(int buf[], int max[], int min[], int N) {

	if (N == 1)
		return;
	int MAX_NUM, MIN_NUM;

	for (int i = 0; i < N; i += TOKEN_SIZE) {
		MAX_NUM = MIN_NUM = buf[i];
		for (int j = i; j < N && j < i + 3; j++) {
			if (MAX_NUM < buf[j]) 
				MAX_NUM = buf[j];
			if (MIN_NUM > buf[j]) 
				MIN_NUM = buf[j];
		}
		max[i / TOKEN_SIZE] = MAX_NUM;
		min[i / TOKEN_SIZE] = MIN_NUM;
	}
	N = ((N % TOKEN_SIZE == 0) ? N / TOKEN_SIZE : N / TOKEN_SIZE + 1);

	Show_array(max, N);
	Show_array(min, N);

	FIND_MAX(max,N);
	FIND_MIN(min,N);
}

void FIND_MAX(int max[], int N) {

	int MAX_NUM;
	if (N <= 1)
		return;
	for (int i = 0; i < N; i += TOKEN_SIZE) {
		MAX_NUM = max[i];
		for (int j = i; j < N && j < i + 3; j++) {
			if (MAX_NUM < max[j])
				MAX_NUM = max[j];
		}
		max[i / TOKEN_SIZE] = MAX_NUM;
	}
	N = ((N % TOKEN_SIZE == 0) ? N / TOKEN_SIZE : N / TOKEN_SIZE + 1);
	Show_array(max, N);
	FIND_MAX(max, N);
}

void FIND_MIN(int min[], int N) {

	int MIN_NUM;
	if (N <= 1)
		return;
	for (int i = 0; i < N; i += TOKEN_SIZE) {
		MIN_NUM = min[i];
		for (int j = i; j < N && j < i + 3; j++) {
			if (MIN_NUM > min[j])
				MIN_NUM = min[j];
		}
		min[i / TOKEN_SIZE] = MIN_NUM;
	}
	N = ((N % TOKEN_SIZE == 0) ? N / TOKEN_SIZE : N / TOKEN_SIZE + 1);
	Show_array(min, N);
	FIND_MIN(min, N);
}

void Show_array(int arr[],int N) {

	for (int i = 0; i < N; i++)
		printf("%d ", *(arr + i));
	printf("\n\n");
}

그리구 질문하실떄 못 푸셨더라도 코드를 같이 올려주시면 더 좋습니당
해결 안되고 계시면 못푸신 코드라도 올려주세요 같이 해결해봐용

1 Like

여기서는 숙제에 대한 조언을 구하시고, 숙제는 스스로 해보도록 노력하세요.
5시간밖에 고민해보지 않았으면서 모든 조건을 만족하게 숙제를 대신해달라는건 좀 아니지 않아요?

#include <stdio.h>
#include <algorithm>

void cal_max(int in[], int in_len, int out[], int* out_len) {
	int i, j;
	for (i = 0, j = 0; i < in_len; i += 3, ++j) {
		if (in_len - i > 2) {
			out[j] = std::max({ in[i], in[i + 1], in[i + 2] });
		}
		else if (in_len - i == 2) {
			out[j] = std::max(in[i], in[i + 1]);
		}
		else {
			out[j] = in[i];
		}
	}
	*out_len = j;
}

void cal_min(int in[], int in_len, int out[], int* out_len) {
	int i, j;
	for (i = 0, j = 0; i < in_len; i += 3, ++j) {
		if (in_len - i > 2) {
			out[j] = std::min({ in[i], in[i + 1], in[i + 2] });
		}
		else if (in_len - i == 2) {
			out[j] = std::min(in[i], in[i + 1]);
		}
		else {
			out[j] = in[i];
		}
	}
	*out_len = j;
}

void print_arr(int arr[], int len) {
	for (int i = 0; i < len; ++i)
		printf("%d ", arr[i]);

	printf("\n");
}

int main() {
	int n = 0, m = 0, max_arr[20], min_arr[20];
	scanf("%d", &n);
	for (int i = 0; i < n; ++i)
		scanf("%d", max_arr + i);

	memcpy(min_arr, max_arr, n * sizeof(int));
	
	while (m != 1) {
		cal_max(max_arr, n, max_arr, &m);
		cal_min(min_arr, n, min_arr, &m);

		print_arr(max_arr, m);
		print_arr(min_arr, m);

		n = m;
	}
}

마찬가지로 max, min은 직접구현하세요.

#include <iostream>
#include <vector>
#include <iterator>
#include <range/v3/all.hpp>

namespace views = ranges::views;

auto main() -> int {
    int N; std::cin >> N;
    auto big = views::generate_n([]() {
        int k; std::cin >> k;
        return k;
    }, N) | ranges::to< std::vector >(), small = big;

    ranges::copy(big | views::reverse, std::ostream_iterator< int >(std::cout, " "));
    std::cout.put('\n');

    while (big.size() > 1) {
        big   = big   | views::chunk(3) | views::transform([](auto&& chunk) { return *ranges::max_element(chunk); }) | ranges::to< std::vector >();
        small = small | views::chunk(3) | views::transform([](auto&& chunk) { return *ranges::min_element(chunk); }) | ranges::to< std::vector >();
        ranges::copy(big  , std::ostream_iterator< int >(std::cout, " "));
        std::cout.put('\n');
        ranges::copy(small, std::ostream_iterator< int >(std::cout, " "));
        std::cout.put('\n');
    }

    return 0;
}

저는 C언어를 잘 몰라서 일단 C++로 풀어드렸습니다.

5 Likes

크으 range 좋죠.

1 Like

이야아…

1 Like

씨쁠쁠 굇수…

1 Like

저는 C++언어를 잘 몰라서 일단 APPLE ][ 베이직으로 작성해 드릴려고 하다가
다른 분들이 열심히 풀었길래 1번 그림만 놓고 갑니다.


8 Likes