[인실리코젠] Programmers Lv2.JadenCase 문자열 만들기 리뷰 답변 및 BPM(Business Process Management) 프로세스 모델링
·
인실리코젠
더보기 해당 글은 (주)인실리코젠 이병준 주임님께서 작성해주신 리뷰에 대한 답변입니다. Programmers Lv2.JadenCase 문자열 만들기 문제를 접하고 가장 먼저 든 생각은 "split 함수와 subString을 사용하면 풀 수 있겠다!" 였다. 하지만 보다 나은 방법을 고민하다가 StringBuilder 와 StringTokenizer를 발견하였다. StringTokenizer는 C언어의 strtok()의 로직과 유사하지만 원본을 훼손하지 않는다. Split VS StringTokenizer StringTokenizer 클래스 문자열을 구분자를 이용해 분리할 때 사용 토큰은 분리된 문자열 조각으로, StringTokenizer 클래스는 하나의 문자열을 여러 개의 토큰으로 분리하는 클래스 St..
[인실리코젠] Apache POI 라이브러리를 이용한 Exel 데이터 읽기
·
인실리코젠
더보기 해당 글은 (주)인실리코젠 이수호 주임님께서 주신 문제에 대한 풀이입니다. 더보기 문제 : 2017-2018 K리그팀들의 규칙에 따른 승점과 순위를 구하시오. ※ 규칙에 따르면 경기에서 이긴 팀은 3점을 얻고 비기면 1을 지면 0점을 받는다. ※ (첨부된 2018K리그 엑셀 파일 리스트를 불러와서 구현)->API 활용(POI) 결과 예) 팀 = 대구 ,승점 = 101 순위= 1 팀 = 울산 ,승점 =94 순위= 2 팀 = 서울 ,승점 =68 순위= 3 팀 = 수원 ,승점 =48 순위= 4 팀 = 전북 ,승점 =41 순위= 5 ... 조건 정렬 알고리즘 구현할 필요 없음(원하면 해도 됨) 출력은 console에 찍히는 정도로 엑셀 파일 관련 라이브러리 : Apache POI 2018K리그.xlsx ..
[인실리코젠] 배열 vs 리스트
·
인실리코젠
더보기 해당 글은 (주)인실리코젠 조일흠 선임님께서 질문하신 내용에 대한 답변입니다. 배열 배열 - 여러 개의 데이터를 하나의 이름으로 그룹핑해서 관리하기 위한 자료구조 index는 값에 대한 유일무이한 식별자(마치 주민번호)(리스트에서 인덱스는 몇 번째 데이터인가 정도의 의미를 가짐) 논리적 저장 순서와 물리적 저장 순서가 일치 => index로 해당 원소에 접근할 수 있다. (O(1)의 시간복잡도를 가짐) 연속된 메모리의 공간으로 이루어져 있다 배열은 정의와 동시에 길이를 지정하며 길이를 바꿀 수 없다. 리스트 리스트 - 배열과 같이 데이터를 그룹핑해서 관리 리스트는 순서가 있는 엘리먼트의 모임으로 배열과는 다르게 빈 엘리먼트는 절대 허용하지 않는다. 리스트는 배열이 가지고 있는 인덱스라는 장점을 버..
[테트리스] - Vanilla JS
·
자바 스크립트
더보기 Node.js를 공부하기 전에 JS에 대한 지식을 쌓기 위하여 미니 프로젝트를 진행하려고 한다. 본 프로젝트는 유튜버 "데브리"님의 실전 강의를 참고 하였다. JS에 대한 지식이 얕았기 때문에 해당 프로젝트는 꽤 많이 도움이 되었다. 다양한 내장 함수를 사용하였고 Live Server를 사용하여 즉각적인 코드의 변화를 확인해가며 코드를 작성하니 오류 검출 또한 수월했다. 테트리스의 규칙은 간단하다. 블록이 쌓이면서 한 줄이 꽉 채워지면 그 줄은 사라지고 한 줄로 된 블록을 없애면서 블록이 맨위로 쌓이지 않도록 버티는 방식이다. 프로젝트를 진행하기 앞서 필요한 내용들을 작성하여 보겠다. 블록들을 표현할 직사각형 모양의 툴이 필요하다. 블록들은 랜덤으로 표현되어야 한다. 아무런 행동을 하지 않아도 블..
[백준] 1300번 - K번째 수 (C언어) [Gold2]
·
알고리즘
더보기 input output 3 7 6 해당 문제는 단순히 이중 배열을 선언하여 정렬하려고 한다면 시간 초과가 발생할 것이다. 따라서 빠르게 해결할 수 있는 알고리즘인 이진 탐색(이분 탐색)을 사용하였다. 기본적인 알고리즘은 아래와 같다. 더보기 low=1, high=n*n으로 설정 low cnt cnt값이 목표 인덱스 보다 크거나 같을 경우 mid를 왼쪽으로 옮기기 cnt값이 목표 인덱스 보다 작을 경우 mid를 오른쪽으로 옮기기 루프 탈출 후 low값 출력 [n = 3 , k = 5 인 경우] array[3][3] 1 2 3 1 1 2 3 2 2 4 6 3 3 6 9 *mid 값보다 작은 값들의 갯수를 구하는 함수 먼저 구현 ll func(ll x) { // mid보다 작은 수들의 개수를 시간 초과..
[백준] 11053번 - 가장 긴 증가하는 부분 수열 (C언어) [Silver2]
·
알고리즘
input output 6 10 20 10 30 20 50 4 해당 문제는 동적 계획법을 사용하여 문제를 해결 하였다. 입력된 배열을 탐색하는 과정에서 자기 자신보다 작은 값을 찾는 경우에 해당 인덱스를 저장하고 dp 배열에 저장하였다. 수열의 길이는 dp 배열에서 가장 최댓값을 가지는 수의 인덱스이므로 가장 큰 값을 업데이트 해주면 문제 해결이 가능하다. 전체 소스 코드는 아래와 같다. #include #pragma warning(disable:4996) int main() { int arr[1001]; int dp[1001] = {0,}; // Dynamic Programming Array int max = 0; int n; scanf("%d", &n); for (int i = 0; i < n; i+..
[백준] 1517번 - 버블 소트 (C언어) [Platinum5]
·
알고리즘
input output 3 3 2 1 3 해당 문제는 버블 정렬에 대한 개념을 설명하고 SWAP이 일어나는 횟수를 구하는 문제여서 단순히 버블정렬을 사용한다면 시간초과가 발생한다. 시간 제한이 1초이므로 시간복잡도가 O(N^2)인 버블정렬로는 절대 구현할 수 없다. 보다 빠른 알고리즘인 합병정렬을 사용하거나 세그먼트 트리를 이용하면 O(NlogN)의 시간 복잡도를 가지므로 문제 해결이 가능하다. 필자는 합병 정렬을 사용하였다. 우선, 버블 정렬에서 SWAP이 일어나는 구간은 어떤 원소 i가 존재할 때, i보다 앞에 있으면서 작은 수들을 뒤로 보낼때 작은 수들의 갯수만큼 SWAP이 일어난다. 따라서 합병 정렬에서는 정복 단계에서 SWAP이 일어나고 정렬은 합병 단계에서 일어난다. 버블 정렬에서 SWAP의 ..
[백준] 2042번 - 구간 합 구하기 (C언어) [Gold1]
·
알고리즘
input output 5 2 2 1 2 3 4 5 1 3 6 2 2 5 1 5 2 2 3 5 17 12 해당 문제는 배열의 인덱스 요소에서 설정한 범위내에 구간의 합을 구하는 문제이다. 일반적인 배열의 구간 합은 O(n)의 시간 복잡도를 가지만 해당 문제에서 입력으로 주어지는 모든 수는 -2^63 보다 크거나 같고 2^63 - 1보다 작거나 같은 정수이므로 시간 제한이 2초이므로 보다 빠른 알고리즘을 사용해야 한다. 필자는 세그먼트 트리를 통해 해결하였는데, 세그먼트 트리는 O(logn)의 상당히 빠른 알고리즘이다. 세그먼트 트리는 몰랐던 자료구조 이기 때문에 세그먼트 트리가 무엇인지 알아보면서 풀이를 진행하겠다. 세그먼트 트리는 이진 트리 구조이다. 따라서 각 노드에 대한 정보를 알 수 있다. 부모노..