adamdoha의 등록된 링크

키자드에 등록된 총 558개의 포스트를 확인하실 수 있습니다.

Naver Blog

[Mac] 확장자 기본 프로그램 설정

상황 : Xcode를 깔았는데, 그 다음부터 항상 markdown(.md) 기본 프로그램이 Xcode로 열리게 됐다. 뭐 어디 들어가서 설정하고 그랬는데 다음날 보면 또 Xcode로 열리고 그런다.맥린이라서 이거 어디서 설정해야 디폴트로 되는지 몰랐는데, 확실한 방법을 알게 되어 기록한다.우선 기본 프로그램을 지정할 파일 오른쪽 클릭 -> 정보 가져오기중간에 보면 다음으로 열기가 있다.원하는 프로그램으로 설정 후 모두 변경을 눌러준다.계속다음과 같이 기본으로 설정되고, 이후에도 모든 md파일은 Typora 프로그램으로 열리게 된다.

Naver Blog

[글귀] 록키 명대사

인생이란 건 결국 난타전이야네가 얼마나 센 펀치를 날리는가가 아니라네가 끝없이 맞아가면서도조금씩 앞으로 전진하며하나씩 얻어가는게 중요한거야계속 전진하면서 말야그게 진정한 승리야

Naver Blog

[Kubernetes] 파드, 컨테이너, 레플리케이션컨트롤러, 서비스가 서로 동작하는 방식

시나리오Json이나 Yaml 파일 없이 간단하게 replicationController을 생성하는 kubectl run 명령이나, kubectl apply -f 로 ReplicationController 구성 요소를 정의한 yaml, json 파일로 레플리케이션 컨트롤러를 생성하면, 레플리케이션컨트롤러가 실제 파드를 생성합니다.그리고, 클러스터 외부에서 파드에 접근할 수 있도록 쿠버네티스에게 레플리케이션 컨트롤러에 의해 관리되는 모든 파드를 단일 서비스로 노출하도록 명령합니다.파드, 컨테이너지금까지의 예제는 파드 하나에 한 컨테이너만 있었지만, 보통 파드는 원하는 만큼의 컨테이너를 포함시킬 수 있습니다.위의 그림에선 컨테이너 내부에 Node.js 프로세스가 포트 8080에 바인.......

Naver Blog

[Kubernetes] 파드(Pod)의 개념

파드(Pod)란- 함께 배치된 컨테이너의 그룹- 쿠버네티스의 기본 빌딩 블록- 일반적으로 파드는 하나의 컨테이너만 포함- 그러나 여러 컨테이너를 가지고 있을 경우에, 모든 컨테이너는 항상 하나의 워커 노드에서 실행되며, 여러 노드에 걸쳐 실행되지 않습니다.파드가 왜 필요해요?- 왜 컨테이너를 직접 사용하지 않아요?- 왜 여러 컨테이너를 같이 실행할 필요가 있을까요?- 모든 프로세스를 단일 컨테이너에 넣을 수도 있잖아요?여러 프로세스를 실행하는 단일 컨테이너보다 다중 컨테이너가 나은 이유IPC나 로컬 파일을 통해 통신하는 여러 프로세스로 구성되어 같은 노드에서 실행해야 하는 애플리케이션이 있다고 가정해봅시다.그러면 &#.......

Naver Blog

SSH 로그인 접속 시 퍼미션 문제 (UNPROTECTED PRIVATE KEY FILE)

뭐 대략 다음과 같은 SSH 로그인 시 이슈가 있을 때가 있다.읽어보면 너무 오픈되어 있다! 이게 private가 맞냐!? 무시할꺼다! 요런 느낌이다.요놈의 권한이 644로 되어 있다. 이 권한을 400으로 변경해줬다. 간단하게 chmod 400 key.pem 해주면 된다.

Naver Blog

앞으로의 Issue 기록(수정)

앞으로의 이슈는 깃허브에 기록할 예정입니다.레이블 기능이 맘에 들어서 이 쪽으로 옮기는 것이 좋을 것 같네요.

Naver Blog

[LeetCode] Binary Tree Zigzag Level Order Traversal

문제 링크 : https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/문제를 해결한 방법Tree의 Depth별로 출력하는데, 이를 정방향, 역방향, 정방향.. 이렇게 지그재그로 출력하는 문제였습니다.그래서 Base는 BFS로 너비우선탐색을 이용했습니다.그리고 정방향, 역방향을 구분하는 방법은 다음과 같은 로직을 세웠습니다.1. 정방향으로 출력하는 Depth에서는 좌측->우측으로 자식 노드를 탐색합니다.2. 역방향으로 출력하는 Depth에서는 우측->좌측으로 자식을 탐색합니다.물론 출력 != 탐색입니다.그러나, 출력과 동일하게 탐색 또한 정방향 -> 역방향 -> 정방향으로 하겠다는 것입니다.이 BFS를.......

Naver Blog

[LeetCode] Longest Increasing Subsequence

문제 링크 : https://leetcode.com/problems/longest-increasing-subsequence/문제를 해결한 방법lowerbound의 O(NlogN) 또는 dp의 O(N^2)으로 LIS를 구하면 됩니다.LIS에 대한 설명은 이미 블로그에 많이 했으므로 생략합니다.lowerbounddp

Naver Blog

[LeetCode] Not Boring Movies

문제 링크 : https://leetcode.com/problems/not-boring-movies/문제를 해결한 방법홀수인 것은 %2 = 1 이면서(AND) 문자열 조건은 != 나 Not LIKE로 처리해주면 됩니다.

Naver Blog

[LINE] Thanks for welcome, LINE!

지난 이야기NOW, WOW!지난 번에 Day 1, Day 2, Day 3, Day 4를 기대하며 Work Box(Welcome kit) 개봉기를 올렸었다! 매 세션마다 다양한 교육들이 진행됐었는데, 강사님들이 하나 같이 선물을 많이 준비하셨다고 했다. 부끄럼 많은 성격이긴 하지만, 그래도 대답할 수 있는 부분은 적극적으로 대답했다. 팀과의 활동도 적극적으로 참여하고, 좋은 팀원들을 만나서 1등을 한 것도 몇 개 있고~! ㅋㅋ 재밌었다. 좋은 팀원들과 노력해주시는 운영진님들. 조금은 빡셌지만 유익했던 교육들.그리고 오늘 그 선물을 받아와서 기분이 좋아서 기록하려고 쓰는 글!! (헤헤)1. 치킨yeah~~~ 방탈출 게임 1등했더니 치킨 주셨다. 블랙 치즈볼 + 콜라까지.......

Naver Blog

[LeetCode] Construct Binary Tree from Preorder and Inorder Traversal

문제 링크 : https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/문제를 해결한 방법트리의 순회 문제입니다. 이 문제는 분할 정복으로 해결할 수 있습니다.주로 이런 유형의 문제들이 있습니다. preorder와 inorder 또는 inorder와 postorder가 주어지고, 이 트리를 복원하라는 문제들 말이죠.지금 이 문제인 preorder, inorder가 주어졌을 때 트리를 복원하는 방법을 간단히 알아보겠습니다.preorder 탐색 순서는 어떻게 되나요? 루트 -> 좌측 서브 트리 -> 우측 서브 트리inorder 탐색 순서는 어떻게 되나요? 좌측 서브 트리 -> 루트 -> 우측 서브 트리 순입니다.즉, preorder의 맨.......

Naver Blog

청담에이프릴어학원 동작캠퍼스 학원차량 지도교사 배달기사 비하 및 갑질 논란!?

정말 인성이 참 중요하다는 걸 느낀다. 직업에 귀천이 어딨으며.... 무시하고 논리도 없는 갑질에 눈살이 찌푸려진다.상황 설명 : 2월의 첫날 한 음식점에서 배행 요청이 와서 주문한 '학원'으로 우리 라이더가 배달을 갔습니다. 학원에서 아이들을 가르치던 선생님이 음식을 주문한 듯한데.. 지금 바쁘니까 아래 내려가서 기다리라고 했다고 합니다.. 내려가서 기다리면 계산하러 내려가겠다고... 그 말에 우리 라이더는 학원에서 나와 1층 밖에서 5~10분 사이쯤으로 기다렸고 다른 오더를 배정받아 시간이 촉박하여 다시 학원으로 올라갔다고 합니다. 근데 그 학원 선생님 말이 애들 가르치고 있고 지금 바쁘니까 그냥 기다리라고.......

Naver Blog

[LeetCode] Container With Most Water

문제 링크 : https://leetcode.com/problems/container-with-most-water/문제를 해결한 방법투 포인터를 이용하여 풀었습니다.포인터 1 : 좌측 변포인터 2 : 우측 변을 의미합니다. 각각 양 끝에서 시작합니다. 물은 항상 작은 높이를 기준으로 채워지므로, 작은 높이 기준으로 Area를 구합니다.이 때, 우측의 높이가 크다면 좌측의 포인터를 당겨주고, 좌측의 높이가 크다면 우측의 포인터를 당겨주면 됩니다.왜 그럴까요?아무래도 큰 게 좋겠죠? 큰 벽이 있는데 그 부분은 남겨두고 작은 벽인 쪽을 포인터를 변경시키는 개념입니다.그리고 더 큰 벽이 있을 때까지 반복하는 것이죠. 꼭 이전보다 더 큰 벽이 나온다고 해서 max가 갱신.......

Naver Blog

yyyy-MM-dd? yyyy-MM-DD?

LocalDateTime을 원하는 포맷(yyyy-MM-dd'T'HH:mm:ss)에 맞게 변형해야 하는 상황입니다.자, 2가지 포매팅이 있습니다.yyyy-MM-ddyyyy-MM-DD뭐가 맞을까요?자, 그럼 지금부터 date와 a1 : a2를 번갈아 가며 보여드리겠습니다.date (1월)a1 : a2date (2월)a1 : a2date (3월)a1 : a2......더는 안 볼겁니다.네. 보시듯이 1월을 제외하고는 a1과 a2가 다르게 나옵니다.지금이 1월이라서 yyyy-MM-DD로 잘못 쓰고 LocalDateTime.now()로 테스트하다가, 잘 나오길래 아무 의심 없이 넘어갔었는데.. 이런 이슈가 있었다니!! 체크해보니 DD로는 day를 년 단위로 셉니다. 윤년도 체크해주네요.(2020년 2월 29일)그러니까.. 1월.......

Naver Blog

[LeetCode] Big Countries

문제 링크 : https://leetcode.com/problems/big-countries/문제를 해결한 방법OR 이나 Union으로 조건을 묶어서 풀면 됩니다.

Naver Blog

[LeetCode] Implement Trie (Prefix Tree)

문제 링크 : https://leetcode.com/problems/implement-trie-prefix-tree/문제를 해결한 방법일반적인 트라이 구현 문제입니다.이 문제에서는 소문자로만 주어지기에 arr[26]으로도 해결할 수 있겠으나 저는 일반적인 트라이 구현 형태인 Map을 이용해서 해결했습니다. insert는 존재한다면 해당 노드를 타고 들어가고, 존재하지 않으면 새로운 노드를 만들어주면 됩니다. 그리고 마지막 노드에 해당 word의 개수를 +1해주면 됩니다.Search는 탐색하는 도중에 노드가 존재해야만 하고, 노드의 마지막에도 word의 개수가 1개 이상이어야 합니다.StartsWith는 탐색하는 도중에만 노드가 존재하면 됩니다. 포함관계이기 때문입니다.

Naver Blog

[LeetCode] Sum of Two Integers

문제 링크 : https://leetcode.com/problems/sum-of-two-integers/문제를 해결한 방법우리가 일반적으로 사용하는 +를 비트 연산(AND, XOR, BITSHIFT)으로 구현하는 문제였습니다. 이 방법에 대한 설명은 여기에 설명이 잘 되어 있습니다.

Naver Blog

[LeetCode] Flatten Nested List Iterator

문제 링크 : https://leetcode.com/problems/flatten-nested-list-iterator/문제를 해결한 방법리스트 안에 리스트가 있을 수 있으며, 이 리스트를 벗겨내고 숫자만을 취합하는 문제입니다.순서가 보장되어야 하므로, 재귀로 모든 리스트가 벗겨질 때까지 반복하도록 설계했습니다.만약 현재 리스트에서 접근한 value가 숫자라면 답에 해당하는 list에 insert를 해주면 되지만, single integer value가 아닌 list가 존재한다면 그 list를 다시 재귀 함수의 로직을 태우는 방법입니다. 이렇게 하면 결국 single integer value일 때까지 반복될 것이며, 기존 리스트에서의 value 순서도 유지가 됩니다.

Naver Blog

[Kafka Streams] Multiple Outbound - Branch

이것은 Multiple Producer로 동작하는 것이 아니다.if~ else if~else 방식으로 동작한다.2가지 스타일이 있고, 혼용하면 동작하지 않는다.1. Functional Style함수형 스타일@Bean으로 Function Interface를 등록하고, .yml이나 .properties에서 Bean을 설정하는 방법입니다. spring.cloud.stream.function.definition : 함수명1;함수명2;함수명3; 을 설정하고그 내부에 default로 생성되는 함수명-in-0, 함수명-out-0.. 이런 식으로 내부 설정을 이어나가주면 됩니다.2. Imperative programming model명령형 프로그래밍 모델이번엔 명시적으로 @EnableBinding(구현해야할 인터페이스.class)를 어노테이션으로 설정해주고,@StreamListener.......

Naver Blog

[Java] 스트림 활용(Stream API) - anyMatch, noneMatch, findAny, reduce

검색과 매칭1. Predicate가 적어도 한 요소와 일치하는 지 확인할 때Predicate가 주어진 스트림에서 적어도 한 요소와 일치하는지(true인지) 확인할 때 anyMatch 메서드를 이용할 수 있습니다. 예를 들면 다음과 같은 예제는 문자열 Stream 중 문자열의 문두에 "DolphaGo"가 있는지 확인하는 예제입니다.anyMatch는 boolean을 리턴하므로 최종연산입니다.2. Predicate가 모든 요소와 일치하는 지 검사할 때allMatch 메서드는 anyMatch와는 달리 스트림의 모든 요소가 주어진 Predicate와 일치하는 지 검사합니다.︎ noneMatchnoneMatch라는 녀석도 있습니다. 이 녀석은 allMatch와 반대 연산을 수행합니다. 즉, noneMatch는 주어.......

Naver Blog

6198번 : 옥상 정원 꾸미기

문제 링크 : https://www.acmicpc.net/problem/6198문제를 해결한 방법Stack을 활용했습니다.앞에서부터 건물의 현재 높이를 받으면서 그 높이에 따라 Stack을 어떻게 비울지가 달라집니다.Stack에는 기본적으로 내림차순으로 정렬합니다.그렇게 되면, 현재 높이를 바라볼 수 있는 건물들의 개수가 곧 Stack에 담긴 건물들의 개수이고, 이 개수를 정답에 += 해주면 간단하게 풀 수 있습니다.대신 이 문제는 [80000,1] 이라는 데이터가 들어온다면 최대 79999*80000/2 = 약 32억이기에 int형을 벗어납니다.정답은 long형으로 리턴해줍시다.

Naver Blog

[D4] 3143번 : 가장 빠른 문자열 타이핑

문제 링크문제를 해결한 방법KMP를 이용해서 해결했습니다.B 패턴의 실패함수를 구한 뒤, A패턴과 일치하는 지점을 찾으면 중복 방지를 위해 다시 패턴의 원점으로 돌려놓고, 이 패턴을 찾은 개수를 answer에 더해줬습니다.최종적으로 타이핑하게 될 수는 answer(B패턴 발견 수) + A 문자열의 길이 - (패턴을 찾은 개수 * B 패턴의 길이)가 됩니다.

Naver Blog

9084번 : 동전

문제 링크 : https://www.acmicpc.net/problem/9084문제를 해결한 방법간단한 다이내믹 프로그래밍 문제였습니다.동전의 액수를 A라고 하면, 다음과 같은 로직을 구현하면 됩니다.1. 0원을 만드는 방법의 수는 1개(초깃값)2. [A, Target] 을 만드는 방법은 각각 [0, Target-A]를 만드는 방법에 A원을 더하면 된다.나이스하게 금액의 오름차순으로 데이터가 주어지기에앞에서부터 위의 로직을 그대로 구현하면 됩니다.

Naver Blog

[LeetCode] Game of Life

문제 링크 : https://leetcode.com/problems/game-of-life/문제를 해결한 방법세포의 현재 상태, 주변(8곳)의 살아있는 세포의 개수에 따라 다음 상태를 결정해주는 문제였습니다.이러한 세세한 조건들은 문제에 적혀있든 그대로 하드코딩으로 구현했습니다.현재 세포가 죽어있든, 살아있든 간에 다음 상태를 결정하는 것은 주변 8곳의 살아있는 세포의 수 입니다.그래서 주변의 살아있는 세포의 수를 구하는 함수를 구현했고, 현재 세포의 상태와 주변 살아있는 세포의 수, 이렇게 2가지의 정보로 다음 세포의 상태를 결정하게 됩니다.그런데 Follow-up을 보면, in-place로 구현하라고 되어있습니다. 그러면 약간의 Tricky한 방법으로 풀 수.......

Naver Blog

[LeetCode] Binary Tree Level Order Traversal

문제 링크 : https://leetcode.com/problems/binary-tree-level-order-traversal/문제를 해결한 방법트리가 주어지면 Depth별로 Value를 그룹화하는 문제였습니다.BFS나 DFS를 이용해서 Depth별로 구하면 됩니다. 저는 BFS를 이용해서 Queue에 null이 아닌 TreeNode가 있음을 보장하고좌측에서 우측 방향으로 데이터를 Insert했습니다.

Naver Blog

[LeetCode] Kth Smallest Element in a Sorted Matrix

문제 링크 : https://leetcode.com/problems/kth-smallest-element-in-a-sorted-matrix/문제를 해결한 방법각 Row별로 오름차순으로 데이터가 주어지고, 이 전체 2차원 행렬에서 K번째로 큰 수를 구하는 문제였습니다.가장 쉬운 방법으로는 2차원 배열을 1차원 배열로 만든 뒤, 소트하여 k번째 값을 가져오는 방법입니다.그리고 오름차순인 점을 이용하면 파라메트릭 서치도 활용할 수 있습니다.하한값, 상한값을 잡아준 뒤, 임의의 값 m(=(상한+하한)/2)에 대해서 각 Row에서 upperbound를 이용해 해당 임의의 값보다 작거나 같은 것들의 개수를 count에 더해줍니다.만약 이 count가 목표치 k보다 작다면 하한값을 m+1로 올려주고, 목.......

Naver Blog

[LeetCode] Unique Paths

문제 링크 : https://leetcode.com/problems/unique-paths/문제를 해결한 방법특정 위치에 도달하는 방법의 가짓수를 찾는 쉬운 DP문제입니다.(장애물이 없기에 간단합니다.)0,0을 좌상단, m,n을 우하단이라고 가정하겠습니다.현재 위치 (y,x)에 도달할 수 있는 가짓수를 P(y,x)라고 하면, P(y,x)= P(y-1,x) + P(y,x-1) 입니다.

Naver Blog

[LeetCode] 4Sum II

문제 링크 : https://leetcode.com/problems/4sum-ii/문제를 해결한 방법4개의 그룹에서 각각 하나씩 선택하여 a+b+c+d의 값이 0이 되는 개수를 묻는 문제였습니다.더한다는 개념은 최소 2개의 그룹이 필요합니다. 그래서 (A, B)/(C, D) 이렇게 큰 그룹으로 나눴습니다.그리고 이 문제는 N이 500이기에, 만약 모든 경우에 대해서 하나씩 선택해서 합을 맞춰본다면 500^4이기에 시간초과는 너무나 당연합니다. 그렇지만 500^2라면 아주 귀여운 시간복잡도죠.로직은 다음과 같습니다.1. A와 B 그룹에서 각각 원소에 접근하여(->500^2의 경우의 수) 합을 map에 저장합니다. 합이 동일한 것이 여러 개 일 수도 있으니 value는 count로 활.......

Naver Blog

[LINE] NEW LINER Welcome Kit!

어느날 집으로 도착한 정체 불명의 검은색 상자.꽤나 컸었습니다. 살펴보니 저만 오픈 가능.. ㅎㅎ 라인다웠습니다. 귀엽더군요!열어보니 가장 먼저 보이는 것은 Day 1, Day 2, Day 3, Day 4 물품들입니다.열어보지 말래서 안열어봤어요. ㅎㅎ사실 오늘부터 Day 1입니다. 열어볼 생각에 기대가 되네요.두 번째로는 후드티가 눈에 보였습니다. (제가 하루 입어서 먼지가 보이네요..ㅋㅋㅠㅠ)왔을 때는 깔끔하게 포장되어 왔었습니다. 줄에 LINE, 등에 크게 LINE이 적혀있네요.한 번 사원증도 걸어봤습니다.맛있는 까까!손 세정제 (캐릭터가 귀엽네요.. )!? 소설 책도 선물로 왔습니다.라인 이어폰도 왔네요.피규어가 왔는데, 조립하고.......

Naver Blog

[LeetCode] Find the Duplicate Number

문제 링크 : https://leetcode.com/problems/find-the-duplicate-number/문제를 해결한 방법Map으로 확인하는 방법(시간복잡도 O(N), 공간 복잡도 O(N)) 정렬 후에, 이웃한 값을 비교하는 방법 (시간 복잡도 O(NlogN), 공간복잡도 O(1))플로이드의 거북이와 토끼 방법(투 포인터)The key insight in the algorithm is as follows. If there is a cycle, then, for any integers i ≥ μ and k ≥ 0, xi = xi + kλ, where λ is the length of the loop to be found and μ is the index of the first element of the cycle. Based on this, it can then be shown that i = kλ ≥ μ for some k if and only if xi = x2i. .......

Naver Blog

[LeetCode] Odd Even LinkedList

문제 링크 : https://leetcode.com/problems/odd-even-linked-list/문제를 해결한 방법홀수 번째와 짝수 번째를 따로따로 연결해버리면 node.next가 망가지기에, node.next.next에서 오류가 생깁니다. 그래서 홀수와 짝수를 동시에 이동시켜줘야 했습니다.oddNode, evenNode를 가져와서, oddNode.next와 evenNode.next가 둘다 null이 아닐 때까지 반복합니다.두 노드는 같은 방식으로 node.next=node.next.next로 매핑해줍니다.그리고 node.next가 그 다음 노드로 이동하도록 매핑되었으니, 다음 단계는 node=node.next로만 이동해줘도 됩니다.홀수번째 묶음 -> 짝수번째 묶음으로 매핑해야하기 때문에 짝수번째 묶음의 head가.......

Naver Blog

[LeetCode] Duplicate Emails

문제 링크 : https://leetcode.com/problems/duplicate-emails/문제를 해결한 방법중복된 이메일을 찾는 문제입니다.이메일을 그룹으로 묶고, 해당 그룹에서 2개 이상인 것들을 Select 해주면 됩니다.

Naver Blog

[LeetCode] Customers Who Never Order

문제 링크 : https://leetcode.com/problems/customers-who-never-order/문제를 해결한 방법A와 B테이블의 공통되는 점이 없는 A의 레코드들 중 A의 Name을 출력하는 문제입니다.LEFT JOIN을 한 뒤 o.Id가 NULL인 부분을 골라내는 방법도 있겠습니다.그리고 IN 절을 이용해서 B.CustomerId 에 존재하지 않는 레코드를 골라내는 방법도 있겠습니다.

Naver Blog

[Java] 스트림 활용(Stream API) - filter, distinct, takeWhile, dropWhile, limit, skip, map, flatMap

사전 데이터[Class Dish][Enum Type][Main Data]여러 개의 객체가 있을 때 그중 우리는 어떤 조건에 해당하는 것만 골라내서 다른 리스트에 담고 싶을 때가 있습니다. 예를 들어서 메뉴 중에 Vegetarian도 먹을 수 있는지를 체크해서 메뉴로 골라낸다면 흔히 다음과 같이 작성할 수 있습니다.이걸 이제 filter와 collect 연산을 지원하는 Stream API를 이용해서 데이터 컬렉션 반복을 내부적으로 처리할 수 있습니다. 다음처럼 말이죠.데이터 처리는 Stream API가 관리하기에 우리는 편하게 데이터 관련 작업을 할 수 있게 됩니다.따라서 Stream API 내부적으로 다양한 최적화가 이루어질 수 있습니다. Stream API는 내부 반복뿐만 아니라, 코.......

Naver Blog

[Programmers] 완주하지 못한 선수

문제 설명수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.제한사항마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.completion의 길이는 participant의 길이보다 1 작습니다.참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.참가자 중에는 동명이인이 있을 수 있습니다.입출력 예입출력 예 설명예제 #1leo는 참여자 명단에는 있지.......

Naver Blog

[LeetCode] Kth Smallest Element in a BST

문제 링크 : https://leetcode.com/problems/kth-smallest-element-in-a-bst/문제를 해결한 방법BST는 inorder로 순회하면 오름차순으로 탐색할 수 있습니다.모든 데이터를 List에 담아서 k번째의 값을 리턴하는 방법도 있지만, k번 째 데이터를 제외한 나머지 데이터를 굳이 저장해줄 필요가 없습니다.따라서 전역변수를 이용하여 방문한 지점마다 count를 해줍니다.이 count가 k가 된다면, 그 때의 node의 value가 k번째 작은 데이터가 됩니다.

Naver Blog

[LeetCode] Delete Duplicate Emails

문제 링크 : https://leetcode.com/problems/delete-duplicate-emails/문제를 해결한 방법한 테이블 내에서 중복된 이메일이 있는 레코드를 삭제하는 문제입니다.똑같은 테이블 2개를 준비하고, 이메일이 같으면서 id가 큰 쪽의 레코드를 삭제해주면 됩니다.

Naver Blog

[LeetCode] Rising Temperature

문제 링크 : https://leetcode.com/problems/rising-temperature/문제를 해결한 방법한 테이블 내에 날짜와 기온이 적혀있습니다.직전 날과 비교해서 현재의 기온이 높은 레코드를 출력하는 문제였습니다.직전날과의 비교는 DATEDIFF를 이용하면 됩니다.DATEDIFF(day1, day2) 는 day1-day2의 의미와 같기에, day1을 현재 날짜로 지정해주고, day2를 직전 날짜로 지정해주면 됩니다. 이 값의 차이가 1이여야 직전 날과 비교가 가능해집니다.그리고 추가적인 조건으로 이 중 현재 날짜의 기온이 더 높은 것들만 출력해주면 됩니다.

Naver Blog

[LeetCode] Product of Array Except Self

문제 링크 : https://leetcode.com/problems/product-of-array-except-self/문제를 해결한 방법재밌는 문제입니다.배열이 주어졌을 때, 현재 자기 자신을 빼고 나머지 곱을 출력하는 문제입니다.전체 곱 / 나누기를 사용하면 조금만 생각해봐도 divide in zero라던가, 0이 곱해진 부분을 다시 복원하는 것이 어렵겠죠.그렇기에 -> 왼쪽에서 하나씩 곱해나가면서 곱할 부분을 곱해주고, 그 다음 번에는 <- 오른쪽에서 왼쪽에서 하나씩 곱해가면서 곱할 부분에 곱해줍니다.하나씩 순차적으로 곱하는 것은 l, r로 지정했습니다. 가장 먼저 l과 r은 아무것도 곱하지 않은 상태이기에 1이겠죠.l부분을 곱하는 경우엔 그냥 대입을 하고.......

Naver Blog

[LeetCode] Rotate Image

문제 링크 : https://leetcode.com/problems/rotate-image/문제를 해결한 방법바뀌는 지점을 일일히 고려하기 번거로워서그냥 단순하게 90도 좌표 이동을 하고, 다시 원래 맵에 복사를 해주는 방식으로 구현했습니다.그런데 한 번에 맵 내부에서 뒤집는 방법도 있습니다.가운데 대각선을 잡고 시계방향으로 돌리는 방법입니다.

Naver Blog

[LeetCode] Group Anagrams

문제 링크 : https://leetcode.com/problems/group-anagrams/문제를 해결한 방법애너그램을 찾는 문제입니다. 이를 Group으로 만들어서 리턴하는 문제인데요.String을 내부적으로 정렬을 해서 해당 값을 Key로 사용하는 방법도 있겠습니다.그리고 굳이 정렬을 하지 않고, String의 Character하나하나 아스키코드 값을 더해서 Key로 활용하는 방법도 있겠습니다. 하지만 변환하는 과정, count배열을 매번 만들고 하나씩 넣는 등 속도가 느립니다. 정렬 최고!

Naver Blog

[LeetCode] Excel Sheet Column Number

문제 링크 : https://leetcode.com/problems/excel-sheet-column-number/문제를 해결한 방법ABC라는 문자열이 들어온다면((A*26) + B) * 26 + C 가 해당하는 숫자입니다.풀어 쓰면 (A * 26^2) + B * 26^1 + C * 26^0 가 됩니다.따라서 26^자릿수에 해당하는 값을 곱해서 answer에 더해주면 됩니다.

Naver Blog

[LeetCode] Contains Duplicate

문제 링크 : https://leetcode.com/problems/contains-duplicate/문제를 해결한 방법HashSet의 add는 이미 contain하고 있다면 false를 리턴합니다.hashMap의 put은 다음과 같이 동작하죠.그리고 pulVal 코드는 다음과 같습니다.따라서 HashSet으로 O(N)으로 해결할 수 있습니다.

Naver Blog

[LeetCode] Permutations

문제 링크 : https://leetcode.com/problems/permutations/문제를 해결한 방법일반적인 순열 구하는 방법을 재귀로 구현해서 풀었습니다.이건 스트림을 쓰고 싶어서 이렇게도 해봤습니다.

Naver Blog

[LeetCode] Binary Tree Inorder Traversal

문제 링크 : https://leetcode.com/problems/binary-tree-inorder-traversal/문제를 해결한 방법inorder는 현재 노드 기준으로 [좌측 방문]-현재 출력-[우측 방문] 순이므로 이를 그대로 구현해주면 됩니다.

Naver Blog

[LeetCode] Generate Parentheses

문제 링크 : https://leetcode.com/problems/generate-parentheses/문제를 해결한 방법짝을 지어서 ( ) 올바른 괄호 쌍을 만들 수 있는 모든 케이스를 출력하는 문제였습니다.올바른 괄호 쌍이 되기 위해서는 여는 괄호는 n개 까지만 열 수 있으며, 닫는 괄호는 여는 괄호보다 많을 수 없습니다.이 조건을 넣어준다면 재귀문으로 구현할 수 있습니다.

Naver Blog

[LeetCode] Subsets

문제 링크 : https://leetcode.com/problems/subsets/문제를 해결한 방법PowerSet을 구하는 방법은 많지만 저는 Bit로 구현하는 것이 편했습니다.방법은 간단합니다. 2개의 반복문을 사용합니다.하나는 [0, (1<<n)-1] 까지의 값을 순회하고, 다른 하나는 비트 하나씩 보면서 켜진 비트(1인 비트)를 확인합니다.이때 켜진 비트에 대해서만 nums[j]를 추가해주면 됩니다.

Naver Blog

[LeetCode] Top K Frequent Elements

문제 링크 : https://leetcode.com/problems/top-k-frequent-elements/문제를 해결한 방법Map에 숫자들을 세준 뒤, Value에 대해서 내림차순으로 정렬하여 K개를 가져오면 되는 문제였습니다.오름차순으로 Queue에 넣다가 K개가 넘어가면 쳐내는 식으로 했는데, 오히려 속도가 안나왔습니다.그래서 그냥 값을 모두 넣은 뒤, K개만 빼내오는 방식을 택했습니다.

Naver Blog

[Kafka] 설치부터 Producer Application까지

서론데브 원영님의 카프카 강의를 듣고 실습한 내용 및 자료를 그대로 옮겼습니다.EC2, Java, Kafka 설치AWS에서 EC2를 할당받습니다.(Elastic IP는 할당 받지 않아도 됩니다.)Kafka는 9092 포트를 기본값으로 사용하기에 inbound 규칙에 추가해주시면 됩니다.이제 Kafka를 설치하겠습니다.Kafka는 기본적으로 Java 기반으로 돌아가기에 Java를 설치해줘야 합니다.Kafka 2.5.0은 JDK 1.8 버전 이후에 정상 동작함을 보장하기에 Java를 설치해줍니다.이제 Kafka를 다운로드 받아줍니다. 카프카를 실행하기 위해서는 카프카 binary파일을 다운받아야합니다.다운로드 받은 tgz는 다음 명령어로 압축을 풀어줍니다.Kafka 2.5.0은 1G의 Heap Mem.......

Naver Blog

[LeetCode] Best time to buy and sell stock II

문제 링크 : https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/문제를 해결한 방법Greedy하게 접근했습니다.현재 가격보다 다음 날이 비싸면 바로 팔아버리면 됩니다.물론 문제에서는 그런 말이 없지만, a<b<c일 때, b-a만큼의 차액을 챙기고 b를 또 사서 c-b만큼의 차액을 챙기면 됩니다. 이런 관점이라면 c-a라는 큰 이득을 취할 수 있게 됩니다. 또 다른 예로 a>b<c일 때는 [7 2 10] 이라면 8이 정답이 됩니다. b를 계산할 때 a가 관여하지 않기 때문입니다.[1 2 3 4 5] 라는 예제에서도 1+1+1+1 과 5-1 = 4 라는 값이 동일함을 알 수 있습니다.

Naver Blog

[LeetCode] Valid Anagram

문제 링크 : https://leetcode.com/problems/valid-anagram/문제를 해결한 방법어구전철 또는 애너그램은 단어나 문장을 구성하고 있는 문자의 순서를 바꾸어 다른 단어나 문장을 만드는 놀이이다. 어구전철을 잘 아는 사람들끼리 암호문으로 어구전철을 사용할 수도 있지만 그렇지 못할 경우도 많다. 그 이유는 어구전철은 여러 자의적 해석이 가능하기 때문이다. 1. 두 문자열의 길이가 같은지 검사.2. 한 문자열의 알파벳 개수를 세주고 다른 문자열의 알파벳 개수를 하나씩 제거해주면 됩니다.이 과정에서 개수가 남아 있지 않은 알파벳이 나온다면 false를 해주면 됩니다.

Naver Blog

[LeetCode] Roman to Integer

문제 링크 : https://leetcode.com/problems/roman-to-integer/문제를 해결한 방법하드코딩으로 각 문자에 맞는 값을 넣어준 뒤[현재, 다음 문자]의 값을 비교해서 추가 조건에 부합하는지 확인하고 인덱스 작업을 해주면 됩니다.추가 조건의 특징은 다음 문자에 해당하는 값이 더 크다면 next-cur 관계입니다.문자열이 올바르게 들어오므로, 예외케이스는 생각하지 않아도 됩니다.

Naver Blog

[Java] 스트림(Stream) 소개

스트림이란?스트림은 자바 8 API에 새로 추가된 기능입니다. 스트림을 이용하면 선언형(즉, 데이터를 처리하는 임시 구현 코드 대신 질의로 표현)으로 컬렉션 데이터를 처리할 수 있습니다.쉽게 말하면 스트림은 데이터 컬렉션 반복을 멋지게 처리하는 기능입니다. 또한 스트림을 이용하면 멀티스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있습니다.만약 다음과 같은 코드가 있습니다.1. 메뉴 중에서 400 칼로리 이하의 음식을 찾습니다.2. 이 메뉴를 칼로리가 낮은 순으로 정렬합니다3. 이 메뉴들의 이름을 담은 List를 만듭니다.그럼 다음과 같이 구현할 것입니다.(자바 7이하)여기서 lowCalories는 컨테이너 역.......

Naver Blog

[Java] 스트림(Stream) 시작하기

스트림이란 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소로 정의할 수 있습니다. 데이터 처리 연산 : 스트림은 함수형 프로그래밍 언어에서 일반적으로 지원하는 연산과 데이터베이스에와 비슷한 연산을 지원합니다. 예를 들면 filter, map, reduce, find, match, sort 등으로 데이터를 조작할 수 있습니다. 스트림 연산은 순차적으로 또는 병렬로 실행할 수 있습니다. 소스 : 스트림은 컬렉션, 배열, I/O 자원 등의 데이터 제공 소스로부터 데이터를 소비합니다. 정렬된 컬렉션으로 스트림을 생성하면 정렬이 그대로 유지됩니다. 즉, 리스트로 스트림을 만들면 스트림의 요소는 리스트의 요소와 같은 순서를 유지합니다.......

Naver Blog

[Mac terminal] iTerm2 커스터마이징하기

iTerm theme은 굉장히 많습니다. 이곳에 가시면 많은 테마를 다운 받을 수 있습니다.그 중 저는 dracula 테마를 적용할 예정이라 이를 기준으로 작성하겠습니다.저는 git clone으로 dracula테마를 다운 받아보겠습니다. (위에 제가 드린 링크에서 원하는 테마를 다운로드 받으시면 됩니다.)Dracula.itermcolors를 더블클릭하면 자동으로 iterm theme에 import가 됩니다.그럼 이제 iterm으로 가서 테마를 적용해야 합니다.iTerm2 - [preferences...] 를 열어줍니다. (단축키는 command + , )그리고 [Profiles] - [Colors] 탭으로 이동해서 방금 다운받은 테마를 적용해줍니다.[Result]이제 브랜치를 보여주는 oh-my-zsh테마를 적용해보려 합.......

Naver Blog

[Kafka] 기본 개념 및 생태계

서론이 포스팅은 데브원영님의 Youtube 영상을 듣고 내용을 그대로 옮긴 것입니다.Before Kafka️ 엔드투엔드(end to end) 연결 방식의 아키텍쳐️ 데이터 연동의 복잡성 증가(하드웨어, 운영체제, 장애 등)️ 각기 다른 데이터 파이프라인 연결 구조️ 확장에 엄청난 노력 필요모든 시스템으로 데이터를 전송 실시간 처리도 가능한 것.데이터가 갑자기 많아지더라도 확장이 용이한 시스템이 필요함After Kafka️ Producer/ Consumer 분리️ 메시지 데이터를 여러 Consumer에게 허용️ 높은 처리량을 위한 메시지 최적화️ 스케일 아웃 가능️ 관련 생태계 제공Kafka broker️ 실행된 카프카 애플리케이션 서버 중 1대.......

Naver Blog

[Java] 동작을 파라미터화하기

사과를 담은 리스트가 있다고 가정해봅시다.사과는 다음과 같이 색과 무게를 기본적으로 갖고 있습니다.그리고 다음과 같이 사과 3개를 준비해볼게요.여기서 녹색 사과만 필터링 하라는 요구사항이 들어왔습니다.그러면 Java8을 활용하지 않고서는 다음과 같이 구현할 것입니다.Step 1. 필터링 함수 만들기여기에 추가적으로 빨간 사과도 따로 필터링하는 함수가 필요하다는 요구사항이 들어왔습니다.그러면 또 복사 붙여넣기 해서 다음과 같은 filterRedApples라는 새로운 메서드를 만들 것입니다.너무 반복적인 코드입니다.만약 검은색, 녹색, 노란색.. 색이 계속 추가된다면 어떻게 할 것인가요?이와 같은 코드를 계속 복사하며 구현할 수도 없.......

Naver Blog

[Java] 람다 표현식

람다란 무엇인가?람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이라고 할 수 있습니다.람다 표현식에는 이름은 없지만, 파라미터 리스트, 바디, 반환 형식, 발생할 수 있는 예외 리스트는 가질 수 있습니다.︎ 람다의 특징1. 익명: 보통의 메서드와 달리 이름이 없으므로 익명이라고 표현합니다.2. 함수: 람다는 메서드처럼 특정 클래스에 종속되지 않으므로 함수라고 부릅니다.하지만 메서드처럼 파라미터 리스트, 바디, 반환 형식, 가능한 예외 리스트를 포함합니다.3. 전달: 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있습니다.4. 간결성: 익명 클래스처럼 많은 자질구레, 긴 코드를.......

Naver Blog

[Java] 람다, 메서드 참조 활용하기

형식 추론기존에는 매개변수로 (Apple apple) -> { } 로 사용했었지만, 자바 컴파일러는 람다 표현식이 사용된 콘텍스트(대상 형식)를 이용해서 람다 표현식과 관련된 함수형 인터페이스를 추론합니다.즉 대상 형식을 이용해서 함수 디스크립터를 알 수 있으므로, 컴파일러는 람다의 시그니처도 추론할 수 있습니다. 결과적으로 컴파일러는 람다 표현식의 파라미터 형식에 접근할 수 있으므로 람다 문법에서 이를 생략할 수 있습니다.여러 파라미터를 사용한다면 가독성이 더 두드러집니다.위 코드는 형식을 추론하지 않지만, 아래 코드는 형식을 추론합니다. 덕분에 더 간결한 코드를 작성할 수 있습니다 상황에 따라 명시적으로 형식을 포.......

Naver Blog

[Java] 람다 표현식과 자주 사용되는 유용한 메서드

1, Comparator 조합정적 메서드 Comparator.comparing을 이용해서 비교에 사용할 키를 추출하는 Function 기반의 Comparator를 반환할 수 있습니다.︎ 역정렬만약 사과 무게를 내림차순으로 정렬하고 싶다면, 다른 Comparator 인스턴스를 만들어야 할까요?그럴 필요 없습니다. 인터페이스 자체에서 주어진 비교자의 순서를 뒤바꾸는 reverse라는 디폴트 메서드를 제공하기 때문입니다. 따라서 다음 코드처럼 처음 비교자 구현을 그대로 재사용해서 사과의 무게를 기준으로 역정렬 할 수 있습니다.하지만 무게가 같은 두 사과가 존재한다면 어떻게 해야할까요?정렬된 리스트에서 어떤 사과를 먼저 나열해야 할까요?이럴 땐 더 비교하는 Co.......

Naver Blog

[LeetCode] Convert Sorted Array to Binary Search Tree

문제 링크 : https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/문제를 해결한 방법Binary Search Tree를 만드는 것이므로, 힌트는 N/2로 쪼개는 것입니다.이분탐색할 때 답을 찾아갈 때 계속해서 반으로 나누어 접근하는 것을 이용한 것입니다.그래서 (배열, 시작 인덱스, 끝 인덱스)를 매개변수로 넘겨주며 재귀를 구현했습니다.구간 내 중간 인덱스의(m=(s+e)/2) 값이 해당 노드의 Value가 되고, left, right를 순차적으로 연결해주는 방식입니다. m을 기준으로 좌/우측의 구간을 구분할 수 있습니다.즉, 나눠진 구간은 (s, m-1) 과 (m+1, e)가 됩니다.(s, m-1)은 left에 대응되고, (m+1, e)는 right에.......

Naver Blog

[LeetCode] Move Zeroes

문제 링크 : https://leetcode.com/problems/move-zeroes/문제를 해결한 방법0을 모두 뒤로 미루면서 in-place-sorting하는 문제였습니다.앞에서부터 0인 곳(=i)과 0이 아닌 곳(=j)을 가리킬 포인터 2개를 준비합니다.0을 뒤로 미뤄야 하므로, i<j가 보장되어야 합니다.따라서 0인 곳을 첫 번째로 찾으면(=i)그 다음은 j(=i+1)부터, 0이 아닌 곳을 찾습니다.그리고 i와 j가 가리키는 값을 swap해줍니다. 이 과정을 반복합니다.만약 이 과정에서 i와 j가 배열의 범위를 넘어가면 break를 합니다. 더 이상 바꿀 수 있는게 없다는 뜻이기 때문입니다.그런데 이 문제는 값을 하나씩 당겨서 복사하여 풀 수도 있습니.......

Naver Blog

[LeetCode] Reverse Integer

문제 링크 : https://leetcode.com/problems/reverse-integer/문제를 해결한 방법숫자의 부호에 따라 문자열을 다르게 모아서(음수면 맨 앞의 -는 빼고) reverse를 한 뒤 답을 출력했습니다.그 다음 방법으로는, 나머지의 값을 먼저 더하면서, 다음 값을 더하기 직전에 이전 값에 *10을 해주는 방법입니다. 이렇게하면 말 그대로 reverse된 Integer가 만들어집니다.최종적으로 오버플로우가 났을 때는 res를 int형으로 형변환시 오버플로우/언더플로우가 났을 것이므로, 같은지 판단하고 리턴하는 방식을 결정해주면 됩니다.(오버/언더 플로우 => 0)

Naver Blog

[LeetCode] Majority Element

문제 링크 : https://leetcode.com/problems/majority-element/문제를 해결한 방법주어진 배열에서 가장 많이 등장하는 숫자를 리턴하면 되는 문제였습니다.여러가지 풀이가 존재할 것입니다. [HashMap으로 숫자를 세서 리턴하는 방법][정렬 후, arr[size/2]의 숫자를 리턴하는 방법]이 방법은 예를 들어 [2,1,2,1,2]일 때 정렬 후 [1,1,2,2,2]의 중간 인덱스 2를 리턴하는 방식입니다. 짝수로도 [1,2,2,2] 적용이 가능하죠. 이 문제는 반드시 Majority Element가 존재하기 때문에 가능한 방법입니다.

Naver Blog

[LeetCode] Sqrt(x)

문제 링크 : https://leetcode.com/problems/sqrtx/문제를 해결한 방법Math.sqrt(x)로 제출했다가 양심이 찔려서 다른 방법을 고안했습니다.값의 범위는 0~2^31-1까지이고, 소숫점은 제외한다고 했습니다.예를들어 sqrt(8) = 2로 출력해야 합니다. (2.xxxx...)그래서 Upperbound로 풀었습니다.long은 2^63-1이니, 2^31-1을 두번 곱해도 long 범위 내에 있으므로 오버플로우가 나지 않습니다.그래서 두 번 제곱했을 때 x보다 큰 첫 번째 값을 찾았습니다.그리고 최종적으로 답은 두 번 제곱했을 때 x보다 큰 첫 번째 값- 1 을 리턴하면 됩니다. (소숫점은 제거하므로)

Naver Blog

[LeetCode] Count Primes

문제 링크 : https://leetcode.com/problems/count-primes/문제를 해결한 방법평범한 소수(Prime Number) 구하기 문제입니다.에라토스테네스의 체각 수마다 sqrt(n)으로 소수 판별하기

Naver Blog

[Java] Integer Cache

https://blog.naver.com/adamdoha/222130436653위의 포스팅을 통해 우리는 AutoBoxing, Auto-UnBoxing에 대해 알게 되었습니다.한마디로 primitive type을 Wrapper Class로 자동으로 변환해주면 AutoBoxing 그 반대는 Auto-UnBoxing이죠.그런데 문제를 하나 내보겠습니다.[A] 다음 예제에서 a==b의 값은 무엇일까요?true입니다. false라고 대답하신 분들은 '아니 왜? Integer는 Object Class고, 객체마다 가진 메모리 주소가 다를텐데, 왜 true죠?' 라는 의문을 가지게 될 것입니다. 예제 하나만 더 보고 비교해드릴게요.[B] 다음 예제에서 a==b는 무엇일까요?false 입니다.에이 거짓말. 값 하.......

Naver Blog

[LeetCode] Valid Parentheses

문제 링크 : https://leetcode.com/problems/valid-parentheses/문제를 해결한 방법일반적인 괄호 검사 문제입니다.여는 괄호( '(', '[', '{' ) 일 때는, Stack에 넣어주고, 닫는 괄호일 때는 짝이 맞는지 검사합니다.짝이 맞지 않거나, Stack이 비어있다면 스택 검사 Runtime에 false를 리턴합니다.최종적으로 모든 괄호를 입력받고나서 스택이 비어있다면 제대로 짝을 만나서 pop이 되었다는 의미이기에 true, 아니라면 false를 리턴하면 됩니다.

Naver Blog

[LeetCode] Combine Two Tables

문제 링크 : https://leetcode.com/problems/combine-two-tables/문제를 해결한 방법사람이 주소를 가지고 있든 가지고 있지 않든 출력하면 되기 때문에Person Table과 Address를 left outer join해주면 됩니다. 그런데 Select하는 Column이 각 테이블에서 Unique하므로 p.~를 생략할 수도 있겠습니다.

Naver Blog

[LeetCode] Second Highest Salary

문제 링크 : https://leetcode.com/problems/second-highest-salary/문제를 해결한 방법두 번째로 높은 봉급을 출력하는 것이고, 없다면 null을 리턴하는 문제입니다.가장 높은 봉급을 SubQuery로 구하고, 이 값보다 작은 Salary 중에 최댓값을 가져오면 됩니다.그러한 값이 존재하지 않으면 max는 null을 리턴합니다.Where 절에 서브쿼리를 삽입해줄 수도 있겠지만, Select 절에 바로 SubQuery를 넣어줄 수도 있습니다. 봉급을 내림차순으로 DISTINCT 정렬을 하고, 페이징으로 2번째 값을 하나 가져오면 됩니다. 만약 그러한 값이 없다면 null을 출력하기 위해 IFNULL을 활용했습니다.

Naver Blog

[LeetCode] Employees Earning More Than Their Managers

문제 링크 : https://leetcode.com/problems/employees-earning-more-than-their-managers/문제를 해결한 방법상사가 없는 Employee는 비교하지 않아도 되므로, INNER JOIN으로 처리하면 되겠습니다.Join 처리를 하기 위해서는 Employee 2개의 테이블이 필요합니다.하나는 E1, 다른 하나는 E2라고 하겠습니다.E1.ManagerId와 E2.Id를 Join 처리하면, E1은 현재 Employee, E2는 상사를 의미하므로 E1.Salary가 E2.Salary보다 큰 Employee의 이름을 출력해주면 됩니다.

Naver Blog

[LeetCode] Factorial Trailing Zeroes

문제 링크 : https://leetcode.com/problems/factorial-trailing-zeroes/문제를 해결한 방법......000 의 0의 개수를 세주는 문제입니다.즉, a*10^k로 표현할 수 있는 k의 개수를 출력하는 문제였습니다.그래서 처음엔 단순히 2의 개수, 5의 개수를 세준 뒤 두 개수의 최솟값을 리턴하는 방식으로 구현했습니다.그런데 생각해보면 5의 개수는 항상 2의 개수보다 작습니다.그러면 5의 개수에 대해서만 고려해볼 수도 있겠습니다.5! 에는 5가 1개 들어가있고, 10!에는 (5*2) ... (5*1) ... 해서 5가 2개 들어가있죠.이런 방식으로 5의 개수만 세주면 되겠습니다.즉 5^k<=n 을 만족하는 k의 개수를 출력하면 됩니다.

Naver Blog

14725번 : 개미굴

문제 링크 : https://www.acmicpc.net/problem/14725문제를 해결한 방법트라이를 이용하면 됩니다. Character 하나씩 넣는 것이 아니라 String단위로 넣어주는 것 뿐입니다.그리고 구조도를 출력할 때, 같은 Depth면 사전순으로 앞선 것을 먼저 출력하라고 했습니다.그러므로 String 데이터를 담을 자료구조는 Key를 정렬된 순서(Default : 사전순)로 관리할 수 있는 TreeMap을 활용했습니다. 그리고 print()를 하는 과정이 DFS 방식처럼 Depth를 끝까지 찍고 나와야 하기에 getRoot로 현재 Trie의 root Node를 가져온 뒤 재귀로 구현했습니다.

Naver Blog

[LeetCode] Longest Common Prefix

문제 링크 : https://leetcode.com/problems/longest-common-prefix/문제를 해결한 방법짧은 문자열을 기준으로 잡고, prefix를 찾아나갔습니다.이렇게 하면 짧은 문자열보다 긴 뒤쪽은 확인하지 않아도 됩니다.그래서 기준으로 str[0]을 잡아둔 뒤, 값이 일치하지 않으면 일치하지 않는 부분 이전까지 String을 자르는 방식으로 구현했습니다. 물론 탐색은 초기에 str[0] (= 가장 짧은 문자열)을 넣어놨기 때문에, 이후의 문자열은 모두 StringBuilder의 size()만큼만 순회하면 됩니다.

Naver Blog

[LeetCode] Valid Palindrome

문제 링크 : https://leetcode.com/problems/valid-palindrome/문제를 해결한 방법영어, 숫자를 제외하고는 모두 무시합니다.영어 소문자 or 숫자는 그대로 append,영어 대문자는 소문자로 바꿔서 append를 해주면 됩니다.그리고 모아진 String과 Reverse String이 일치하는지 확인해주면 됩니다.

Naver Blog

[LeetCode] Implement strStr()

문제 링크 : https://leetcode.com/problems/implement-strstr/문제를 해결한 방법KMP를 이용했습니다. 패턴의 실패함수를 만들고, 문자열의 일치하는 부분을 찾는 방법으로 풀었습니다. 문자 하나씩 일치하는지 찾다가, 실패한다면 미리 구해놓은 실패함수로 다시 문자열을 비교하도록했습니다만, 생각보다 속도는 그렇게 빠르지 않았습니다. (7ms)haystack에서 needle의 length만큼 문자열을 잘라서, 단순히 문자열 비교 작업을 해줘도 됩니다.(0ms)

Naver Blog

[LeetCode] FizzBuzz

문제 링크 : https://leetcode.com/problems/fizz-buzz/문제를 해결한 방법단순 구현 문제입니다. 3의 배수라면 Fizz, 5의 배수라면 Buzz를 더해주면 됩니다.그 무엇도 아니라면 숫자 그대로를 Insert해주면 됩니다.

Naver Blog

오늘의 삽질

리스트는 참조를 해시코드로 하나 메모리 주소로 하나 궁금했었다.해시코드는 JVM에서 객체를 관리하기 편하게 하기 위한 값이라고 하는데메모리 주소 != 해시코드니까메모리 주소는 안바뀌겠지만 해시코드야 String이나 여러 클래스에서도 오버라이딩으로 재정의해서 자주 쓰니까ㅎㅎ하지만 객체.setHashCode(다른 해시코드) 같은 건 없으니까 어떻게 할까.. 고민했음.문제에서 클래스도 내가 만든게 아니라 문제 내부적으로 박혀있는 거라서 이걸 어떻게 오버라이딩을 할 수도 없고 그러다가 그냥 인텔리제이로 가져와서 직접 짜봤는데왜 node=node.next가 안되지부터 시작해서 더 나아가 null처리를 했는데도 출력이 잘 될까를 고.......

Naver Blog

[스크랩] Enum

https://woowabros.github.io/tools/2017/07/10/java-enum-uses.html

Naver Blog

[LeetCode] Merge Sorted Array

문제 링크 : https://leetcode.com/problems/merge-sorted-array/문제를 해결한 방법공간이 m+n만큼 주어지므로, 배열의 뒤쪽에서부터 큰 값을 차례로 넣으면, in-place sort가 가능합니다.아니면 그냥 한 곳에 몰아넣고 O(NlogN)으로 소팅해도 됩니다.

Naver Blog

[2020 마이블로그 리포트] 한 눈에 보는 올해 내 블로그 데이터!

Naver Blog

[LeetCode] Palindrome LinkedList

문제 링크 : https://leetcode.com/problems/palindrome-linked-list/문제를 해결한 방법ListNode에 2개의 node를 이용해서 이동합니다.하나는 fast, 하나는 slow입니다. 둘 다 시작점은 head입니다.그리고 fast는 2칸씩, slow는 한 칸씩 이동합니다.잘 생각해 봅시다. 예를 들어서 5개가 있다고 칩시다.f - - - -s- - - -- - f - -- s - - -- - - - f- - s - -자 여기서, f가 끝이 났습니다. 홀 수개 일 때는 가운데를 제외하고 가운데를 기준으로 비교해 주시면 됩니다. 그래서 f가 끝이 아니기에, s를 한번 더 이동시켜줍니다.- - - - f- - - s -cf) 짝수 개 일 때, 잠깐 살펴보고 가겠습니다.f - - -s - - -- - f -- s - -.......

Naver Blog

[LeetCode] Reverse LinkedList

문제 링크 : https://leetcode.com/problems/reverse-linked-list/문제를 해결한 방법단방향 리스트도 적절한 순서로 prev, next를 이용하여 node의 next를 바꿔준다면 reverse List로 만들 수 있습니다. (그림을 그려보시는 걸 추천합니다.)

Naver Blog

[스크랩] Kafka와 MongoDB, Kubernetes로 유연하고 확장 가능한 LINE 쇼핑 플랫폼 구축하기

https://engineering.linecorp.com/ko/blog/line-shopping-platform-kafka-mongodb-kubernetes/

Naver Blog

IntelliJ에서 GC가 일어나는 시점을 알고 싶다면

[Edit Configurations...] - [VM Options] 에 가셔서 다음 코드를 추가해줍시다.-verbose:gc : 가비지 컬렉션이 수행되는지를 출력합니다.-XX:+PrintCommandLineFlags : 어떤 가비지 컬렉터를 사용하는지 출력합니다.System.gc()는 Full GC가 일어납니다.모든 쓰레드가 정지하죠. Stop the world. -> 코드에 되도록 쓰면 안됩니다...저 같은 경우엔 GC가 언제 일어나는거지 도대체라는 궁금증으로 시작했습니다.ListNode를 만들어준 뒤에 b를 더이상 접근할 수 없는 형태로 만들어줬습니다.그런데도 GC가 일어나지 않더군요. minor gc라도 일어날 줄 알았는데..제가 실험한 코드는 다음과 같습니다.콘솔 출력값은 다음과 같습니다.Using.......

Naver Blog

[LeetCode] Delete Node in a LinkedList

문제 링크 : https://leetcode.com/problems/delete-node-in-a-linked-list/문제를 해결한 방법처음에는 단순하게 node=node.next라고 하려고 했습니다만.....이 단순한 생각이 되지 않아서 궁금해서 짜봤습니다.[1,2,3,4] 에서 2를 지우는 상황입니다.안되는 이유를 분석해봤습니다.우선 delete 메서드 내의 다음 코드가 의미가 없었습니다.기본적으로 값 복사가 일어나서, 참조형이라면 참조한 상태에서 primitive type을 변경한다거나, 내부적인 참조 값을 변경하는 것이라면 의미가 있겠지만, 포인터를 또 바꿔주는 상황인것이죠. 쉽게 생각하면 main문의 prob과 delete문의 node는 다르다는 것입니다.문제에서 주어진 것도 동.......

Naver Blog

[LeetCode] LinkedList Cycle

문제 링크 : https://leetcode.com/problems/linked-list-cycle/문제를 해결한 방법List의 val을 PASS값으로 주면서 존재하지 않는 ListNode일 때까지 이동합니다. 만약 방문한 노드의 val이 PASS라면 과거에 이미 지나온 자리를 다시 방문했다는 의미이므로, Cycle이 있게 됩니다.

Naver Blog

[LeetCode] Reverse Bits

문제 링크 : https://leetcode.com/problems/reverse-bits/문제를 해결한 방법비트값이 넘어오고, 이를 반대로 뒤집어서 int형으로 리턴해야 되기 때문에32개의 비트를 체크하면서 켜진 비트에 대해 거꾸로 비트 값을 더해줍니다.오버플로우나지 않나요? 1<<31은 int형에서 MSD를 담당하고 범위를 벗어나기에 오버플로우 아닌가요?제가 삽질을 좀 해보니 오버 플로우가 나도 괜찮습니다.여기서는 unsigned비트를 묻고 있기 때문입니다. 그래서 오버플로우가 나는 값을 출력해보면 당연히 음수가 나옵니다. 하지만 채점은 unsigned bit로 하기 때문에 상관없습니다.비트를 거꾸로 담아서 한방에 parseUnsignedInt를 2진수에 대해 변환해.......

Naver Blog

[LeetCode] Reverse String

문제 링크 : https://leetcode.com/problems/reverse-string/문제를 해결한 방법반으로 접어서 서로 값을 바꿔주면 됩니다.

Naver Blog

[LeetCode] Maximum Depth of Binary Tree

문제 링크 : https://leetcode.com/problems/maximum-depth-of-binary-tree/문제를 해결한 방법좌, 우측 노드를 탐방하며 depth를 레벨별로 늘려주면 됩니다. 그 중 최댓값을 출력하면 됩니다.

Naver Blog

[LeetCode] Min Stack

문제 링크 : https://leetcode.com/problems/min-stack/문제를 해결한 방법가장 직관적인 방법으로 Stack을 2개 써서 풀이했습니다.일반 Stack, 그리고 최솟값을 순서대로 담을 Stack입니다. minStack에는 top()보다 작은 값들이 들어올 때만 push해줍니다. 그리고 순서를 식별할 idx라는 변수를 추가했습니다.insert시 몇 번째 값이 들어오는지 idx와 함께 value를 넣어줍니다. 이 때, minStack에는 top보다 값이 작을 때만 넣어줍니다.pop을 할 때는 stack에서 빠져나가는 인덱스 번호와 minStack의 top에 있는 식별자가 일치한다면 minStack을 pop해주면 됩니다.top()은 stack의 top을 출력하면 되고, getMin()은 minStack의 top을.......

Naver Blog

[LeetCode] Count and Say

문제 링크 : https://leetcode.com/problems/count-and-say/문제를 해결한 방법하향식으로 접근했습니다. 종료조건인 n=1일 때부터, 다시 reformat하면서 답을 도출하는 방식입니다.reformat 메서드는 연속 구간을 확인하여 count와 char를 세주고 String에 이어 붙여서 반환하는 메서드입니다.

Naver Blog

[LeetCode] Plus One

문제 링크 : https://leetcode.com/problems/plus-one/문제를 해결한 방법마지막 digit에 +1을 하고, 10을 넘어가면 다음 로직으로 계속 이어갑니다. 10을 넘어가지 않는다면 그 자리에서 로직을 종료합니다. 만약 MSD가 10이라면 배열의 사이즈가 변하므로, 새로운 크기 n+1을 할당하고 MSD에 1을 넣고 리턴합니다. 나머지 digits으로부터 +1이 넘어온 것이기 때문에 기존 배열의 MSD가 10이 된 것이고, 그렇다면 나머지 Digits은 0임이 보장되기 때문입니다.

Naver Blog

[LeetCode] House Robber

문제 링크 : https://leetcode.com/problems/house-robber/문제를 해결한 방법DP를 이용하면 됩니다. 현재(=x)까지 최대로 훔칠 수 있는 돈은 다음 2개의 값 중 최대입니다.1) 직전 집까지 훔친 최대의 값2) 2개 전의 집까지 훔친 최대의 값 + 현재 집의 돈 Index에서 자유롭게 하기 위해 n+2로 선언하여 풀이했습니다. 위와 같은 로직으로 굳이 배열을 쓰지 않고, 2틀전, 하루전, 오늘이라는 변수 3개만으로도 풀 수 있습니다.최대로 훔칠 수 있는 돈은 마지막 날에서 하루전 또는 당일에 결정되므로 day를 리턴하면 됩니다.

Naver Blog

[Java] 함수형 인터페이스와 람다 표현식 소개

함수형 인터페이스(Functional Interface)- 추상 메서드를 딱 하나만 가지고 있는 인터페이스- Single Abstract Method 인터페이스- @FunctionalInterface 어노테이션을 가지고 있는 인터페이스추가적으로 다른 메서드를 추가해줄 수도 있습니다.사용은 어떻게 할까요? 다음과 같이 익명 내부 클래스를 재정의하고, 사용할 수 있습니다.람다 표현식인터페이스가 하나라면 다음과 같이 코드를 줄여서 사용할 수 있습니다.이것이 람다 표현식입니다. 함수형 인터페이스를 구현할 때 쓸 수 있는, 람다 형태의 표현 방법입니다. 코드를 많이 줄일 수가 있습니다.만약 저렇게 한 줄로 표현하는 것이 아닌, 여러 줄로 표현해야 하는 로직이라면?위와.......

Naver Blog

[Java] 자바에서 제공하는 함수형 인터페이스들

java.lang.function 패키지에 모든 것들이 있습니다.기본적으로 Function<T,R> 을 사용하는 예제를 확인해보겠습니다.implements를 이용해서 Java에서 제공하는 Function<T,R>를 활용했습니다.이 때, T는 input type을, R은 result type을 의미합니다.물론 람다식으로 바로 활용할 수도 있겠습니다.이러한 함수형 인터페이스를 조합하여 사용할 수도 있습니다. compose를 이용하면 가능합니다.상황을 가정해보겠습니다. 어떤 값에 2배를 하는 함수형 인터페이스 구현체가 있고, 어떤 값에 +10을 하는 함수형 인터페이스 구현체가 있습니다. 만약 어떤 값 x에 2배를 하고나서 +10을 하려면, 우리는 2배를 먼저 계산하고 그다음 +1.......

Naver Blog

StringUtils

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.htmlApache Commons에서 제공하는 StringUtils를 쓰는 이유1. null String에도 안전하게 처리 가능. 입력 String이 null이면, return null;2. 기능이 많다. 왠만한 문자열 작업을 다 할 수 있다.

Naver Blog

[Java] 람다 표현식과 Shadowing

예를 들어 다음과 같은 Supplier Interface가 있습니다.( ) 안에 들어가는 값은 함수 인자 값을 의미하고, { }; 로 표현되는 부분은 body를 의미합니다.만약 body가 1줄이라면, { } 를 생략할 수 있습니다. Supplier는 함수 인자값이 없고 return값만 존재하기에 위와 같이 작성합니다.만약 2개의 인자값이 들어온다면? 여기서 BinaryOperator는 BiFunction<Integer,Integer,Integer>의 축약형입니다.Shadowing에 대해 이야기를 해보겠습니다.우선 코드를 먼저 보시죠.자바8 이전에는 익명클래스, 로컬 클래스, 람다에서 사용하는 값은 항상 final을 명시해야만 했습니다. 그러나 자바8이 넘어오고 나서부터는 final 표현이 없어도 fin.......

1 2 3 4 5 6