Number of Good Pairs - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 배열이 주어졌을때, 같은 숫자인 짝이 몇개 존재하는지 세는 문제입니다. 각 숫자가 배열에 몇개 존재하는지 세고, 자기 자신을 제외한 값을 모두 더해줍니다. 이때 무조건 중복해서 값을 세기에, 구한값을 2로 나눠주면 됩니다. class Solution { fun numIdenticalPairs(nums: IntArray): Int { var answer : Int = 0 for..
Palindrome Number - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 입력된 숫자가 펠린드롬 숫자인지 확인하는 문제입니다. 우선 음의 정수는 무조건 펠린드롬 수가 될 수 없고, 이를 판별하기 좋은 방법은 문자열로 변환한 후, 대응되는지 확인해보는 방법이 있습니다. 정수를 문자열로 변환한뒤, i와 len-i가 대응되는지 확인하여 모두 대칭되면 true를, 아니라면 false를 반환하면 됩니다. class Solution { fun isPalindrom..
Java의 Garbage Collector는 다 쓴 객체를 알아서 회수해줍니다. 그래서 자칫 메모리 관리를 더 이상 신경쓰지 않아도 된다고 오해할 수 있는데, 이는 사실이 아닙니다. 스택 자료구조를 간단히 구현한 아래의 코드를 보겠습니다. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; }..
이번 주제는 운영체제의 페이징입니다. 본격적으로 페이징에 대해 공부하기 전, 페이징이 왜 필요한지?에 대해서 먼저 이해를 해보도록 하겠습니다. 모든 프로그램은 프로세스가 되기 위해 메인 메모리를 할당 받아야 합니다. 그리고 페이징이라는 개념이 등장하기 전, 하나의 프로세스는 무조건 연속적인 메모리 영역을 할당 받았습니다. 예를들어서 아래와 같이 말이죠. 현재 메모리에 OS, Process 5, Process 8, Process 2가 올려져 있다고 보시면 됩니다. 아직까지는 큰 문제가 보이질 않습니다. 이 상황에서 Process 5가 종료되어 할당받은 메모리를 해제하게 되었습니다. 메모리 영역에 구멍이 생긴 것을 볼 수 있습니다. 이렇게 연속적인 프로세스 할당으로 인해 메모리에 생긴 구멍을 'Hole'라고..
하나의 수열이 주어집니다. 이 수열은 순환이 된다고 합니다. 이 수열에서 연속적인 부분수열을 뽑았을때, 부분 수열의 합으로 나올 수 있는 모든 숫자를 구하라고 합니다. 결국 '연속된 부분 수열의 총합'을 구하라는 말인데 여기서 바로 누적합 알고리즘을 떠올려볼 수 있죠. 누적합 배열을 psum이라고 정의했을때 [i~j]에 존재하는 수열의 총합은 psum[j] - psum[i-1]로 O(1)에 계산할 수 있습니다. 그리고 이를 이용하면 O(N^2)에 모든 부분 수열을 계산할 수 있습니다. 이제 나올 수 있는 값들의 총 개수를 구해야 하는데, 간단하게 set으로 관리하면 총 시간복잡도는 O(N^2logN)이 소요됩니다. 하지만 아직 고려하지 않은 것이 있죠. 바로 수열이 순환할 수 있다는 조건입니다. 이 조건..
문제의 핵심은 상자의 묶음을 찾는 것이고, 이중 가장 큰 2개의 상자 묶음을 찾아 최댓값을 구해야 합니다. 상자의 개수가 100개이기 때문에 만들어질 수 있는 모든 상자 묶음을 찾아도 효율성 측면에서 문제가 되질 않습니다. 따라서 모든 상자의 묶음을 찾아주면 됩니다. 저는 상자 A -> 상자 B로 계속 이동하는 재귀 문을 작성해서 상자의 묶음을 찾았습니다. 한 가지 주의사항이 있는데요, 바로 전체 상자 묶음이 1개인 경우 점수가 0이라는 점입니다. 예를 들어 1, 2, 3, 4, 5, 6, 7과 같이 상자가 배치된 경우에 말이죠 이 부분은 아주 간단하게 처리할 수 있습니다. 모든 상자 묶음의 개수를 구할때마다 벡터에 넣고, 마지막으로 이 벡터에 0을 넣어줍니다. 벡터를 내림차순으로 정렬합니다. 그리고 우..
똑같은 기능의 객체를 매번 생성하기보다는 하나의 객체를 재사용하면 분명히 성능적으로 이점을 얻을 수 있습니다. 예를들면 이전에 봤던 Boolean.valueOf를 생각해보면 됩니다. 좀더 와닿는 설명을 위해 아래와 같은 코드를 작성했습니다. 이 코드는 매우 극단적인 예시를 보여줍니다. public static void main(String[] args) { long bef; long aft; bef = System.currentTimeMillis(); for(int i=0; i 기본 타입을 언박싱이라고 부릅니다. JDK 1.5부터 이 연산을 자동으로 처리해주는데요, 이 두가지 박싱은 컴파일러가 처리해주며 내부적으로 구현 되어있습니다. 음.. 박싱과 언방식이 뭔지는 어렵지가 않은데, 굳이? 이 과정이 있어..
이제부터 스위치가 존재하는 근거리 네트워크 통신은 어떻게 이뤄지는지 알아볼 것이고, ARP 프로토콜이 왜 필요하고 어떻게 동작하는지 알아보겠습니다. 시작하기 앞서 스위치가 왜 필요한지?에 대해서 먼저 생각을 해보겠습니다. 컴퓨터가 통신할 수 있다는 것은 컴퓨터가 연결되어 있다는 의미입니다. 여러대의 컴퓨터를 연결하는 가장 단순한 방법은 무엇일까요? 바로 전부 연결해주면 됩니다. 하지만, 이 접근법은 너무 비용이 크다는 단점이 명확합니다. 연결한 선을 간단한 전선이라고 생각해봅시다. 그러면 100대의 컴퓨터가 서로 통신하고 싶은 상황에서 전선은 N * (N-1) / 2개가 필요합니다. 문제를 개선하기위해 위와같은 접근을 떠올렸습니다. 바로 어떤 허브를 두고, 모든 통신은 허브를 거쳐가도록 만드는 것이에요...
- Total
- Today
- Yesterday
- 공지
- network
- Operating System
- ARP
- cs
- spring
- go
- soft delete
- effective
- Effective Java
- OS
- java
- paging
- fiber
- GORM
- Database
- mmu
- algorithm
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |