Programming Language/문제

[코드업] 1402 : 거꾸로 출력하기 3

장영현 2023. 6. 17. 22:14
728x90

https://codeup.kr/problem.php?id=1402&rid=0 

 

거꾸로 출력하기 3

첫째 줄에 데이터의 개수 n이 입력된다. ( n <= 1,000 ) 둘째 줄에 공백을 기준으로 n개 데이터가 입력된다.

codeup.kr

//스택 기능 함수로 구현한 코드
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 1000

typedef struct {
    int data[MAX_SIZE];
    int top;
} Stack;

void initialize(Stack* stack) {
    stack->top = -1;
}

int isFull(Stack* stack) {
    return stack->top == MAX_SIZE - 1;
}

int isEmpty(Stack* stack) {
    return stack->top == -1;
}

void push(Stack* stack, int value) {
    if (isFull(stack)) {
        return;
    }

    stack->data[++stack->top] = value;
}

int pop(Stack* stack) {
    if (isEmpty(stack)) {
        return -1;
    }

    return stack->data[stack->top--];
}

void reversePrint(Stack* stack) {
    while (!isEmpty(stack)) {
        printf("%d ", pop(stack));
    }
    printf("\n");
}

int main() {
    Stack stack;
    initialize(&stack);

    int num, value;
    scanf("%d", &num);

    for (int i = 0; i < num; i++) {
        scanf("%d", &value);
        push(&stack, value);
    }

    reversePrint(&stack);

    return 0;
}
//간단하게 축약한 코드1
#include <stdio.h> 
int main() {
	int n, a[1000];

	scanf("%d", &n);

	for (int i = n - 1; i >= 0; i--) {
		scanf("%d", &a[i]);
	}

	for (int i = 0; i <= n - 1; i++) {
		printf("%d ", a[i]);
	}

	return 0;
}
//간단하게 축약한 코드2
#include <stdio.h>
#include <stdlib.h>
int main() {
    int N;
    scanf("%d", &N);

    int* stack_num = (int*)malloc(N * sizeof(int));

    if (stack_num == NULL) {
        printf("메모리 할당 오류\n");
        return 1;
    }
    for (int i = 0; i < N; i++) {
        scanf("%d", &stack_num[i]);
    }

    for (int i = N-1; i >= 0; i--) {
        printf("%d ", stack_num[i]);
    }

    free(stack_num);

    return 0;
}

위 코드는 입력받은 수를 스택에 저장하고, reversePrint함수를 호출하여 스택의 요소를 역순으로 출력.

 

함수의 매개변수를 포인터로 받은 이유

  1. 값 변경 목적 = 함수가 매개변수를 밧으로 받으면, 함수 내에서 그 값의 복사본이 생성된다. 따라서 함수 내에서 이 복사본을 변경하더라도 원본 변수에는 영향을 주지 않는다. 하지만 포인터로 매개변수를 받으면, 함수 내에서 원본 변수의 주소를 참조하여 값을 변경할 수 있다. 함수로부터 반환되는 값 이외에도 원본 변수의 상태를 변경하기 위해 사용
  2. 메모리 접근의 효율성 = 배열이나 구조체와 같은 큰 데이터 구조를 함수에 전달할 때, 값으로 전달하면 해당 데이터 구조의 복사본이 생성되에 메모리 사용량이 증가하고 성능이 저하될 수 있다. 그러나 포인터로 매개변수를 받으면 원본데이터 구조에 대한 포인터만 전달되므로, 메모리 사용량과 성능면에 효율적