OCS(Order Communication System) 소프트웨어에 대해서
※ OCS에 대해서 ※
OCS(Order Communication System)은 처방 전달 시스템을 의미합니다. 옛날에 병원에 전산 시스템이 도입되기 전에는 환자는 의사에게 진료를 받으면 의사는 처방전을 적어줍니다. 이후에 해당 처방전(Slip)을 토대로 간호사가 다시 안내를 해주곤 했습니다. 하지만 전산시스템이 도입되면서 처방전을 굳이 손에서 손으로 전달할 필요가 없이 전산시스템상에서 처방전을 전달하게 되었습니다.
대표적인 OCS 프로그램으로는 전능 IT가 개발한 ADAMS OCS 소프트웨어가 있습니다. 이는 환자 접수에서 치료, 수납 등 환자가 병원에 머무르고 있는 동안의 과정이 컴퓨터에 의해 처리되는 시스템입니다. 이전에 병원에서 환자의 진료를 위해서 사람이 직접 차트를 이동시키고, 재고 관리 등을 수행하곤 했는데 이러한 과정이 전부 전산화 될 수 있도록 제공한다는 특징이 있습니다.
주로 OCS에 포함되는 기능들은 다음과 같습니다.
▶ 환자 접수
외래 환자 예약, 입원 환자 예약, 예방접종 환자 관리, 가족차트 관리, 바이탈 정보 관리 등의 기능이 포함됩니다.
▶ 진료실
의사가 환자를 진료하며 종이가 아닌 컴퓨터에 직접 환자의 상태, 병록, 상담 진료 및 처방 내용을 입력합니다. 이후에 진료지원실에 주문(Order)를 내고 그 결과를 받아 환자를 상담 및 진료할 수 있습니다. 약국 계산, 진료 지원실 관리, 예약 및 예방접종 관리 등이 포함됩니다.
▶ 청구 관리
외래 환자 및 입원 환자의 진료내역을 확인할 수 있으며 보험 종류 및 기간, 청구 형태의 다양한 요구에 따라 명세서를 작성하고 청구 작업을 쉽게 할 수 있도록 도와줍니다. 구체적으로 서면, 청구 대상자 조회 및 출력 등의 기능이 포함됩니다.
▶ 진료 지원실
진료실 외에 환자 진료를 위해서 의료 장비 및 진료를 지원하고, 다양한 편의를 제공할 수 있도록 도와줍니다. 구체적으로 검사실, 물리치료실, 방사선실, 수술실, 주사실 등과 관련한 기능이 들어갑니다. 치료 및 검사, 진료 결과 전달, 처방 내역 조회 기능 등이 포함됩니다.
처방 전달 시스템(OCS)는 일반적으로 전자 의무 기록(EMR) 소프트웨어와 함께 사용됩니다. EMR는 주로 진료 기록 자체에 초점을 맞춘 프로그램으로 OCS와 그 맥락을 같이한다는 특징이 있습니다. 그래서 한꺼번에 묵어서 OCS/EMR 소프트웨어라고 부르기도 합니다. 그래서 지금은 명칭만 다르고 사실상 비슷한 소프트웨어를 지칭한다는 특징이 있습니다.
'병원 소프트웨어' 카테고리의 다른 글
| EMR(Electronic Medical Record) 소프트웨어에 대해서 (0) | 2018.06.05 |
|---|
EMR(Electronic Medical Record) 소프트웨어에 대해서
※ EMR(Electronic Medical Record)에 대해서 ※
EMR(Electronic Medical Record)란 전자 의무 기록의 약자입니다. 기존 1990년대 이전에는 병원에서는 환자의 정보를 모두 종이에 기재하여 보관했습니다. 일반적으로 환자의 인적 사항, 병력, 진찰 결과, 치료 결과, 수술 기록, 입퇴원 기록, 외래 진료 사항 등이 포함되었습니다. 사실 행정적인 업무가 중요한 다른 산업체와 비슷하게 의료 업계에서도 모든 정보를 기록할 때 전산화가 이루어질 필요가 강하게 있던 시기입니다. 그래서 결과적으로 1990년대 중반 이후로 EMR이라는 이름의 전산 시스템이 병원에 도입됩니다.
사실상 매일매일 신규 환자 및 입원 환자의 정보를 처리해야 되는 병원에서는 환자 차트를 종이로 관리하게 되면 최소 하루에 몇 백 장 가량의 종이가 낭비됩니다. 또한 종이는 독립적인 데이터로 존재한다는 점에서 모바일이나 기타 컴퓨터로 연동이 될 수도 없다는 단점도 존재합니다. 무엇보다 전산 시스템은 사실상 영구적으로 보존이 가능하지만 종이는 시간이 지나면 변질될 수 있다는 점에서 매우 많은 분야에서 전산 시스템이 도입되기 시작했고, 병원도 사실은 그러한 흐름 중 하나라고 보시면 됩니다.
※ 국내 EMR의 한계점 ※
다만 국내 EMR 소프트웨어와 관련하여 상용 소프트웨어를 검색해보면 유비케어, 비트컴퓨터, 전능 IT가 존재합니다. 다만 병원 소프트웨어에 관심이 많은 사람이라면 알겠지만 국내 EMR 소프트웨어들은 모두 각기 다른 표준을 가지고 운영되고 있습니다. 데이터베이스 설계부터 사용자 인터페이스까지 모든 부분에 있어서 소프트웨어마다 다르게 구성되어 있습니다.
의료 업계와 관련한 국제 표준으로는 ISO 13606 등이 있는데 이러한 표준은 다른 표준에 비해서 실제 소프트웨어에 잘 적용이 되어있지도 않습니다. 이러한 실정은 사실 국내의 큰 병원 및 영세한 병원들이 각기 다른 요구사항을 가지고 있기 때문이기도 한데 전반적으로 국내 의료 시스템의 표준화가 시급한 실정입니다. 표준화가 안 되어있어 각기 분산되어 있는 의료 정보들은 실질적으로 범국가적인 통계 및 연구에 이렇다한 주지 못한다는 점에서 개선의 여지가 분명합니다.
▶ 관련 기사 ①: '표준화 못해 전자의무기록 수출길 막힌 IT 강국의 현실', 2014-11-12, 임솔 기자, <조선 비즈>
해당 기사에 따르면 국내 대부분의 병원에서 사용되고 있는 전자 의무 기록(EMR) 및 의료 정보 시스템이 국제 표준을 따르고 있지 않아 세계적으로 의료 표준을 따르고 있는 국가로 의료 시스템의 수출이 불가능한 상태라고 합니다. 어플리케이션과 웨어러블 기기를 통한 환자 건강관리가 가능하기 위해서는 EMR 시스템이 국제 표준을 준수해야 하는데 국내 시스템은 국제 표준을 제대로 따르고 있지 않은 추세입니다. 결과적으로 의료 정보 연동 및 의료 시스템 수출이 어려운 상황인 것입니다.
미국은 최근 국제 표준을 준수한 EMR이 급격히 늘고 있어 빠르게 병원 시스템 연동이 이루어지고 있습니다. 우리나라의 경우 보건복지부가 2005년에 EMR 표준화를 위해 통합의료정보시스템 구축을 위한 사업단을 출범시킨 적이 있습니다. 다만 예비 타당성 검토 결과 사업성이 없다는 이유로 2009년에 부적격 판정을 받고 중단이 되었습니다. 사실 국제 표준이 내용이 방대하고 이해하기 어렵다는 단점이 있습니다. 미국 주도의 표준안인 HL7은 전체 내용이 3만 쪽에 이를 정도입니다. 앞서 언급했던 유럽 표준인 ISO 13606도 천 쪽이 넘습니다. 다시 말해 IT 개발자 입장에서도 방대한 의료 지식이 필요하다는 점에서 EMR 구축은 어려울 수 밖에 없습니다.
더불어 국내 의료 업계에서는 병원간 진료 정보가 교류되면 이중 검사로 인한 수익을 올릴 수 없다는 이유로 오히려 표준화를 꺼리기도 합니다. 심지어 EMR 가격이 조금만 올라도 불매 운동을 벌일 정도로 돈을 쓰지 않으려는 경향이 국내 병원 전반에 퍼져있으므로 신중한 EMR 개발이 필요한 상황입니다. (물론 지금은 현행법상 의료정보가 병원이 아닌 제 3기관에 보관될 수 있다는 점에서 그나마 클라우드 기반의 시스템 개발이 이루어지고 조금씩 발전하고 있는 추세입니다.)
▶ 관련 기사 ②: '4차 산업혁명 적신호 켜진 한국 EMR', 2017-06-23, 황재희 기자, <MEDI:GATE>
해당 기사에 따르면 인공지능이 보건의료에 혁명을 가져다 줄 것 이라고 보는 시대에서 국내 의료 데이터를 보다 의미 있게 쓸 필요가 있습니다. 의료정보학회는 현재 병원마다 제각각인 EMR을 표준화하여 세계적으로 교류할 수 있는 데이터로 만들어 의료의 질을 높여야 한다고 주장하고 있습니다. 특히 고도화된 데이터를 만들었을 때 국가적으로 인센티브를 줄 필요도 있다고 보는 전망입니다.
현재는 단순히 환자의 정보를 수집하는 목적의 EMR이지만 향후 진료 및 연구 목적으로 공유하고 활용할 수 있는 EMR이 되어야 합니다. 미국은 벤더(Vendor) 중심의 EMR이 사용되고 있습니다. 하지만 국내 병원은 벤더 중심이 아니라 병원 중심으로 개발된 소프트웨어를 이용하고 있다는 점에서 표준화 작업이 필요한 상황입니다. 병원마다 정보를 공개하지 않으려는 경향 때문에 이러한 추세는 나아질 기미가 없는 상황입니다.
그래서 최근에는 각 병원 데이터를 모아 공통 데이터 모델(CDM) 방식으로 전환하는 작업이 수행되고 있는 추세입니다. 대표적으로 오딧세이 컨소시엄이 각 병원의 비표준화 데이터를 한데 모아 CDM으로 전환해 표준화시키고, 분석 도구와 툴을 제공하면 병원은 원하는 정보를 얻기 위해서 데이터를 적용하고 그 결과를 도출해 연구 및 임상 실험에 사용할 수 있는 방식입니다.
'병원 소프트웨어' 카테고리의 다른 글
| OCS(Order Communication System) 소프트웨어에 대해서 (0) | 2018.06.05 |
|---|
[ 자료구조 ] 5. 연결리스트를 이용한 스택(Stack)
스택(Stack)을 구현하는 방법은 크게 단순 배열(Array)을 이용한 방법과 단방향 연결 리스트(Linked List)를 이용한 방법이 있습니다. 이번 시간에는 연결 리스트(Linked List)를 이용한 방법에 대해 간단히 알아보도록 하겠습니다.
※ 스택 선언하기 ※
스택 선언은 기존의 연결 리스트와 동일하게 진행합니다.
----------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
typedef struct Node *NodePointer;
typedef struct Node {
int data;
NodePointer next;
} Node;
NodePointer top = NULL;
----------------------------------------------------------------
※ 스택에 삽입하기 ※
스택 삽입도 기존의 연결 리스트와 흡사하게 진행합니다. 다만 단방향이라서 top을 기준으로만 삽입해주면 됩니다.
----------------------------------------------------------------
int push(int data) {
NodePointer ptr;
ptr = (NodePointer) malloc(sizeof(Node));
// 컴퓨터에 남은 메모리가 없는 경우
if(ptr == NULL) {
printf("메모리 할당에 실패했습니다.\n");
return -1;
}
ptr->data = data;
// 스택이 비어있는 경우
if(top == NULL) {
ptr->next = NULL;
}
// 스택이 비어있지 않은 경우
else {
ptr->next = top;
}
// 새 노드를 최상단 노드로 설정합니다.
top = ptr;
return 1;
}
----------------------------------------------------------------
※ 스택 정보 출력하기 ※
top부터 출발해서 NULL을 만날 때까지 모든 원소를 출력해주기만 하면 됩니다.
----------------------------------------------------------------
void show() {
NodePointer ptr = top;
while(ptr != NULL) {
printf("%d\n", ptr->data);
ptr = ptr->next;
}
}
int main(void) {
push(5);
push(7);
push(3);
show();
return 0;
}
----------------------------------------------------------------
'자료구조' 카테고리의 다른 글
| [ 자료구조 ] 4. 이중 연결 리스트(Double Linked List) (0) | 2018.06.04 |
|---|---|
| [ 자료구조 ] 3. 연결 리스트(Linked List) (0) | 2018.06.04 |
| [ 자료구조 ] 2. 중위 표기법을 후위 표기법으로 변환하여 계산하기 (5) | 2018.06.04 |
| [ 자료구조 ] 1. 선형 구조와 수식 계산 (0) | 2018.06.04 |
[ 자료구조 ] 4. 이중 연결 리스트(Double Linked List)
이번 시간에는 이중 연결 리스트(Double Linked List)에 대해서 알아보도록 하겠습니다. 이중 연결 리스트는 말 그대로 모든 노드가 이전 노드와 다음 노드에 대한 정보를 모두 저장하고 있는 리스트를 의미합니다. 표현해보면 다음과 같이 표현할 수 있습니다.
※ 선언하기 ※
------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
typedef struct Node *NodePointer;
typedef struct Node {
int data;
NodePointer prev;
NodePointer next;
} Node;
NodePointer head, tail;
------------------------------------------------------------
※ 삽입 함수 ※
삽입이 이루어질 때는 기본적으로 자신이 들어갈 위치를 찾습니다. 저는 data를 기준으로 오름차순 정렬이 이루어지도록 삽입 함수를 작성했습니다. 이 때 i라는 별도의 변수가 사용됩니다. 결과적으로 i는 삽입될 직전의 위치를 알려주는 역할을 수행합니다. 이후에 총 4번 링크를 수행해 새로운 변수를 삽입하게 됩니다. 그 형태는 다음과 같습니다.
------------------------------------------------------------
void insert(int data) {
NodePointer i, element;
i = head->next;
while(i->data <= data && i != tail)
i = i->next;
element = (NodePointer) malloc (sizeof(Node));
element->data = data;
i->prev->next = element;
element->prev = i->prev;
i->prev = element;
element->next = i;
}
------------------------------------------------------------
※ 출력하기 ※
출력할 때는 head의 next부터 하나씩 tail에 도달하기 전까지 노드를 방문해 출력하면 됩니다.
------------------------------------------------------------
void show() {
NodePointer i;
i = head->next;
while(i != tail) {
printf("%d ", i->data);
i = i->next;
}
}
------------------------------------------------------------
※ 실제로 사용하기 ※
초기 상태를 다음과 같이 설정해주어야 한다는 것만 잊지 않으시면 됩니다.
------------------------------------------------------------
int main(void) {
head = (NodePointer) malloc (sizeof(Node));
tail = (NodePointer) malloc (sizeof(Node));
head->next = tail;
head->prev = head;
tail->next = tail;
tail->prev = head;
insert(7);
insert(1);
insert(8);
show();
return 0;
}
------------------------------------------------------------
실행 결과는 다음과 같습니다.
'자료구조' 카테고리의 다른 글
| [ 자료구조 ] 5. 연결리스트를 이용한 스택(Stack) (0) | 2018.06.05 |
|---|---|
| [ 자료구조 ] 3. 연결 리스트(Linked List) (0) | 2018.06.04 |
| [ 자료구조 ] 2. 중위 표기법을 후위 표기법으로 변환하여 계산하기 (5) | 2018.06.04 |
| [ 자료구조 ] 1. 선형 구조와 수식 계산 (0) | 2018.06.04 |
[ 자료구조 ] 3. 연결 리스트(Linked List)
연결 리스트(Linked List)는 포인터를 이용한 선형 구조로서 다양한 종류가 있습니다. 대표적인 것이 선형 리스트, 원형 리스트, 연결 스택, 연결 큐 등이 있습니다. 연결 리스트는 일반적으로 시험 문제로 출제가 될 때 실제 소스코드 구현과 관련한 문제가 출제된다는 점에서 포인터(Pointer)를 활용한 실질적인 구현 방법에 대해서 이해하고 있으셔야 합니다. 다만 이후에 트리(Tree) 구조 등과 관련한 개념에서는 실질적인 구현을 물어보지는 않고 그 동작 원리에 대해서만 자세히 물어본다는 특징이 있습니다.
사실 연결 리스트는 단일 연결리스트만 확실히 이해해도 다른 것들은 무난하게 넘어가실 수 있습니다. 대표적인 단일 연결 리스트(Singly Linked List)의 예제에 대해서 알아보도록 합시다.
※ 삽입 함수 ※
-----------------------------------------------
struct Student {
int id; /* 학번 */
int score; /* 학생 성적 */
struct Student *next;
};
위와 같이 하나의 학생(Student)이라는 노드를 정의해봅시다. 이를 단일 연결리스트로 표현하면 다음과 같은 형태가 될 것입니다.
삽입 함수는 매우 기본적인 로직을 따릅니다. 단순히 자신이 들어갈 위치까지 계속해서 넘어가다가 들어갈 위치를 찾으면 비로소 그 때 들어가면 됩니다. 기본적으로 사용자 정보들은 학번을 기준으로 오름차순으로 정렬되고, 동일한 학번은 입력되지 않는다고 했을 때 삽입(Insert) 함수는 다음과 같이 작성될 수 있습니다.
-----------------------------------------------
void insert(struct Student **head, int id, int score) {
struct Student *prevptr; // 삽입하려는 위치의 직전 노드
struct Student *ptr; // 삽입하려는 위치의 노드
struct Student *element; // 삽입하려는 노드
element->id = id;
element->score = score;
element->next = NULL;
// 리스트가 비어있는 경우
if((*head) == NULL) {
(*head) = element;
return;
}
// 리스트가 비어있지 않은 경우
prevptr = NULL;
ptr = (*head);
while(ptr != NULL) {
// 들어갈 위치를 찾지 못한 경우
if(ptr->id < id) {
prevptr = ptr;
ptr = ptr->next;
}
// 들어갈 위치를 찾은 경우
else {
// 첫 번째 원소로 들어가는 경우
if(prevptr == NULL) (*head) = element;
// 첫 번째 원소로 들어가지 않는 경우
else prevptr->next = element;
element->next = ptr;
return;
}
}
// 마지막 원소로 들어가는 경우
ptr->next = element;
}
-----------------------------------------------
※ 역체인 ※
역체인(Reverse Chain)은 연결리스트를 뒤집는 함수입니다. 만약 1부터 4까지 데이터가 노드로 연결이 되어있다면 다음과 같이 4부터 1까지 데이터가 노드로 연결이 되도록 바꾸는 과정이 역체인 과정이라고 할 수 있습니다.
-----------------------------------------------
typedef struct Node *NodePointer;
typedef struct Node {
int data;
NodePointer next;
};
-----------------------------------------------
위와 같이 노드가 선언이 되어있다고 했을 때 역체인 함수는 다음과 같이 구현할 수 있습니다.
-----------------------------------------------
void reverse(NodePointer *head) {
NodePointer one, two, three;
int cout = 0;
two = NULL;
one = three = *head;
while(three != NULL) {
three = three->next;
// 실질적으로 역체인이 수행되는 라인
two->next = one;
one = two;
two = three;
}
}
'자료구조' 카테고리의 다른 글
| [ 자료구조 ] 5. 연결리스트를 이용한 스택(Stack) (0) | 2018.06.05 |
|---|---|
| [ 자료구조 ] 4. 이중 연결 리스트(Double Linked List) (0) | 2018.06.04 |
| [ 자료구조 ] 2. 중위 표기법을 후위 표기법으로 변환하여 계산하기 (5) | 2018.06.04 |
| [ 자료구조 ] 1. 선형 구조와 수식 계산 (0) | 2018.06.04 |
[ 자료구조 ] 2. 중위 표기법을 후위 표기법으로 변환하여 계산하기
본 포스팅에는 오류가 있습니다. 시간날 때 수정하겠습니다.
일반적으로 우리가 알고 있는 대수학의 표기법인 중위 표기법을 컴퓨터에게 계산하도록 만들고 싶으면 후위 표기법으로 변환한 뒤에 계산하는 과정이 필요합니다. 실제로 계산기 등이 내부적으로 수행하고 있는 방법이기도 합니다. 재미있는 점은 중위 표기법을 후위 표기법으로 바꿀 때는 오직 스택(Stack)만 있으면 됩니다. 스택을 적절히 활용하면 처리할 수 있다는 점이 매우 큰 특징입니다.
컴퓨터가 수식을 계산하는 방법은 다음의 두 절차를 따르면 됩니다.
① 중위 표기법을 후위 표기법으로 변환하기
중위 표기법을 후위 표기법으로 바꿀 때는 다음의 절차를 따르면 됩니다.
1) 피연산자가 들어오면 바로 출력합니다.
2) 연산자가 들어오면 자기보다 우선순위가 높거나 같은 것들을 빼고 자신을 스택에 담습니다.
3) 여는 괄호 '('를 만나면 무조건 스택에 담습니다.
4) 닫는 괄호 ')'를 만나면 '('를 만날 때까지 스택에서 출력합니다.
한 번 중위 표기식 ( a + b - c ) * d * e을 위 공식에 따라서 후위 표기법으로 변환해봅시다.
변환 결과: a b + c - d e * *
숫자를 이용해 표현해봅시다. ( 5 + 6 - 7 ) * 1 * 5 이 경우도 다음과 같이 변환할 수 있습니다.
변환 결과: 5 6 + 7 - 1 5 * *
이러한 과정을 의사코드로 표현하면 다음과 같습니다.
------------------------------------------------------------------------------------------------
void translation(exp) {
while((token = getChar(exp)) != NULL) {
if(token == 피연산자) print(token);
else if(token == ')') {
while(stack[top] != '(') print(pop());
pop();
}
else {
while(getPriority(stack[top]) >= token) print(pop());
push(token);
}
}
while((token = getChar(exp)) != NULL) print(token);
}
② 후위 표기법을 계산하기
후위 표기법을 계산할 때는 다음의 절차를 따르면 됩니다.
1) 피연산자를 만나면 스택에 담습니다.
2) 연산자를 만나면 스택에서 두 개의 연산자를 꺼내서 연산한 뒤에 그 결과를 스택에 담습니다.
3) 연산을 마치고 스택에 남아있는 하나의 피연산자가 연산 수행 결과입니다.
후위 표기식: 5 6 + 7 - 1 5 * *
계산 결과: 20
이러한 과정을 의사코드로 표현하면 다음과 같습니다.
------------------------------------------------------------------------------------------------
void calculate(exp) {
int x, y, z;
while((token = getChar(exp)) != NULL) {
if(token == 피연산자) push(token);
else if(token == 연산자) {
x = pop();
y = pop();
z = y 연산자 x;
push(z);
}
}
print(pop());
}
'자료구조' 카테고리의 다른 글
| [ 자료구조 ] 5. 연결리스트를 이용한 스택(Stack) (0) | 2018.06.05 |
|---|---|
| [ 자료구조 ] 4. 이중 연결 리스트(Double Linked List) (0) | 2018.06.04 |
| [ 자료구조 ] 3. 연결 리스트(Linked List) (0) | 2018.06.04 |
| [ 자료구조 ] 1. 선형 구조와 수식 계산 (0) | 2018.06.04 |
[ 자료구조 ] 1. 선형 구조와 수식 계산
선형 구조와 수식 계산
자료구조에서 선형 구조(Linear Structure)는 말 그대로 데이터를 선형적으로 표현하는 자료구조를 의미합니다. 선형구조에는 배열(Array), 스택(Stack), 큐(Queue), 연결 리스트(Linked List) 등이 포함됩니다. 스택은 일반적으로 수식 계산에 가장 많이 사용됩니다. 공무원 시험이나 대학원 시험 등 어떠한 시험을 치를 때에도 스택과 관련한 문제가 굉장히 많이 출제되므로 모든 선형 구조 중에서 스택은 꼭, 반드시 알고 있어야 합니다. 또한 추가적으로 스택과 큐가 함께 사용되는 구조를 데큐(Deque)라고 합니다.
일반적으로 소프트웨어에서 수식을 계산할 때는 스택(Stack)을 사용합니다. 이는 컴퓨터의 내부적인 처리 방식과도 연관이 깊습니다. 스택에 대한 자세한 설명은 네이버 블로그 https://blog.naver.com/ndb796/221230937978에서 제가 이전에 정리한 바가 있습니다.
표기 방식의 세 가지 종류
▶ 전위 표기(Prefix)
전위 표기란 연산자를 피연산자 앞에 표기하는 방법입니다.
EX) * - + a b c * c a
▶ 중위 표기(Infix)
중위 표기란 연산자를 피연산자의 가운데에 표기하는 방법입니다. 일반적으로 대수학에서 사용되는 표기법입니다.
EX) ( a + b - c ) * d * e
▶ 후위 표기(Postfix)
후위 표기란 연산자를 피연산자의 뒤에 표기하는 방법입니다. 컴퓨터가 처리하기에 가장 적합한 표기법입니다.
EX) a b + c - d e * *
위 세 가지 표기법에서 예시로 든 수식은 사실 모두 동일한 수식입니다. 이를 가장 먼저 전위 표기법을 이진 트리로 표현함으로써 증명해보겠습니다. * - + a b c * c a는 다음과 같이 연산 우선순위를 설정할 수 있습니다.
이제 이걸 토대로 바로 다음과 같이 이진 트리로 표현할 수 있습니다.
이진 트리로 표현한 뒤부터는 전위 표기, 중위 표기, 후위 표기로 나타내는 것은 매우 쉽습니다. 전위 표기법으로 표현할 때는 바로 부모 노드를 출력하고, 왼쪽 노드 및 오른쪽 노드에 방문하면 됩니다. 중위 표기법으로 표현할 때는 왼쪽 노드, 부모 노드, 오른쪽 노드로 방문하면 됩니다. 마지막으로 후위 표기법은 왼쪽 노드, 오른쪽 노드, 부모 노드를 차례대로 방문하면 됩니다.
또한 재미있는 점은 중위 표기법을 제외하고 전위 표기법 및 후위 표기법에서는 괄호가 들어가지 않습니다. 괄호 없이 처리할 수 있다는 점에서 컴퓨터가 처리하기에 있어서는 가장 편리하고 간단한 표기 방식이라고 할 수 있습니다.
▶ 중위 표기 및 후위 표기 변환기: https://www.mathblog.dk/tools/infix-postfix-converter/
또한 이 사이트에서는 중위 표기와 후위 표기를 마음대로 변환할 수 있도록 해줍니다. 상당히 유용해요.
'자료구조' 카테고리의 다른 글
| [ 자료구조 ] 5. 연결리스트를 이용한 스택(Stack) (0) | 2018.06.05 |
|---|---|
| [ 자료구조 ] 4. 이중 연결 리스트(Double Linked List) (0) | 2018.06.04 |
| [ 자료구조 ] 3. 연결 리스트(Linked List) (0) | 2018.06.04 |
| [ 자료구조 ] 2. 중위 표기법을 후위 표기법으로 변환하여 계산하기 (5) | 2018.06.04 |
