전체 글 81

스프링 입문을 위한 자바 객체 지향의 원리와 이해 리뷰(1) (1~2장)

이 책을 선택한 이유 - F-lab이라는 기관을 통해서 멘토링을 받았었는데, 그 커리큘럼에 이 책이 있어서 멘토링 기간동안에 읽었었고, 나중에 복습 차원에서 한 번 다시 읽었다. 배운 점 - 기계어-어셈블리어-C언어-C++-Java로 발전해온 프로그래밍 언어의 역사에 대해서 알게 되었다. 특히, From 문제 To 해결의 관점에서 기존의 언어에 어떤 문제가 있었고, 다음의 언어가 그것을 어떻게 해결했는지에 초점을 맞춰서 이해할 수 있었다. - Java 언어의 가장 큰 특징은 Write Once Run Anywhere이다. 이것은 JVM에 의해서 달성된다. - 스프링 프레임워크는 객체지향(OOP) 프레임워크이다. 따라서 객체지향을 올바르고 제대로 이해해야 스프링 프레임워크를 제대로 이해할 수 있다. - J..

2022.04.26

Leetcode 21. Merge Two Sorted Lists

문제 이해 - 두 정렬된 링크드 리스트를 합쳐라 해결 전략 - 링크드 리스트의 기본 문제입니다. - ListNode dummy와 head를 선언한 후, head에 조건에 맞게 값들을 추가합니다. - 마지막으로 dummy.next를 반환합니다. 구현 class Solution { public ListNode mergeTwoLists(ListNode list1, ListNode list2) { ListNode dummy = new ListNode(0); ListNode head = dummy; while(list1 != null && list2 != null){ if(list1.val < list2.val){ head.next = new ListNode(list1.val); head = head.next; ..

PS 2022.04.26

Leetcode 234. Palindrome Linked List

문제 이해 - 링크드 리스트가 팰린드롬인지 아닌지 판별하라 해결 전략 - 이 문제를 푸는데는 여러 가지 전략이 있습니다. -> 그 중에서 '뒤집어서 비교하는' 전략을 선택했습니다. - reverseAndClone 메소드를 통해서 뒤집은 ListNode를 만들고, isEqual 메소드를 통해서 비교해줍니다. 구현 class Solution { public ListNode reverseAndClone(ListNode node){ ListNode head = null; while(node != null){ ListNode n = new ListNode(node.val); n.next = head; head = n; node = node.next; } return head; } public boolean isP..

PS 2022.04.26

Leetcode 203. Remove Linked List Elements

문제 이해 - 링크드 리스트에서 특정 값을 삭제하라 해결 전략 - dummy라는 임의의 노드를 생성합니다. - dummy.next에 head를 대입합니다. - curr에 dummy를 대입합니다. - curr를 순회하면서 val에 해당되는 값을 제거합니다. 구현 class Solution { public ListNode removeElements(ListNode head, int val) { ListNode dummy = new ListNode(0); dummy.next = head; ListNode curr = dummy; while(curr.next != null){ if(curr.next.val == val){ curr.next = curr.next.next; }else{ curr = curr.nex..

PS 2022.04.26

링크드 리스트(2)

1) 링크드 리스트 사이에 데이터 추가 - 링크드 리스트 사이에 데이터를 추가할 때는 부가적인 로직이 필요함 -> 기존 코드를 가져와서 붙여넣고, 중간에 데이터를 추가하는 메소드를 만들어봄 -> 여기서는 search 메소드와 addNodeInside 메소드를 추가함 public class SingleLinkedList{ public Node head = null; public class Node{ T data; Node next = null; public Node(T data){ this.data = data; } } public void addNode(T data){ if(head == null){ head = new Node(data); }else{ Node node = this.head; while..

자료구조 2022.04.26

SQL 레벨업 6장 결합

18강 기능적 관점으로 구분하는 결합의 종류 - SQL은 기능적인 관점으로 크로스 결합, 내부 결합, 외부 결합으로 분류할 수 있습니다. -> 이 세 가지는 생성되는 결과의 형태에 따라 이름 지어졌으며, 각각의 이름이 서로 관련 있습니다. -> 이 세 가지는 서로 배타적인 분류입니다. 1. 크로스 결합 - 모든 결합의 모체 - 크로스 결합은 실무에서 사용할 기회가 거의 없습니다. -> 단, 크로스 결합을 살펴보는 이유는 크로스 결합이 결합이라는 연산을 이해하는 지름길이기 때문입니다. - 크로스 결합을 위한 샘플 테이블 정의 CREATE TABLE Employees (emp_id CHAR(8), emp_name VARCHAR(32), dept_id CHAR(2), CONSTRAINT pk_emp PRIMA..

DB 2022.04.25

SQL 레벨업 5장 반복문 (2)

16강 SQL에서는 반복을 어떻게 표현할까? 1. 포인트는 CASE 식과 윈도우 함수 - SQL에서 반복을 대신하는 수단은 바로 CASE 식과 윈도우 함수임 -> 정확하게 말하면 CASE 식은 절차 지향형 언어에서 말하는 IF-THEN-ELSE 구문에 대응하는 기능임 -> SQL에서 CASE 식과 윈도우 함수를 함께 사용하면 다음과 같음 INSERT INTO Sales2, SELECT company, year, sale, CASE SIGN(sale-MAX(sale) OVER (PARTITION BY company) ORDER BY year ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)) WHEN 0 THEN '=' WHEN 1 THEN '+' WHEN -1 THEN '-' E..

DB 2022.04.25

Leetcode 876. Middle of the Linked List

문제 이해 - 링크드 리스트의 중간부부터 반환하라. 해결 전략 - 두 개의 링크드 리스트(slow, fast)를 선언하고, 각각에 head를 대입한다. - while문을 통해 slow=slow.next, fast=fast.next.next로 이동하면서, fast와 fast.next중 하나가 null일때까지 이동한다. - slow를 리턴한다. 구현 class Solution { public ListNode middleNode(ListNode head) { ListNode slow = head; ListNode fast = head; while(fast != null && fast.next != null){ slow = slow.next; fast = fast.next.next; } return slow; ..

PS 2022.04.25

Leetcode 2207. Maximize Number of Subsequences in a String

문제 이해 - 문자열에 하나의 문자를 추가함으로 인해서, subsequence를 최대화하라. 해결 전략 - 문자열을 순회하면서 첫번째 문자를 만날때마다, cnt1++을 한다. - 문자열을 순회하면서 두번째 문자를 만날때마다, res에 cnt1을 더하고, cnt2++을 한다. - 최종적으로 res에 cnt1과 cnt2중에 큰 값을 더해준다. 구현 class Solution { public long maximumSubsequenceCount(String s, String pattern) { long res = 0, cnt1 = 0, cnt2 = 0; for (int i = 0; i < s.length(); ++i) { if (s.charAt(i) == pattern.charAt(1)) { res += cnt..

PS 2022.04.25

Leetcode 2233. Maximum Product After K Increments

문제 이해 - 배열에 있는 값들을 +1씩 K번 증가할 때, 최종적으로 배열에 있는 값들의 곱을 최대화할 수 있도록 하라 해결 전략 - 우선순위 큐를 사용해서, 배열의 값들을 저장한다. - 우선순위 큐를 통해, 가장 작은 값을 추출하고, 그 값에 1을 더한 후, 다시 우선순위 큐에 넣는다. - 우선순위 큐에서 값을 하나씩 빼면서 곱해준다. 구현 class Solution { public int maximumProduct(int[] nums, int k) { long answer = 1; PriorityQueue pq = new PriorityQueue(); for(int i=0; i

PS 2022.04.24