woonadz :)

[백준/C언어] 스택_10828번_nabi 본문

IT/백준

[백준/C언어] 스택_10828번_nabi

C_scorch 2022. 1. 13. 23:44
반응형

3줄 TMI

한 달 넘게 블로그 업로드를 쉬었는데 여러가지 이유가 있었다. 학습 내용 중 얻은 부분, 부족한 부분에 초점을 맞춰 올리기 보다는 일기장에 초점이 맞춰져 있었던 것 같아 고민을 많이 했다. 또 리버싱 문제 풀이를 진행하다보니 어느새 내가 단순 툴만  사용하고 있다는 것을 느꼈다. 정말 컴퓨터 구조에 대해 생각하고 명령어에 대해 고민하고 풀었던 문제가 아닌 답을 맞추기 위한 문제를 풀었었다. 위 이유들 이외에도 나의 나태함 등등 여러가지 이유가 있었다.


학습 내용

strcmp(문자열1,문자열2) : 두 문자열을 비교해 같다면 0을 반환하고 다르다면 1을 반환한다.

 

- 사용 방법

strcmp(배열 변수, 배열 변수)

strcmp("문자열", "문자열")

 

- 주의사항

 strcmp가 포함된 함수 실행 전 #include <string.h> 헤더파일이 선언되어야 한다.

#include <string.h> 는 strcmp 함수가 선언된 헤더파일

 

 

처음 코드를 짤 때 정말 배열 자체에서 가장 마지막 원소를 삭제할 생각이었다.  하지만 배열에서 삭제를 구현하기 힘들고 삭제하는 코드를 구현하더라도 정말 값의 삭제가 아닌 메모리를 미는 방식이었다. 따라서 count 변수를 이용해 배열 원소의 순서들을 직접 지정해주고 개수를 세는 방식을 이용했다.

 

1차 작성 코드(백준 제출 성공)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int arr[10000];
int count = 0;

void push(int ARR[]);
void pop(int ARR[]);
void size(int ARR[]);
void empty(int ARR[]);
void top(int ARR[]);

int main() {
	int N,i;
	char stack[6];

	scanf("%d", &N);
	
	for (i = 0; i < N; i++) {
		scanf("%s", &stack);
		if (strcmp(stack, "push") == 0) {
			push(arr);
		}
		else if (strcmp(stack, "pop") == 0) {
			pop(arr);
		}
		else if (strcmp(stack, "size")==0) {
			size(arr);
		}
		else if (strcmp(stack, "empty")==0) {
			empty(arr);
		}
		else if (strcmp(stack, "top")==0) {
			top(arr);
		}
	}

	return 0;
}

void push(int ARR[]) {
	int number;

	scanf("%d", &number);
	ARR[count] = number;
	count++;
}

void pop(int ARR[]) {
	if (count != 0) {
		count--;
		printf("%d\n", ARR[count]);
		ARR[count] = 0;
	}
	else {
		printf("-1\n");
	}
}

void size(int ARR[]) {
	printf("%d\n", count);
}

void empty(int ARR[]) {
	if (count == 0)
		printf("1\n");
	else
		printf("0\n");
}

void top(int ARR[]) {
	if (count == 0)
		printf("-1\n");
	else
		printf("%d\n",ARR[count-1]);
}

스택으로 쓰이는 배열 자체를 전역변수로 선언해주었기 때문에 굳이 인자값을 배열로 넣어줄 필요가 없다는 것을 알았다. 인자값을 삭제하면 기존 인자값(배열의 시작주소)를 복사할 필요가 없기 때문에 조금 더 효율적인 코드가 될 수 있지 않을까 생각했다. 따라서 2차 수정 코드는 아래와 같다.

 

2차 작성 코드(백준 제출 성공)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int arr[10000]; //최대 명령어 입력 개수 N이 10000이기 때문
int count = 0;

void push();
void pop();
void size();
void empty();
void top();

int main() {
	int N,i;
	char stack[6]; //scanf로 입력받기 때문에 NULL을 포함한 최대 입력 문자 6

	scanf("%d", &N);
	
	for (i = 0; i < N; i++) {
		scanf("%s", &stack);
		if (strcmp(stack, "push") == 0) {
			push();
		}
		else if (strcmp(stack, "pop") == 0) {
			pop();
		}
		else if (strcmp(stack, "size")==0) {
			size();
		}
		else if (strcmp(stack, "empty")==0) {
			empty();
		}
		else if (strcmp(stack, "top")==0) {
			top();
		}
	}

	return 0;
}

void push() {
	int number;

	scanf("%d", &number);
	arr[count] = number;
	count++;
}

void pop() {
	if (count != 0) {
		count--;
		printf("%d\n", arr[count]);
		arr[count] = 0;
	}
	else {
		printf("-1\n");
	}
}

void size() {
	printf("%d\n", count);
}

void empty() {
	if (count == 0)
		printf("1\n");
	else
		printf("0\n");
}

void top() {
	if (count == 0)
		printf("-1\n");
	else
		printf("%d\n",arr[count-1]);
}

 


근황

모각코라는 네이버 카페에서 단기 개인 프로젝트 겸 스터디를 신청해서 하고 있다. 그곳에서 푼 문제 리뷰도 올리고 싶어 알아보았지만 저작권 문제로 불가할 것 같다. 모각코 플러스 과정을 신청했던 이유는 많이 풀어졌던 마음가짐을 되잡고자 신청했었다. 또 이중 포인터, 구조체, 3차원 이상의 배열 등은 사용해본적이 많이 없었기 때문에 실무 프로그래밍에 대해 한발 다가가고 싶었다. 그리고 융합보안논문경진대회는 현재 막바지에 다달았다. 내일 제출할 것 같다. 그동안 논문 대회를 준비하며 셋 모두 한번도 제대로 학습해본 적이 없는 분야였기에 고생을 많이 했다. 여러번 주제를 엎기도 하고 기존 주제에서 새로운 문제점이 발견되어 다른 길로 돌아가기도 하고... 하지만 나는 양자내성암호라는 주제를 우리가 정한 것부터 자랑스럽다. 처음 학습해보는 양자내성암호였는데 얻어가는 것이 많은 것 같아 기쁘다.

반응형