문제 접시 a, b, c, d 가 있고, 알파벳 순으로 한쪽이 막혀 있는 세척기에 들어간다고 할 때, b a c d 순으로 꺼내기 위해서는 push, push, pop, pop, push, pop, push, pop을 하면 된다. 세척기에서 꺼내는 순서가 주어질 때 그 동작을 출력하는 프로그램을 작성하시오. 만약 주어진 순서대로 접시를 꺼낼 수 없다면 “impossible”을 출력한다. 입력 첫째 줄에 소문자 알파벳이 주어진다. 중복된 소문자 알파벳은 입력되지 않는다. 알파벳 소문자는 26개이다. 입력되는 알파벳의 길이는 최대 26 자리이다. 출력 접시를 꺼내는 것이 가능한 경우 push, pop의 순서를 출력한다. 이것이 불가능하다면 impossible을 출력한다. 입력 예시 1 bacd 출력 예시 1..
구조 스택(stack)은 제한적으로 접근할 수 있는 나열 구조이다. 그 접근 방법은 언제나 목록의 끝에서만 일어난다. 끝먼저내기 목록(Pushdown list)이라고도 한다. 스택은 한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형 구조(LIFO - Last In First Out)으로 되어 있다. 자료를 넣는 것을 '밀어넣는다' 하여 푸쉬(push)라고 하고 반대로 넣어둔 자료를 꺼내는 것을 팝(pop)이라고 하는데, 이때 꺼내지는 자료는 가장 최근에 푸쉬한 자료부터 나오게 된다. 이처럼 나중에 넣은 값이 먼저 나오는 것을 LIFO 구조라고 한다. 이를테면, a부터 b와 c를 순서대로 넣은 다음 자료를 하나씩 꺼내면 c부터 b와 a의 순서로 나오게 된다. 구현 코드 import java.util.*; p..
문제 n개의 숫자가 주어지고, q개의 질문이 주어진다. 각각의 질문은 n개의 숫자 중에서 특정 숫자가 몇개나 있는지를 묻는다. q개의 질문에 모두 답하는 프로그램을 작성하시오. 입력 첫 번째 줄에 숫자의 개수 n, 그리고 질문의 개수 q가 주어진다. ( 1 ≤ n ≤ 100,000, 1 ≤ q ≤ 100,000) 두 번째 줄에 n개의 숫자가 주어진다. 세 번째 줄에 q개의 질문이 주어진다. 주어지는 q개의 질문에 해당하는 숫자 범위는 100,000,000이하이다. 출력 각 질문에 대하여 숫자의 개수를 한 줄에 하나씩 출력한다. 입력 예시 10 4 1 3 4 3 2 3 1 2 5 10 1 3 9 10 출력 예시 2 3 0 1 코드 Java import java.util.*; public class Main..
문제 상근이는 나무 M미터가 필요하다. 근처에 나무를 구입할 곳이 모두 망해버렸기 때문에, 정부에 벌목 허가를 요청했다. 정부는 상근이네 집 근처의 나무 한 줄에 대한 벌목 허가를 내주었고, 상근이는 새로 구입한 목재절단기를 이용해서 나무를 구할것이다. 목재절단기는 다음과 같이 동작한다. 먼저, 상근이는 절단기에 높이 H를 지정해야 한다. 높이를 지정하면 톱날이 땅으로부터 H미터 위로 올라간다. 그 다음, 한 줄에 연속해있는 나무를 모두 절단해버린다. 따라서, 높이가 H보다 큰 나무는 H 위의 부분이 잘릴 것이고, 낮은 나무는 잘리지 않을 것이다. 예를 들어, 한 줄에 연속해 있는 나무의 높이가 20, 15, 10, 17이라고 하자. 상근이가 높이를 15로 지정했다면, 나무를 자른 뒤의 높이는 15, 1..
탐색 과정 이진 탐색(Binary Search) 알고리즘은 리스트에서 특정한 값의 위치를 찾는 알고리즘이다. 먼저 이 알고리즘은 반드시 정렬을 한 후에 탐색을 시작해야 한다. 탐색할 범위의 시작과 끝이 같은 경우에는 찾지 못한 것으로 본다. 그렇지 않은 경우에는 탐색할 범위의 중간값을 확인하여 찾고자 하는 값보다 크거나 작은지 확인한다. 만약 값이 같다면 검색에 성공하여 위치를 반환하고 탐색을 종료한다. 중앙값이 찾는 값보다 크면 새로운 최댓값으로, 작다면 새로운 최솟값으로 설정하여 다시 탐색을 시작한다. 반드시 정렬을 해야한다는 단점이 있지만, 검색을 반복할 때마다 탐색할 범위가 1/2로 줄어들기 때문에 탐색 속도가 빠른 편이다. 구현 코드 import java.util.Scanner; public c..
정렬 과정 퀵 정렬은 분할 정복(divide and conquer) 방법을 통해 리스트를 정렬한다. 리스트의 길이가 1 이하이면 이미 정렬된 것으로 본다. 그렇지 않은 경우에는 분할(divide): 임의의 피벗을 지정하여 피벗보다 큰 원소와 작은거나 같은 원소, 두 부분 리스트로 나눈다. 결합(combine): 작은 리스트 - 피벗 - 큰 리스트로 결합한다. 정복(conquer): 두 부분 리스트를 재귀적으로 퀵 정렬을 이용해 정렬한다. 복사(copy): 임시 배열에 저장된 결과를 원래 배열에 복사한다. 재귀 호출이 한번 진행될 때마다 최소한 하나의 원소는 최종적으로 위치가 정해지므로, 이 알고리즘은 반드시 끝난다는 것을 보장할 수 있다. 역시나 분할과 정복 방식이다. 구현 코드 package net...
정렬 과정 흔히 쓰이는 하향식 2-way 합병 정렬은 다음과 같이 작동한다. 리스트의 길이가 1 이하이면 이미 정렬된 것으로 본다. 그렇지 않은 경우에는 분할(divide): 정렬되지 않은 리스트를 절반으로 잘라 비슷한 크기의 두 부분 리스트로 나눈다. 정복(conquer): 각 부분 리스트를 재귀적으로 합병 정렬을 이용해 정렬한다. 결합(combine): 두 부분 리스트를 다시 하나의 정렬된 리스트로 합병한다. 이때 정렬 결과가 임시배열에 저장된다. 복사(copy): 임시 배열에 저장된 결과를 원래 배열에 복사한다. 이 과정에서 재귀 함수를 활용한다. 분할 후 분할된 2개의 조각에 다시 합병정렬을 실행한다. 분할과 정복. 구현 코드 package net.jetalab.excercise.mergesort..
Electron 시작하기 - 02 - 백조의 발처럼 통신하기 (ipcMain, ipcRenderer)
2022.03.17
Elecron으로 만든 Application은 하나의 웹 사이트가 실행 가능한 프로그램으로 작동한다고 생각해도 좋습니다. 프로그램의 덩치가 커지면 여러 페이지를 제어해야 할 필요가 생깁니다. 우아하게 떠있는 백조가 사실은 가라앉지 않기 위해 발을 구르고 있는 것처럼, 우아한 프로그램을 위해 보이지 않는 곳에서 발을 구르는 법을 알아봅니다. 2개의 창 지난 번에는 하나의 창만 표시했었습니다. 당연한 이야기지만 여러 창을 표시하는 것도 가능합니다. 이번 예제에서는 아래 동영상처럼 서로 다른 창이 통신하는 프로그램을 작성해봅니다. ipcMain, ipcRenderer Electron은 메인 프로세스와 렌더러 프로세스, 쉽게 말해서 Node.js 영역과 웹 페이지 영역이 통신할 수 있는 방법으로 ipcMain과..
Electron은 Node.js 개발자에겐 정말 강력한 무기입니다. 웹 사이트를 구성하던 기술 그대로 Desktop Application을 만들 수 있게 해주기 때문이죠. 이미 Electron은 충분히 알려져있기 때문에 공식 사이트에 있는 글로 소개를 갈음합니다. Electron? Electron은 JavaScript와 HTML, CSS를 이용해 Desktop Application을 제작할 수 있는 프레임워크입니다. Chromium과 Node.js를 바이너리에 내장하여, Electron은 하나의 JavaScript 코드로 Windows와 macOS, Linux에서 모두 작동할 수 있는 크로스 플랫폼 App을 만들 수 있도록 도와줍니다. Native app 개발 경험이 필요하지 않죠. Intoroduct..
오늘 만들 것 지금까지 게시물을 작성하는 API와 호출, 수정, 삭제하는 API까지 만들었습니다. 마지막으로 게시물 목록을 호출하는 API를 구현합니다. 시작 이번 글은 Lab09의 코드에 기능을 추가하는 방식으로 진행합니다. Lab09는 이전 글에서 확인할 수 있습니다. 별도의 프로젝트에서 진행하고자 하면, Lab09와 동일하게 프로젝트를 생성한 뒤 코드를 복사해서 준비합니다. Lab09의 코드를 그대로 사용한다면 아래 예제 코드의 패키지명에 유의합니다. 아래 예제 코드는 별도의 프로젝트를 생성하는 방식으로 진행합니다. DTO 추가 다음 경로의 파일을 아래와 같이 작성하여 추가합니다: /src/main/java/YOUR/DOMAIN/ARTIFACT/dto/ListDTO.java package net.j..
오늘 만들 것 지난 Lab05에서 우리는 게시물 호출 API를 작성했었습니다. 그 때 게시물 호출 API 작성하며 게시물 조회수 카운트는 나중에 구현하기 위해 주석만 남겨두었습니다. 오늘은 그 때 미뤄둔 게시물 조회수 카운트를 구현합니다. 시작 이번 글은 Lab08의 코드에 기능을 추가하는 방식으로 진행합니다. Lab08은 이전 글에서 확인할 수 있습니다. 별도의 프로젝트에서 진행하고자 하면, Lab08과 동일하게 프로젝트를 생성한 뒤 코드를 복사해서 준비합니다. Lab08의 코드를 그대로 사용한다면 아래 예제 코드의 패키지명에 유의합니다. 아래 예제 코드는 별도의 프로젝트를 생성하는 방식으로 진행합니다. DAO 수정 다음 경로의 파일을 아래와 같이 편집합니다: /src/main/java/YOUR/DOM..
오늘 만들 것 이번 글에서는 게시판 구현의 마지막 단계인 게시글 삭제를 구현합니다. 게시글 삭제는 두 가지 방법을 사용할 수 있습니다. 실제로 DB에서 삭제하거나 삭제 표기를 하는 방법입니다. 이번 글에서는 주로 사용되는 방법인 삭제 표기를 진행합니다. 시작 이번 글은 Lab06의 코드에 기능을 추가하는 방식으로 진행합니다. Lab06는 이전 글에서 확인할 수 있습니다. 별도의 프로젝트에서 진행하고자 하면, Lab06과 동일하게 프로젝트를 생성한 뒤 코드를 복사해서 준비합니다. Lab06의 코드를 그대로 사용한다면 아래 예제 코드의 패키지명에 유의합니다. 아래 예제 코드는 별도의 프로젝트를 생성하는 방식으로 진행합니다. SQL Mapper 수정 다음 경로의 파일을 아래와 같이 편집합니다: /src/mai..