이클립스로 스프링 프레임워크 개발을 할 시 이클립스 환경 구축은 크게 두가지 방법이 있습니다.


1) 이클립스를 설치 한 후 STS를 별도로 설치

2) STS플러그인이 통합된 이클립스를 설치.



1번 방법의 설치는 이클립스를 설치한 뒤 다음 메뉴를 선택합니다.

이후 STS를 검색하여 설치하면 됩니다.

Install을 누릅니다.

이후 Confirm을 누릅니다.

라이센스의 동의를 체크한 뒤, Finish를 누르면 됩니다.


설치가 다 되면, 이클립스를 재시작할 것인지를 물어보는 대화상자가 나타납니다. 이 때 Yes를 눌러서 재시작합니다.


기존 이클립스에 STS를 설치한 경우 스프링 개발환경 뿐만 아니라 다른 개발환경도 지원하는 이클립스이므로, 스프링의 관점(Perspective)로 바꾸어주어야 합니다. 다음과 같은 과정을 통해서 스프링의 관점으로 변경합니다.


Windows - Perspective - Open Perspective - Others를 누릅니다. 만약 해당 엔트리 중에 Spring이 있다면 Spring을 바로 눌러주어도 상관없습니다.


Spring을 선택한 후 Open을 눌러주시면 됩니다.


이후에 다시 변경할 일이 생긴다면 해당 위치에 있는 Spring Perspective 아이콘을 눌러주시면 됩니다.



2번 방법의 설치는 다음 링크로 진입한 뒤, Download STS 버튼을 누르면 됩니다.

https://spring.io/tools/sts

해당 패키지를 다운로드 받은 뒤, 압축을 해제하고 실행하면 이미 STS가 설치되어있는 이클립스가 실행됩니다. 스프링을 개발하기 위해서 이클립스를 설치한다면 2번 방법을 이용하는 것이 훨씬 간단합니다.


만약 이미 이클립스를 설치하고 사용하고 있다면 조금 번거롭더라도 1번 방법을 사용하면 이클립스로 다양한 개발을 진행할 수 있습니다.

2017년 12월 22일 기준, 마이크로소프트에서 제공하는 아래 링크에서 Windows 10 부팅 USB 제작 툴을 구할 수 있습니다. Windows 10의 부팅 USB와 해당 iso 파일은 무료로 배포되지만, 해당 운영체제에 사용되는 라이센스 키, 과거 CD로 설치하던 시절에는 CD-key라고 불리기도 했고, Product Key라고도 불리는 키는 돈을 주고 구매를 하거나 해야 합니다. 간혹 노트북을 구매 시, 윈도우 운영체제가 이미 설치되어 있는 경우, 노트북의 겉 면을 잘 찾아보면 윈도우 운영체제의 Product Key가 표시되어 있거나, 별도의 등록 절차를 통해서 키 인증을 받을 수 있는 경우가 있으므로 해당 사항은 좀더 찾아보시면 되겠습니다.


어쨋든 키를 가지고 있다고 가정하고 Windows 10 부팅 USB를 만들어 보도록 하겠습니다.


그리고 내용이 지워져도 상관없는 8GB 이상의 용량을 가진 USB 플래시 메모리도 필요합니다.



https://www.microsoft.com/ko-kr/software-download/windows10


위와 같은 웹 페이지가 나타나게 되는데, '지금 도구 다운로드' 버튼을 누르면 MediaCreationTool.exe라는 파일을 받을 수 있습니다. 해당 툴을 실행시켜보도록 하겠습니다.


당연 조건을 동의해주어야지 사용이 가능합니다. 동의를 누릅니다.

부팅 USB를 만드는 것이므로 두번째 라디오 박스를 선택합니다.

설정에 맞게 선택합니다. 에디션은 Windows 10만 가능하며, 아키텍쳐의 경우 CPU호환성을 확인해 보아야 하는데, 현재 대한민국 기준으로 64비트가 호환되지 않는 CPU는 거의 없으므로 저는 그대로 갑니다.

USB 플레시 메모리에 윈도우 부팅 이미지를 올릴 것이므로 첫번째 라디오 박스를 선택합니다.

지금 부착되어 있는 외장 스토리지에 맞게 선택합니다. 저 같은 경우에는 E드라이브에 외장 하드디스크가 있고, F드라이브에 USB 플래시 메모리가 있기에, F드라이브를 선택합니다.

시간이 다소 걸립니다. 침착하게 기다리도록 하겠습니다.

완료된 모습입니다.

안전하게 USB를 제거한 뒤 물리적으로 분리하도록 하겠습니다.


이제 이 USB를 이용하여 윈도우10을 원하는 기기에 설치하면 됩니다.

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


백준저지 11279번 최대 힙 문제입니다.


파이썬이나 C++ STL에서 제공해주는 heap, priority_queue 자료구조를 사용하면 간단하게 풀 수 있지만, 최대힙을 직접 구현하면서 해당 자료구조에 대하여 한번 공부해도록 하겠습니다.


힙이라는 자료구조는 일단 ADT(Abstract Data Type)이기 때문에 직접적으로 메모리상에 어떠한 구조로 나열되든간에, 설계된 대로만 동작하면 맞습니다.

Complete Binary Tree라는 자료구조 특성상 일반 트리 처럼 포인터로 구현을 하기 보다는 배열로 구현하는 것이 편합니다.

저도 이번에 배열로 구현을 할 예정이며 C++ STL에서 제공하는 vector 컨테이너를 사용하겠습니다.


배열로 구현한 Binary Tree는 각 노드 번호 i에 대하여 Left child는 i*2, Right child는 i*2+1의 번호를 갖습니다. 그러기 위해서는 루트노드의 번호를 1부터 새야 하므로 data[0]에는 더미노드를 하나 넣어서 1부터 새도록 구현했습니다.


최대 힙은 두개의 연산을 제공하는데, 새로운 데이터를 넣는 연산과, 힙에서 최대값을 빼내는 연산입니다.

최대 힙의 구조상 부모 노드는 항상 자식 노드보다 값이 크므로, 힙에서 값을 빼내는 연산은 항상 루트 노드의 값을 빼내게 됩니다.

각각의 연산을 push와 pop이라고 명명하겠습니다.


push 연산은 다음과 같은 절차로 이루어집니다.

1. Complete binary tree가 되도록, 마지막 위치에 넣는 값을 집어넣습니다.

2.  직속 부모 노드와 값을 비교하여 자신의 값이 직속 부모 노드 보다 값이 작을 때 까지 부모 노드와 위치를 바꿉니다.


pop 연산은 다음과 같은 절차로 이루어집니다.

1. 리턴할 루트 노드의 값을 따로 빼놓습니다. 그리고 가장 마지막 노드의 값을 루트 노드의 위치로 이동시킵니다.

2. 이동된 노드가 자신의 양쪽 자식 노드와 비교해서 둘 중에 자신보다 큰 값을 가진 노드가 있다면 그 중 가장 큰 노드를 자신의 위치와 바꿉니다. 자신이 모든 직속 자식들보다 값이 클 때 까지 반복합니다.

#include <iostream>

#include <cstdio> #include <vector> using namespace std; #define MAX_SIZE 100001 class max_heap { private: vector<int> data; public: max_heap() { this->data.push_back(-1); // index 0 means dummy data } max_heap(int size) { this->data.reserve(size); this->data.push_back(-1); //index 0 is dummy data } int pop() { if (this->data.size() <= 1) { //heap is empty return 0; } int current = 1; int left_child = 2; int right_child = 3; int ret = this->data[current]; int last = this->data.size() - 1; swap(this->data[current], this->data[last]); this->data.pop_back(); while (this->data.size() > left_child) { //when left child exist int larger_index = left_child; if (this->data.size() > right_child) { //when right child exist if (this->data[right_child] > this->data[left_child]) { larger_index = right_child; } } if (this->data[larger_index] > this->data[current]) { swap(this->data[current], this->data[larger_index]); current = larger_index; left_child = current * 2; right_child = left_child + 1; } else { break; } } return ret; } bool push(int val) { this->data.push_back(val); int current = data.size() - 1; int parent = current/2; while (parent > 0 && this->data[current] > this->data[parent]) { swap(this->data[current], this->data[parent]); current = parent; parent = current/2; } } }; int main() { max_heap heap(MAX_SIZE); int n; cin >> n; for (int i=0; i < n; i++) { int tmp; cin >> tmp; if (tmp > 0) { heap.push(tmp); } else { cout << heap.pop() << endl; } } return 0; }


+ Recent posts