목록전체 글 (780)
쌓고 쌓다
피연산자(숫자)를 만난다면 그냥 바로 피연산자를 출력해준다. 연산자를 만난다면 스택에 넣을 것이다. 그런데, 우선순위가 항상 높은 것이 스택의 맨 위에 있도록 스택을 유지하게 넣을 것이다. ( 우선순위가 같다면 먼저 스택에 있던 연산자가 먼저 출력해주는게 맞다 그러므로 같아도 출력해주며 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 )..

희소행렬을 2차원 배열을 통해 전체를(0도 포함해서) 저장해버리는 방법 장점: 행렬의 연산이 간단해진다. 단점: 대부분의 항이 0인데 메모리 낭비이다. 0이 아닌 요소들만 구조체를 이용해서 저장하자 장점: 메모리 공간 절약 단점: 행렬의 연산들의 구현이 복잡 아래의 코드는 구조체를 이용해 0이 아닌 요소들만 있는 행렬의 덧셈을 하는 코드이다. #include using namespace std; #define ROWS 3 #define COLS 3 #define MAX_TERMS 10 typedef struct Element { int row; int col; int value; }Element; typedef struct sparse_matrix { Element data[MAX_TERMS]; int ..
리터럴(literal) 프로그램에 직접 표현한 값을 말한다. 정수, 실수, 문자, 논리, 문자열 타입 모두 리터럴이 있다. 정수 리터럴의 종류 유형 설명 사례 10진수 0으로 시작하지 않는 수 15 -> 15 (10진수) 8진수 0으로 시작하는 수 015 -> 13 (=1*8+5) 16진수 0x로 시작하는 수 0x15 -> 21(=1x16+5) 2진수 0b로 시작하는 수 0b0101 -> 5 (10진수) int n = 15; // 십진수 15 int n = 015; // 015는 8진수로서 십진수 13 int n = 0x15; // 0x15는 16진수로서 십진수 21 int n = 0b0101; // 0b0101은 2진수로서 십진수 5 - 정수 리터럴은 int 타입으로 자동으로 컴파일된다. - long ..