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