[백준] 1874번 - 스택 수열 (C언어) [Silver2]

2023. 5. 25. 17:25·알고리즘

intput output
8
4
3
6
8
7
5
2
1
+
+
+
+
-
-
+
+
-
+
+
-
-
-
-
-

해당 문제는 스택 자료구조 개념을 알고 문제에서 원하는 바를 이해 한다면 충분히 해결 가능한 문제이다.

 

문제 해결 과정은 다음과 같다.

더보기
  1. N 만큼 입력 받는다.
  2. 1부터 N까지의 수를 조합하여 목표 수열을 만든다.(단, 중복 제외)
  3. 수열은 push 와 pop 연산을 사용하여 확인한다.
  4. 두 연산으로 목표하는 수열이 있는지 확인한다.
  5. 두 연산으로 표현할 수 없다면 "NO"를 출력한다.

Last In First Out 특성을 사용하여 오름차순 스택은 3가지 경우로 나뉘어 문제 해결이 가능하다.

더보기
  1. 스택의 상단 수가 목표 수 보다 낮은 경우 push
  2. 스택 상단 수가 목표 수와 같은 경우 pop
  3. 스택의 상단 수가 목표 수 보다 큰 경우 NO

전체 소스 코드는 아래와 같다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100000
#pragma warning(disable:4996)
int stack[SIZE]; // 스택
char c[SIZE * 2]; // +,- 저장할 char형 배열
int top = -1; // 스택 상단 표시
int arr[SIZE];
int main() {
	int n;
	scanf("%d", &n);

	for (int i = 0; i < n; i++) {
		scanf("%d", &arr[i]);
	}

	int arr_index = 0; // 할당한 배열 인덱스
	int c_index = 0; // + , - 표현 인덱스
	int temp = 1;

	while (1) {
		// 스택의 상단 수가 해당 배열 인덱스 수 보다 낮은 경우 push
		if ((top == -1) || (stack[top] < arr[arr_index])) {
			stack[++top] = temp++;
			c[c_index++] = '+'; // push = '+'
		}
		/* 스택의 상단 수가 해당 배열 인덱스 수와 같은 경우 pop */
		else if (stack[top] == arr[arr_index]) {
			top--;
			c[c_index++] = '-';
			arr_index++;
		}
		else { /* 스택의 상단 수가 해당 배열 인덱스 수보다 큰 경우*/
			printf("NO\n");
			return 0;
		}
		if (c_index == n * 2) // 무한 루프 탈출
			break;
	}
	
	
	for (int i = 0; i < c_index ;i++)
		printf("%c\n", c[i]);

	return 0;
}

 

[1874번]

https://www.acmicpc.net/problem/1874

 

1874번: 스택 수열

1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.

www.acmicpc.net

 

[github]

https://github.com/MinWook6457

 

MinWook6457 - Overview

MinWook6457 has 20 repositories available. Follow their code on GitHub.

github.com

 

 

'알고리즘' 카테고리의 다른 글

[백준] 1407번 - 2로 몇 번 나누어질까 (C언어) [Gold4]  (0) 2023.05.27
[백준] 1197번 - 최소 스패닝 트리 (C언어) [Gold4]  (0) 2023.05.26
[백준] 1913번 - 달팽이 (C언어) [Silver3]  (2) 2023.05.24
[백준] 1041번 - 주사위 (C언어) - [Gold5]  (0) 2023.05.24
[백준] 10989번 - 수 정렬하기 3 (C언어) - [Bronze1]  (0) 2023.05.23
'알고리즘' 카테고리의 다른 글
  • [백준] 1407번 - 2로 몇 번 나누어질까 (C언어) [Gold4]
  • [백준] 1197번 - 최소 스패닝 트리 (C언어) [Gold4]
  • [백준] 1913번 - 달팽이 (C언어) [Silver3]
  • [백준] 1041번 - 주사위 (C언어) - [Gold5]
min._.uuk_
min._.uuk_
하루 하나 기록하기
  • min._.uuk_
    기록하는 습관
    min._.uuk_
  • 전체
    오늘
    어제
    • 분류 전체보기 (33)
      • 알고리즘 (15)
      • 자바 스크립트 (2)
      • 인실리코젠 (15)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    인실리코젠 #크롤링 #SpringBoot #MVC #jQuery
    백준 #후위표기식 #스택 #중위표기식 #우선순위 #1918번
    백준 #동적계획법 #dp #백트래킹 #dfs
    JS #테트리스 #HTML #CSS #추억의 게임
    Apache #POI #JAVA #maven
    #BOJ #백준 #10989번 #C언어 #카운팅정렬 #정렬
    백준 #세그먼트 트리 #구간합 #c언어 #골드1 #탐색
    백준 #BOJ #스택 #수열
    백준 #1407번 #재귀함수
    백준 #MST #최소비용신장트리 #크루스칼 #그리디 #알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
min._.uuk_
[백준] 1874번 - 스택 수열 (C언어) [Silver2]
상단으로

티스토리툴바