목록분류 전체보기 (718)
쌓고 쌓다
https://www.acmicpc.net/problem/1918 1918번: 후위 표기식 첫째 줄에 중위 표기식이 주어진다. 단 이 수식의 피연산자는 알파벳 대문자로 이루어지며 수식에서 한 번씩만 등장한다. 그리고 -A+B와 같이 -가 가장 앞에 오거나 AB와 같이 *가 생략되는 등의 www.acmicpc.net 후위 표기식으로 바꾸는 방법은 저번에 작성했었다. 저것을 참고... 설명 -> https://non-stop.tistory.com/91 전체 코드 #include #include using namespace std; string str; int prec(char ch) { switch (ch) { case '+': case '-': return 1; case '*': case '/': retu..
문자열을 탐색하는데 피연산자(숫자)라면 스택에 그냥 저장해줍니다. 연산자라면 피연산자가 2개 필요하겠죠? 스택에서 피연산자 2개를 꺼냅니다. 먼저 꺼낸 것은 op2 ( 연산자 뒤에 쓸 피연산자) 2번째로 꺼낸것은 op1 ( 연산자 앞에 쓸 피연산자)입니다. op1, op2를 연산자로 계산하여 스택에 넣어줍니다. 연산자가 / 라면 op1/op2를 스택에 넣어줍니다. 이 과정을 문자열 끝까지 실행 시 스택에는 결괏값만 남아 있을 것입니다. 전체 코드 #include #include using namespace std; int solve(string str) { stack s; int idx = 0; while (idx < str.length()) { char ch = str[idx]; if (ch != '+..
피연산자(숫자)를 만난다면 그냥 바로 피연산자를 출력해준다. 연산자를 만난다면 스택에 넣을 것이다. 그런데, 우선순위가 항상 높은 것이 스택의 맨 위에 있도록 스택을 유지하게 넣을 것이다. ( 우선순위가 같다면 먼저 스택에 있던 연산자가 먼저 출력해주는게 맞다 그러므로 같아도 출력해주며 pop해줄것이다.) 왼쪽 괄호 '(' 는 스택에 바로 넣어줄 것이다. ( 우선순위를 제일 낮게 설정 ) 오른쪽 괄호 ')' 는 '(' 가 스택에 맨 위에 있을 때까지 스택 안의 연산자들을 출력하면서 pop을 해줄 것이다. 모든 과정을 문자열 끝까지 한 후 스택에 남아있는 연사자들을 모두 출력해준다. 중위 표기법 후위 표기법 1+3*8 138*+ 전체 코드 #include #include using namespace std..
[(()){}{}] 와 같은 괄호가 있다. 이 괄호가 올바른지 확인하는 방법으로 스택을 사용한다. 여는 괄호는 스택에 그냥 넣어주면 된다. 닫는 괄호에서는 스택을 열어봐서 비교해봐야 한다. 현재 닫는 괄호가 ')'일 경우 스택의 맨 위 요소는 '(' 여야만 한다. 아니라면, 괄호 짝이 안 맞아 괄호를 닫을 수가 없다... 그래서 닫는 괄호가 나올 때마다 스택의 맨 위 요소가 짝이 맞는지 확인을 해주어야 한다. 짝이 맞다면 닫는 괄호를 push 하지 말고 스택의 맨 위(확인한 여는 괄호)를 pop 해준다. 이 과정을 문자 하나하나 돌면서 문자열 끝까지 한다. 괄호가 올바르다면 스택에는 아무것도 없어야 한다. 왜냐하면, 다들 짝을 맞춰 pop을 했을 테니 소스 코드 #include #include using..
https://www.acmicpc.net/problem/17299 17299번: 오등큰수 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다. www.acmicpc.net 전체 코드 #include #include #include using namespace std; int N; int arr[1000001]; int res[1000001]; stack s; // 번호와 등장횟수 vector v; void solve() { //첫 시작은 무조건 오큰수가 없음. s.push(make_pair(v[N - 1], arr[v[N - 1]])); res[N - 1] = -1; for(i..
https://www.acmicpc.net/problem/2841 2841번: 외계인의 기타 연주 첫째 줄에 멜로디에 포함되어 있는 음의 수 N과 한 줄에 있는 프렛의 수 P가 주어진다. (N ≤ 500,000, 2 ≤ P ≤ 300,000) 다음 N개 줄에는 멜로디의 한 음을 나타내는 두 정수가 주어진다. 첫 번째 정수 www.acmicpc.net 전체 코드 #include #include using namespace std; int N, P; int res = 0; stack s[7]; int main(void) { cin >> N >> P; int a, b; for (int i = 0; i > a >> b; if (s[a].empty()) // 비었으면 그냥 누르기 { ..
스택의 특징 LIFO ( Last-In First-Out ) : 후입선출로 가장 늦게(최근에) 들어온 데이터가 가장 먼저 나감 프링글스 통을 스택이라고 생각하자 스택 ADT is_empty(s) : 스택이 비어있는지 검사 is_full(s) : 스택이 가득 찼는지 검사 push(s, e) : 스택의 맨 위에 요소 e를 추가 pop(s) : 스택 맨 위의 요소 삭제 스택 생성 #define MAX_SIZE 10 typedef int element; // 추후 int형 스택을 다른 자료형으로 바꿀때 이부분만 수정하면 편리함 typedef struct { element stack[MAX_SIZE]; int top; }StackType; init 함수 void init(StackType* s) { s->top ..
Vi 에디터 터미널에서 vi [filename]을 입력하면 시작된다. 만약 파일이 존재 시 그 파일을 열고, 존재하지 않는다면 새로 파일을 만든다. 종료 시 command mode로 아래의 문장을 입력한다. :q! ( 저장 없이 종료 ) :wq ( 저장하고 종료 ) Insert mode i : 현재 커서의 앞에 입력 (현재 커서 자리에 입력) a : 현재 커서의 뒤에 입력 (현재 커서 다음 자리에 입력) o : 커서 밑에 빈 행을 추가해 입력 (다음 행에 입력) I : 행의 맨 앞에 입력 A : 행 마지막 부분에 입력 O : 커서 윗 행에 빈 행을 추가해 입력 (커서가 위치한 행의 앞 행에 입력) Command mode ESC를 누르면 명령 모드로 전환 Extended command ( Ex mode )..