분류 전체보기
-
BOJ) 가장 긴 바이토닉 부분 수열 (11054 번)알고리즘/백준 2021. 1. 7. 16:11
가장 긴 바이토닉 부분 수열 11054번: 가장 긴 바이토닉 부분 수열 첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000) www.acmicpc.net 바이토닉 부분 수열은 요소들의 증감이 변곡점을 하나 이하로 가진 부분 수열이다. 즉, {1, 3, 5, 6, 4} 혹은 {1,2} 혹은 {7,3,5}와 같은 수열들이 바이토닉 수열이라 할 수 있다. 이 문제를 풀기 위해서는 LIS, LDS에 대한 개념이 있어야한다고 한다. LIS => Longest Increasing Subsequence (최장 증가 부분 수열) LDS => Longest Decreasing Subsequence (최장 감소 부분 수열)..
-
BOJ) 최솟값과 최댓값 (2357 번)알고리즘/백준 2021. 1. 5. 18:24
최솟값과 최댓값 2357번: 최솟값과 최댓값 N(1 ≤ N ≤ 100,000)개의 정수들이 있을 때, a번째 정수부터 b번째 정수까지 중에서 제일 작은 정수, 또는 제일 큰 정수를 찾는 것은 어려운 일이 아니다. 하지만 이와 같은 a, b의 쌍이 M(1 ≤ M ≤ 100 www.acmicpc.net 앞서 포스팅한 세그먼트 트리를 활용하는 문제다. 위의 문제와 차이점이라면 구간 합을 구하는 대신, 최솟값과 최댓값을 저장한다는 점이다. 또한, 이 문제에서는 세그먼트 트리의 크기를 직접 구해서 초기화해줬다. 세그먼트 트리 초기화 private static class SegmentTree { int[] minTree, maxTree, numArr; private int size; public SegmentTre..
-
BOJ) 구간 합 구하기 (2042 번)알고리즘/백준 2021. 1. 5. 18:09
구간 합 구하기 2042번: 구간 합 구하기 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)과 M(1 ≤ M ≤ 10,000), K(1 ≤ K ≤ 10,000) 가 주어진다. M은 수의 변경이 일어나는 횟수이고, K는 구간의 합을 구하는 횟수이다. 그리고 둘째 줄부터 N+1번째 줄 www.acmicpc.net 세그먼트 트리를 이용해서 푸는 문제다. 우선, 이 문제를 풀기 위해서 세그먼트 트리에 대해서 공부해야했다. 백준 사이트에 블로그란에 기재되어있는 세그먼트 트리를 보고 풀었다. 세그먼트 트리란 무엇인가?? 먼저, 세그먼트 트리는 배열의 크기가 커질 경우, 연산 식에 유용하다. 공간 복잡도가 O(N^2)이고 시간 복잡도가 O(N^2)인 배열에 대한 연산이 있다면, 세그먼트 트리를 이용하여 O..
-
BOJ) 줄 세우기 (2252 번)알고리즘/백준 2021. 1. 2. 16:20
줄 세우기 2252번: 줄 세우기 첫째 줄에 N(1≤N≤32,000), M(1≤M≤100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의미이 www.acmicpc.net 오랜만에 포스팅을 하게 된 이유는 위상 정렬에 대한 정리를 하기 위해서이다. 위키에 따르면 위상 정렬(topological sorting)은 방향 그래프의 꼭짓점들(vertex)을 변의 방향을 거스르지 않도록 나열하는 것을 의미한다. 가장 대표적인 예로 대학의 선수과목(prerequisite) 구조를 들 수 있다. 만약 특정 수강과목에 선수과목이 있다면 그 선수 과목부터 수강해야 하므로, 특정 과목들을 수강해야 할 때 ..
-
Docker Compose 한국 표준 시간 설정하기기술 이야기/CI&CD 2020. 12. 31. 12:08
Docker Compose Timezone Setting 개발을 하다보면 현재 시간을 활용한 코드가 발생할 수 있다. 어떠한 시간 기준에 따라 무언가를 처리하는 로직이 존재할 때, 서버와 요청하는 클라이언트의 표준 시간이 다르면 곤란하다. 현재 운영하고 있는 서비스에서도 현재 시간을 검사해야하는데, 서버 시간과 클라이언트의 시간이 달라서 조금 난감한 상황이 생겼다. Docker Compose로 컨테이너를 관리하고 있는데, 서버 시간을 셋팅해도 도커 컨테이너 시간이 바뀌지 않는 것이었다. (어찌보면 당연하다) 본론으로 넘어가면, compose 야믈 파일에 환경 변수를 설정해주면 된다. version: '2' services: myContainerName: image: ImageName .....
-
프로젝트를 TDD로 진행하며 느낀 TDD 경험담기술 이야기/TDD 2020. 12. 19. 20:13
TDD란 무엇인가?? TDD는 Test-Driven-Development의 약자로 말 그대로 테스트가 이끄는 개발이라는 개발 방법론이다. 아주 짧은 개발 사이클을 반복하며, 많은 개발자들이 채택하고있는 방법론 중에 하나이다. 요구사항을 검증하는 테스트 케이스 작성 ~> 테스트를 통과하기 위한 최소한의 코드 구현 ~> 작성한 코드를 표준(요구사항 명세)에 맞도록 리팩토링 테스트 케이스를 작성하고 테스트를 통과하기 위해 코드를 구현할 때, 설계 상의 오점을 빠르게 파악하여 수정하며 진행할 수 있다는 장점이 있다. 할고래DO의 TDD API 서버에서 유닛 테스트를 검증하며 TDD 방법론을 기반으로 개발을 진행했다. service와 api 모두 테스트를 진행하며 TDD를 하는 것이 정석이지만, 할고래DO를 개발..
-
NCP와 Jenkins 글 보완 및 새로운 내용들기술 이야기/CI&CD 2020. 12. 19. 17:41
왜 CI & CD를 생각하게 되었는가?? 부스트캠프의 수 많은 여정에서 프로젝트를 서버에 올리고 정상적으로 작동하는지 확인하는 작업은 생각보다 시간을 많이 차지했었다. 할고래DO 이전의 프로젝트를 진행할 때, 이 시간을 아껴서 개발이나 기술 학습에 조금 더 투자해보면 어떨까? 라는 생각이 들었고 실천에 옮겼다. 리서치 결과 CI 툴로 Jenkins와 Travis가 가장 많이 사랑을 받고 있었고, 각각의 장단점이 많았지만 체감이 되지않아 CI 계의 아버지인 Jenkins를 선택했었다. 이번 프로젝트에서도 배포에 투자하는 시간을 더욱 아끼기위해 사용해봤던 Jenkins를 CI & CD(여기서는 Delivery 입니다) 툴로 선택했다. 그렇다면 왜 무중단 배포일까?? Jenkins를 통해 새로운 배포 버전을 ..
-
2. 컴퓨터시스템의 구조카테고리 없음 2020. 11. 8. 00:00
컴퓨터시스템의 구조 CPU 매 클럭 시간마다 인스트럭션(명령)해서 메모리에서 하나씩 읽어온다. 또한, 매 클럭 시간마다 interrupt line을 체크한다. Memory CPU의 작업 공간 DISK Input / output 역할을 동시에 한다. 입력받은 것들을 전달하거나, 작업이 끝난 것을 저장하는 등 interrupt line CPU가 프로그램을 실행하고 있을 때, IO나 Exception이 발생하여 처리가 필요한 경우 CPU에게 알려서 처리할 수 있도록 하는 역할 interrupt = 새치기 time sharing 구현에 널리 사용됨 timer 특정 프로그램이 CPU를 독점하는 것을 막기 위해, timer에 값을 셋팅해서 CPU를 넘김 할당 시간을 관장한다고 생각하면 된다. mode bit mod..