BOJ 1918 후위표기식

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

구조체로 스택을 만들고 다시 해보았습니다.(.cpp에서 돌려야합니다.)

설명은 이전의 글을 참조해주세요.

  #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_SIZE 10000

typedef struct stack {
char s[MAX_SIZE];
int size;

stack() {
size = 0;
}

int empty() {
if (size) return 0;
else return 1;
}

void push(char c) {
s[size] = c;
size++;
}

void pop() {
if (!empty()) {
size--;
}
}

char top() {
return s[size - 1];
}
}stack;


char* getPostOrder(char* str) {
int len = strlen(str);
char* ret = (char*)malloc(sizeof(char) * (len + 1));
int retIdx = 0;

stack s;

for (int i = 0; i < len; i++) {
if (str[i] == '+' || str[i] == '-') {
while (!s.empty() && s.top() != '(') {
ret[retIdx++] = s.top();
s.pop();
}
s.push(str[i]);
}
else if (str[i] == '*' || str[i] == '/') {
while (!s.empty() && (s.top() == '*' || s.top() == '/')) {
ret[retIdx++] = s.top();
s.pop();
}
s.push(str[i]);
}
else if (str[i] == '(') {
s.push(str[i]);
}
else if (str[i] == ')') {
while (s.top() != '(') {
ret[retIdx++] = s.top();
s.pop();
}
s.pop();
}
else if (str[i] >= 'A' && str[i] <= 'Z') {
ret[retIdx++] = str[i];
}
}

while (!s.empty()) {
ret[retIdx++] = s.top();
s.pop();
}

ret[retIdx] = '\0';

return ret;
}

int main() {
char str[MAX_SIZE];
scanf("%s", str);

char *ret = getPostOrder(str);
printf("%s", ret);

free(ret);

return 0;
}

'CS기본지식 > 자료구조' 카테고리의 다른 글

[C언어] 원형 큐(라운드 큐)  (0) 2017.09.07
[C언어] 우선순위 큐(Priority Queue)  (3) 2017.09.07
[2263] 트리의 순회  (1) 2017.08.27
스택 계산기  (0) 2017.06.13
[1918] 후위표기식  (2) 2017.06.13

데이터베이스 정규화

정규화를 하는 이유?

한 릴레이션에 여러 엔티티의 애트리뷰트들을 혼합하게 되면 정보가 중복 저장되고, 이는 저장 공간을 낭비시킨다. 또한, 중복된 정보로 인해 갱신 이상이 발생되며, 동일한 정보를 한 릴레이션에는 변경하고, 나머지 릴레이션에서는 변경하지 않은 경우 어느 것이 정확한지 알 수 없다. 이 때문에 정규화 과정을 거쳐 해결한다.

갱신 이상의 종류

<회원> 테이블

학번(PK)이름클래스강사과목명
1홍길동A신다람쥐넥슨 취직 대비
2신첨지B이노드웹 어플리케이션
3김아무B이노드웹 어플리케이션
4최태수C최디비데이터베이스
5이길투C최디비데이터베이스
  • 삽입 이상

    • 원하지 않는 자료가 삽입되거나, 삽입하는데 자료가 부족하여 삽입이 되지 않아 발생하는 문제이다.

    • 위 테이블에서 네트워크 과목을 신설할 때 학생이 한명도 없으므로, 이름과 학번이 null값을 갖는다. 학번은 PK이므로 null을 가질 수 없으므로 오류가 발생한다.

  • 삭제 이상

    • 하나의 자료만 삭제하고 싶지만, 그 자료가 포함된 튜플 전체가 삭제됨으로 원하지 않는 정보 손실이 발생하는 문제점을 말한다.

    • 위 테이블에서는 "홍길동" 튜플을 삭제하면, (클래스 A, 신다람쥐, 넥슨 취직대비)가 삭제된다. 위에서 클래스 A 정보를 가진 튜플은 "홍길동"이 유일하므로 없어지면 안되는 A 클래스의 정보가 사라지게된다.

  • 수정(갱신) 이상

    • 정확하지 않거나 일부의 튜플만 갱신되어 정보가 모호해지거나 일관성이 없어져 정확한 정보 파악이 되지 않는다.

    • 위 테이블에서 B클래스의 강사 이름을 "웹마스터"로 바꾸게 되면, 모든 튜플에서 B클래스의 강사 이름을 전부 수정해야한다.

정규화 과정

실무에서는 주로 1~3정규형만을 사용한다고 한다. 그러므로 3정규형까지만 정리해보겠다.

  • 제 1 정규형

    • 애트리뷰트의 도메인이 오직 원자값만을 포함하고, 튜플의 모든 애트리뷰트가 도메인에 속하는 하나의 값을 가져야 한다.

    • 복합 애트리뷰트, 다중값 애트리뷰트, 중첩 릴레이션 등 비 원자적인 애트리뷰트들을 허용하지 않는 릴레이션 형태이다.

  • 제 2 정규형

    • 모든 비주요 애트리뷰트들이 주요 애트리뷰트에 대해서 완전 함수적 종속이면 제 2 정규형을 만족한다고 볼 수 있다. 완전 함수적 종속이란 X->Y 라고 가정했을 때, X의 어떠한 애트리뷰트라도 제거하면 더 이상 함수적 종속성이 성립하지 않는 경우를 말한다. 즉, 키가 아닌 열들이 각각 후보키에 대해 결정되는 릴레이션 형태를 말한다.

  • 제 3 정규형

    • 어떠한 비주요 애트리뷰트도 기본키에 대해서 이행적으로 종속되지 않으면 제 3 정규형을 만족한다고 볼 수 있다. 이행 함수적 종속이란 X->Y, Y->Z의 경우에 의해서 추론될 수 있는 X->Y의 종속관계를 말한다. 즉, 비주요 애트리뷰트가 비주요 애트리뷰트에 의해 종속되는 경우가 없는 릴레이션 형태를 말한다.(한 테이블에서 X->Y->Z이면, X->Y, Y->Z 두 테이블로 나눈다.)

정규화의 단점?

무작정 정규화를 하는 것은 좋지 않다. 테이블 간의 조인을 자주해야한다면 오히려 한 테이블에 있는 것이 퍼포먼스가 좋을 수도 있다는 이야기이다.


'CS기본지식 > 데이터베이스' 카테고리의 다른 글

트랜잭션  (0) 2017.11.19
조인  (0) 2017.06.10
[SQL] select문  (0) 2017.06.08
테이블 수정 및 삭제  (0) 2017.06.08
varchar와 char의 차이  (0) 2017.06.07

데이터베이스 트랜잭션

트랜잭션이란?

데이터베이스 내에서 한번에 수행되어야할 일련의 연산.

한번에 완료되면 성공적이므로 COMMIT하고 데이터베이스에 반영됨.

도중에 취소가 되면 ROLLBACK하여 작업 시작의 초기의 상태로 되돌림.(일련의 연산 안의 모든 작업이 취소되어 데이터베이스에 영향을 미치지 않음)

트랙잭션의 특성

  • 원자성(Atomicity)

    분리 할수 없는 하나의 단위로 작업은 모두 완료되거나 모두 취소 되어야 합니다.

  • 일관성(Consistency)

    사용되는 모든 데이터는 일관되어야 합니다.

  • 격리성(Isolation)

    접근하고 있는 데이터는 다른 트랜잭션으로 부터 격리 되어야 합니다.

    트랜잭션이 진행되기전과 완료된 후에 상태를 볼수 있지만 트랜잭션이 진행되는 중간 데이터는 볼수 없습니다.

  • 영속성(Durability)

    트랙잭션이 정상 종료되면 그 결과는 시스템에 영구적으로 적용되어야 합니다.

  • 순차성(Sequentiality)

    데이터를 다시 로드하고 트랜잭션을 재생하여 원래 트랜잭션이 수행된 후의 상태로 데이터를 되돌리는 것을 말합니다.


'CS기본지식 > 데이터베이스' 카테고리의 다른 글

정규화가 무엇일까?  (0) 2017.11.19
조인  (0) 2017.06.10
[SQL] select문  (0) 2017.06.08
테이블 수정 및 삭제  (0) 2017.06.08
varchar와 char의 차이  (0) 2017.06.07

http://bcho.tistory.com/953의 글을 참고했습니다!

Rest란?

Representational safe transfer이며, 웹의 장점을 최대한 활용할 수 있는 네트워크 기반의 아키텍쳐

Rest 기본 요소

크게 리소스, 메소드, 메세지 3가지 요소로 구성된다. 예를 들어 "Terry인 사용자를 생성한다."라는 호출이 있을 때 '사용자'는 생성되는 리소스, '생성한다'라는 행위는 메소드, '이름이 Terry인 사용자'는 메세지이다. 이를 REST 형태로 표현하면

  
HTTP POST , http://myweb/users/
{  
  "users":{  
     "name":"terry"
  }
}

HTTP 메소드

HTTP에는 여러가지 메소드가 있지만 REST에서는 CRUD(Create, Read, Update, Delete) 4가지만 사용한다.

Create = Post(X)

Read = Get(O)

Update = Put(O)

Delete = Delete(O)

오른쪽의 O/X 는 Idempotent는 여러번 수행을 해도 결과가 같은 것을 의미한다.

REST 리소스

REST는 리소스 지향 아키텍쳐이므로 모든 것을 리소스(명사)로 표현한다. 예를 들어 사용자 리소스를 http://myweb/users라고 정의했다면, terry라는 id를 갖는 리소스는 http://myweb/users/terry라는 형태로 정의한다.

REST 특성

유니폼 인터페이스

rest는 http표준이라면 어떤 기술이던지 사용 가능한 인터페이스(모든 플랫폼에 사용가능한 느슨한 결합)이다. 흔히 REST라고 하면 HTTP + JSON를 떠올리는데, JSON은 하나의 옵션이다.

무상태성/스테이트리스(Stateless)

rest는 Stateless(상태를 유지하지 않음)이 특징이다. 상태가 있다/없다는 것은 클라이언트의 컨텍스트를 서버 쪽에서 유지하지 않는다는 의미이다. 쉽게 이야기하면 http 세션과 같은 컨텍스트 저장소에 상태 정보를 저장하지 않는 형태이다. rest의 각 API 서버는 들어오는 요청만을 메시지로 처리할 뿐이다. 세션과 같은 컨텍스트는 신경 쓸 필요가 없기 때문에 구현이 단순하다.

더 많은 특징 참조 주소 : http://bcho.tistory.com/953

'CS기본지식 > 컴퓨터 기본 지식' 카테고리의 다른 글

1의 보수와 2의 보수  (0) 2017.08.15


원형 큐입니다.


원형 큐를 이해하기 위해서는 %(나머지) 개념을 잘 이해하시면 됩니다.


empty : 큐가 비었음을 의미하는 함수입니다. front와 rear가 같다면 큐는 비어있는 것입니다.

full : (rear + 1) % MAX_SIZE == front라면 큐가 꽉차 있음을 의미합니다.


다른 부분은 일반 큐와 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <stdio.h>
 
#define MAX_SIZE 100
 
typedef struct round_queue {
    int queue[MAX_SIZE];
    int front, rear;
    int size;
 
    round_queue() {
        size = 0;
        front = 0;
        rear = 0;
    }
 
    int empty() {
        return front == rear;
    }
 
    int push(int value) {
        if ((rear + 1) % MAX_SIZE == front) {
            return 0;
        }
        size++;
        rear = (rear + 1) % MAX_SIZE;
        queue[rear] = value;
    }
 
    int pop() {
        if (empty()) {
            return -1;
        }
        size--;
        front = (front + 1) % MAX_SIZE;
        return queue[front];
    }
}round_queue;
 
 
int main(int argc, char* argv[])
{
    int T, N;
 
    scanf("%d"&T);
 
    for (int test_case = 1; test_case <= T; test_case++)
    {
        scanf("%d"&N);
 
        round_queue rq;
 
        for (int i = 0; i < N; i++)
        {
            int value;
            scanf("%d"&value);
            rq.push(value);
        }
 
        printf("#%d\n", test_case);
        while(!rq.empty()) printf("%d ", rq.pop());
    
        printf("\n");
    }
 
    return 0;
}
 
cs


'CS기본지식 > 자료구조' 카테고리의 다른 글

[1918] 후위표기식  (0) 2017.11.27
[C언어] 우선순위 큐(Priority Queue)  (3) 2017.09.07
[2263] 트리의 순회  (1) 2017.08.27
스택 계산기  (0) 2017.06.13
[1918] 후위표기식  (2) 2017.06.13

C언어의 구조체를 이용해서 우선순위 큐를 만들었습니다.


구조체는 아래처럼 정의했습니다.

1
2
3
4
5
6
7
8
9
typedef struct priority_queue {
    int heap[MAX_SIZE];
    int size;
    priority_queue();
    void swap(int *a, int *b);
    int push(int value);
    int pop();
    int empty();
}
cs


데이터를 저장할 heap과

heap의 사이즈를 나타낼 변수

그리고 데이터 swap함수

우선순위큐 push, pop, empty


입니다.


최대 힙으로 구현했고, 최소 힙은 부등호만 바꿔주면 됩니다.

양수에 대해서만 작동하는 힙입니다. 이유는 pop할 때 size == 0이면 -1을 리턴하게 했기 때문입니다.


input)

2

10

10 49 38 17 56 92 8 1 13 55

13 

4 22 50 13 5 1 22 35 21 7 99 100 14


출력결과)

2

10

10 49 38 17 56 92 8 1 13 55

#1

92 56 55 49 38 17 13 10 8 1

13

4 22 50 13 5 1 22 35 21 7 99 100 14

#2

100 99 50 35 22 22 21 14 13 7 5 4 1


궁금한 것은 댓글 주세요

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <stdio.h>
 
#define MAX_SIZE 100
 
typedef struct priority_queue {
    int heap[MAX_SIZE];
    int size;
 
    priority_queue() {
        size = 0;
    }
 
    void swap(int *a, int *b) {
        int tmp = *a;
        *= *b;
        *= tmp;
    }
 
    int push(int value) {
        if (size + 1 > MAX_SIZE) {
            return 0;
        }
 
        heap[size= value;
 
        int current = size;
        int parent = (size - 1/ 2;
 
        while (current > 0 && heap[current] > heap[parent]) {
            swap(&heap[current], &heap[parent]);
            current = parent;
            parent = (parent - 1/ 2;
        }
 
        size++;
 
        return 1;
    }
 
    int pop() {
        if (size <= 0return -1;
 
        int ret = heap[0];
        size--;
 
        heap[0= heap[size];
        int current = 0;
        int leftChild = current * 2 + 1;
        int rightChild = current * 2 + 2;
        int maxNode = current;
 
        while (leftChild < size) {
            if (heap[maxNode] < heap[leftChild]) {
                maxNode = leftChild;
            }
            if (rightChild < size && heap[maxNode] < heap[rightChild]) {
                maxNode = rightChild;
            }
 
            if (maxNode == current) {
                break;
            }
            else {
                swap(&heap[current], &heap[maxNode]);
                current = maxNode;
                leftChild = current * 2 + 1;
                rightChild = current * 2 + 2;
            }
        }
        
        return ret;
    }
 
    int empty() {
        if (size == 0) {
            return 1;
        }
        else {
            return 0;
        }
    }
}priority_queue;
 
 
int main(int argc, char* argv[])
{
    int T, N;
 
    scanf("%d"&T);
 
    for (int test_case = 1; test_case <= T; test_case++)
    {
        scanf("%d"&N);
 
        priority_queue pq;
 
        for (int i = 0; i < N; i++)
        {
            int value;
            scanf("%d"&value);
            pq.push(value);
        }
 
        printf("#%d\n", test_case);
        while(!pq.empty()) printf("%d ", pq.pop());
    
        printf("\n");
    }
 
    return 0;
}
cs


'CS기본지식 > 자료구조' 카테고리의 다른 글

[1918] 후위표기식  (0) 2017.11.27
[C언어] 원형 큐(라운드 큐)  (0) 2017.09.07
[2263] 트리의 순회  (1) 2017.08.27
스택 계산기  (0) 2017.06.13
[1918] 후위표기식  (2) 2017.06.13

데코레이터 패턴 시간입니당!!!!!!!!!!!!!!!!


책에는 "상속맨, 디자인에 눈을 뜨다"라고 써있네요!

상속을 남용하는 전형적인 예를 살펴보고 객체 작성이라는 형식으로 실행중에 클래스를 꾸미는(데코레이터하는) 패턴을 배워볼거에욧


데코레이터 패턴을 배우면!!

원래 클래스의 코드는 전혀 바꾸지 않고도 기존의 객체에 새로운 임무를 부여할 수 있어요!


기존 코드는 건드리지 않은 채로 확장을 통해서 새로운 행동을 간단하게 추가할 수 있도록 하는게 바 로 데코레이터 패턴이죠!

새로운 기능을 추가하는 데 있어서 매우 유연해서 급변하는 주변 환경에 잘 적응할 수 있으면서도 강하고 튼튼한 디자인 !!


OCP라는 디자인 원칙이 있는데요

클래스는 확장에 대해서는 열려있어야 하며, 코드 변경에 있어서는 닫혀있어야 한다는 뜻입니다.


이제부터 제대로 시작합니당!


데코레이터 패턴!!!!!

정의 : 객체에 추가적인 요건을 동적으로 첨가한다.

데코레이터는 서브클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공한다.


까페를 예로 들겠습니다.

상속을 써서 음료 가격과 첨가물(샷, 시럽, 우유, 휘핑 크림 등) 가격을 합한 총 가격을 계산하는 방법은 그리 좋은 방법이 아닙니다.

그 이유는

1. 클래스가 어마어마하게 많아짐.

2. 일부 서브클래스에는 적합하지 않은 기능을 베이스 클래스에 추가하게 됨.(아이스티에 휘핑크림을 추가할 필요는 없음)


그렇기 때문에 어떤 특정 음료에서 시작해서! 그 음료를 장식할겁니다.!!!!!!!!

하나의 예로 모카하고 휘핑 크림을 추가한 다크 로스트 커피를 들게요.


1. 다크로스트 객체를 가져온다.

2. 모카 객체로 장식한다.

3. 휘핑 객체로 장식한다.

4. 코스트 메소드를 호출한다. 이 때 첨가물의 가격을 계산하는 일은 해당 객체들에게 위임된다.



예제

추상클래스들을 먼저 보여드릴게용


음료 클래스

1
2
3
4
5
6
7
8
9
10
11
12
package abstract_package;
 
public abstract class Beverage {
    protected String description = "제목 없음";
    
    public String getDescription() {
        return description;
    }
    
    public abstract double cost();
}
 
cs


첨가물 클래스

1
2
3
4
5
6
package abstract_package;
 
public abstract class CondimentDecorator extends Beverage {
    public abstract String getDescription();
}
 
cs



이제 음료 클래스들과, 첨과물 클래스들을 보여드릴게요.


먼저 음료클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package beverage;
 
import abstract_package.Beverage;
 
public class DarkRoast extends Beverage {
    public DarkRoast() {
        description = "다크로스트";
    }
    
    @Override
    public double cost() {
        return 0.99;
    }
}
 
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package beverage;
 
import abstract_package.Beverage;
 
public class Decaf extends Beverage {
    public Decaf() {
        description = "디카페인";
    }
 
    @Override
    public double cost() {
        return 1.05;
    }
 
}
 
cs


더 있는데 너무 많으므로 두개씩만 할게요 풀코드 보고싶은 분은 코드 다운로드해서 봐주세요


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package condiment;
import abstract_package.Beverage;
import abstract_package.CondimentDecorator;
 
public class Mocha extends CondimentDecorator {
    Beverage beverage;
    
    public Mocha (Beverage beverage) {    
        this.beverage = beverage;
    }
    
    public String getDescription() {
        return beverage.getDescription() + ", 모카";
    }
    
    public double cost() {
        return 0.20 + beverage.cost();
    }
 
}
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package condiment;
 
import abstract_package.Beverage;
import abstract_package.CondimentDecorator;
 
public class Whip extends CondimentDecorator{
    Beverage beverage;
    
    public Whip(Beverage beverage) {
        this.beverage = beverage;
    }
    
    public String getDescription() {
        return beverage.getDescription() + ", 휘핑";
    }
    
    public double cost() {
        return beverage.cost() + 0.10;
    }
}
 
cs



이제 메인클래스입니당.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import abstract_package.Beverage;
import beverage.DarkRoast;
import beverage.Espresso;
import beverage.HouseBlend;
import condiment.Mocha;
import condiment.Soy;
import condiment.Whip;
 
public class StarbuzzCoffee {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Beverage beverage[] = new Beverage[3];
 
        beverage[0= new Espresso();
        beverage[0= new Mocha(beverage[0]);
        beverage[0= new Mocha(beverage[0]);
        beverage[0= new Whip(beverage[0]);
 
        beverage[1= new DarkRoast();
        beverage[1= new Soy(beverage[1]);
        beverage[1= new Mocha(beverage[1]);
 
        beverage[2= new HouseBlend();
 
        for (int i = 0; i < beverage.length; i++) {
            System.out.println(beverage[i].getDescription() + " $" + beverage[i].cost());
        }
        
    }
}
 
cs



[출력결과]


에스프레소, 모카, 모카, 휘핑 $2.49

다크로스트, 두유, 모카 $1.3399999999999999

하우스 블렌드 커피 $0.89

1.3399999999999999



다 보고 싶으신 분은 풀 코드 다운로드하세요~~

Decorator_Pattern.jar



'CS기본지식 > 디자인 패턴' 카테고리의 다른 글

옵저버 패턴(Observer Pattern)  (0) 2017.08.25
스트래티지 패턴(Strategy Pattern)  (0) 2017.08.23

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


헉헉..

엄청 어렵네요!!..


pre, in, post 각각의 순회는 이해했지만,

완벽히 이해한 것은 아니였나봅니다.


이 문제는

in과 post를 이용하여 pre를 유추하는 문제입니다.


post와 in의 특징을 제대로 이해하고 있다면

O(N)의 시간으로 해결할 수 있습니다.


우선 post에 특징에 대해서 말씀드리겠습니다.


post는 Left - Right - Root 순으로 순회를 합니다.

그렇다면 우리가 받는 post input에서 가장 끝이 트리의 root라는 것을 알 수 있습니다.


예제를 예로 들면 1 3 2 로 들어오니 2가 root라는 것을 알 수 있죠.


두번째로 in의 특징입니다.

in은 Left - Root - Right 순으로 순회를 합니다.

여기서 중요한 점!은 바로 in의 input을 그대로 받는 것이 아닌 그의 위치를 저장하는 것입니다.


예제를 예로 들면

1 2 3 이라는 input이 들어오니, pos[1] = 0, pos[2] = 1, pos[3] = 2

이런 식으로 위치를 저장합니다.

그 이유는


in을 사용해서 우리는 left, right 서브트리와 root로 구분을 지을 수 있기 때문입니다.


post를 이용하여 root를 찾았고, root가 무엇인지 안다면 in에서 그 root를 기준으로 left와 right 서브트리로 나눌 수 있습니다.


이러한 과정을 분할하면서 계속 반복한다면 원래의 트리 모양을 유추할 수 있겠지요.


pre는 Root - Left - Right 이므로 위의 특징들을 이용하여 root를 찾아낸 후 출력하고 in의 root를 기준으로

left서브트리의 노드 수와 right 서브트리의 노드 수를 체크하여 post트리에 적용한 후 그 노드 수를 기준으로 나눠주면 됩니다.



코드입니다.

pos배열을 선언할 때 배열의 개수가 MAX_SIZE + 1인 이유는 input이 1~N까지 들어오기 때문입니다.(이것 떄문에 엄청 틀렸습니다.)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <string.h>
#include <cmath>
#define ll long long
#define mp make_pair
#define pii pair<intint>
#define vi vector<int>
#define vii vector<pair<intint> >
#define vll vector<ll>
 
#define MOD 86400
#define INF 0x7fffffff
#define MAX_SIZE (int)1e5
 
using namespace std;
//ios::sync_with_stdio(false); cin.tie(0);
 
int post[MAX_SIZE];
int pos[MAX_SIZE + 1];
 
void order(int is, int ie, int ps, int pe) {
    if (is > ie || ps > pe) return;
 
    int root = post[pe];
    cout << root << ' ';
 
    order(is, pos[root] - 1, ps, ps + pos[root] - is - 1);
    order(pos[root] + 1, ie, ps + pos[root] - is, pe - 1);
}
 
int main() {
    ios::sync_with_stdio(false); cin.tie(0);
 
    int n;
    cin >> n;
 
    for (int i = 0, in; i < n; i++) {
        cin >> in;
        pos[in] = i;
    }
 
    for (int i = 0; i < n; i++) {
        cin >> post[i];
    }
 
    order(0, n - 10, n - 1);
 
    return 0;
}
 
cs


'CS기본지식 > 자료구조' 카테고리의 다른 글

[C언어] 원형 큐(라운드 큐)  (0) 2017.09.07
[C언어] 우선순위 큐(Priority Queue)  (3) 2017.09.07
스택 계산기  (0) 2017.06.13
[1918] 후위표기식  (2) 2017.06.13
이중 연결 리스트  (0) 2017.04.22

+ Recent posts