분류 전체보기 400

[leetcode - 209. Minimum Size Subarray Sum] java

문제 설명1. 배열이 주어진다.2.target이 주어진다.3. 배열을 순서대로 더해서 target 보다 크거나 같은 숫자가 되면 그 숫자를 구하는 가장 적은 배열 요소의 갯수를 구하면 된다. 풀이 과정 1. 투포인터 문제이다.2. 투포인터 시작점을 저장시켜 두고 요소 크기, 더한 값을 구한다.3. for문 돌리면서 매번 요소를 더해준다.4. 그리고 만들어진 값이 target보다 커지면 슬라이딩 앞에서부터 줄여가면서 크기를 비교하면 된다.코드class Solution { public int minSubArrayLen(int target, int[] nums) { int start = 0; // 슬라이딩 윈도우 시작점 int sum = 0; // 총합 int cnt..

알고리즘 공부 2025.02.07

[leetcode - 15. 3Sum] java

문제 설명1. 배열이 주어진다.2.배열에서 3개 숫자를 더해서 0이 되는 것들을 찾는다.3. 근데 그 대상 숫자들이 중복되면 안된다. 풀이 과정 1. 투포인터 문제인데, 해결 방법이 생각이 잘 안나서 많이 헤맸다.2. 앞에서부터 뒤로 가면서 기준 인덱스의 뒤에를 투포인터로 찾으면 된다.3. 그리고 중복되는 값들을 제거해주면서 구하면 된다.코드class Solution { public List> threeSum(int[] nums) { List> ans = new ArrayList(); // 투포인터 실행을 위한 list 정렬 Arrays.sort(nums); // 3개 찾아야 하니까 2개 남겨놓음 for(int i=0; i

알고리즘 공부 2025.02.07

[leetcode - 11. Container With Most Water] java

문제 설명1. 배열이 주어진다.2. 안에 물이 담긴다. (오른쪽 왼쪽 중 더 높은 것의 높이 * 둘의 거리만큼)3. 가장 많은 물을 구하면 된다.  풀이 과정 1. 간단한 투포인터 문제이다.2. 처음, 마지막 위치를 구한다.3. 부피를 구한 뒤에 최대 부피를 갱신한다.4. 둘 중 더 낮은 위치를 상대쪽으로 이동시키면 된다.+) 나는 생각을 못했던 건데, 4번 과정에서 길이가 계속 더 작다면 더 긴 위치가 될 때까지 계속 갱신해 줘도 된다.(이러면 앞의 과정을 스킵할 수 있어서 시간 이득)코드class Solution { public int maxArea(int[] height) { int maxWater = 0; int start = 0; int end = he..

알고리즘 공부 2025.02.05

[leetcode - 167. Two Sum II - Input Array Is Sorted] java

문제 설명1. 배열이랑 만들어야 하는 숫자가 주어진다.2. 배열은 순서대로 (작은거부터 큰거까지) 주어진다. 풀이 과정 1. 간단한 투포인터 문제이다.2. 맨 처음 숫자 + 맨 뒤 숫자3. (2)에서 만들어진 숫자가 타겟보다 크면 맨 뒤보다 한칸 앞, 작으면 맨 앞에서 한칸 앞으로 움직이면서 풀면 된다.4. 같은거면 return코드class Solution { public int[] twoSum(int[] numbers, int target) { int start = 0; int end = numbers.length - 1; while(true) { int now = numbers[start] + numbers[end]; ..

알고리즘 공부 2025.02.05

[leetcode - 6. Zigzag Conversion] java

문제 설명1. 문자열이 주어진다.2. 지그재그 이동할 숫자가 주어진다.3. 지그재그 하고 문자열 변경하면 된다.풀이 과정 - 지그재그보다는 위아래? 라고 생각하면 쉽다.P A H NA P L S I I GY I R1. 보면 만들어지는 순서가 1 2 3 2 1 2 3 2 1 2 3 ... 이렇게 된다.2. 그러면 Queue 배열을 만들어서 q1(PAHN) q2(APLSIIG) q3(YIR) 이렇게 두고 합쳐주면 바로 풀린다.3. 위아래 슉 슈슉 슉코드class Solution { public String convert(String s, int numRows) { // 위의 경우에는 지그재그가 애초에 안나온다. if(numRows == 1 || numRows..

알고리즘 공부 2025.01.31

[백준 22866번] 탑 보기 - java

문제 설명1. 건물의 개수 N이 주어진다.2. 건물의 높이가 N개 주어진다.3. 각 건물은 자신의 높이보다 높은 건물들을 볼 수 있다.4. 보고있는 방향으로는 앞에 있는 건물보다 높은 건물을만 볼 수 있다.5. 오른쪽, 왼쪽 기준 볼 수 있는 모든 건물의 숫자랑 가장 가까운 건물 위치를 한줄씩 출력하면 된다.풀이 과정1. 구현2. Stack을 사용해 주면 된다. 투포인터 비슷한가 싶었는데 전혀 아니었다.3. 왼->오, 오->왼 하면서 Stack에 점점 높이가 낮아지면서 건물들을 저장한다.4. 그러면서 현재 건물보다 높은것들만 있으면 그게 size, 그 중 가장 가까운 위치를 확인해주면 된다.5. 모노토닉 스택에 대해서 알고 있으면 쉬울 수 있지만.. 나는 알고 있는데도 떠올리는데 시간이 오래 걸렸다.코드..

알고리즘 공부 2025.01.31

[leetcode - 68. Text Justification] java

문제 설명1. 단어들의 배열이랑, 최대 너비 maxWidth가 주어진다.2. maxWidth만큼 단어들을 배치하고 각 단어 사이에는 space가 최소 하나는 있어야 한다.3. 마지막 문장을 제외하고 나머지 문장들은 space가 균등하게 배치되어 문장을 완성해야 하고 그게 안되면 왼쪽의 space가 더 많으면 된다.4. 마지막 문장은 단어 사이에 space는 하나만 있고 마지막 단어로부터 끝까지 싹다 space로 채운다.풀이 과정 - 솔직히 얘는 왜 하드인지 잘 모르겠다. 약간 모르면 맞아야하는 문제는 아닌 것 같고 좀 귀찮지만 열심히 생각하면 되는 느낌. 다만 한번 꼬이면 답 없을 것 같기는 하다.1. 빡구현 + 약간의 그리디?2. 결국 지금까지의 단어를 가지고 문장을 만들어낼 수 있는지를 파악하면 되는..

알고리즘 공부 2025.01.31

[leetcode - 42. Trapping Rain Water] java

문제 설명1. 블록이랑 높이가 주어진다.2. 블록 사이에 물이 쌓인다.3. 물의 총합을 구하면 된다.풀이 과정 - 처음에는 백준에 있던 비슷한 문제를 풀었던 경험이 있었어서 그대로 해야지 싶었다.https://www.acmicpc.net/problem/14719- 근데 그대로 풀었더니 시간초과가 났다. 그래서 한참 헤맸는데... 투 포인터로 풀면 간단?히?(이미 1시간 넘게 씀) 풀리는 문제였다...- 뭔가 나는 문제를 보자마자 풀이를 시작하는 버릇을 고쳐야 할 것 같다. 정확히 풀이를 할 수 있다는 확신이 들어야 할듯1. 투 포인터 + 구현2. 왼쪽과 오른쪽 끝에서부터 확인해가면서3. 오른쪽이 더 클 때, 왼쪽의 최대 높이보다 현 왼쪽이 더 큰 경우 최대높이를 갱신해주고, 그렇지 않다면 여기는 물이 쌓..

알고리즘 공부 2025.01.30

[leetcode - 238. Product of Array Except Self] java

문제 설명1. 배열이 주어진다.2. 지금 위치 빼고 나머지의 곱셈을 구하면 된다.3. Int 크기 내에서 정답이 나온다.풀이 과정 1. 깡구현2. 전체 곱을 구해두고 거기서 지금 값을 나누면 될거라 생각했다(근데 전체 곱은 int 범위를 벗어날 수 있으므로 long)3. 0이 2개 이상인 경우 모든 경우 다 0이다.4. 0이 1개인 경우 그 0이 있는 위치는 나머지 전체 곱이고, 나머지 모든 곳에서는 0이 나온다.코드class Solution { public int[] productExceptSelf(int[] nums) { int[] answer = new int[nums.length]; long allMul = 1; // 전체를 곱할 때 사용하는 allMul ..

알고리즘 공부 2025.01.29

[leetcode - 380. Insert Delete GetRandom O(1)] java

문제 설명1. 랜덤셋? 을 만들어라2. insert -> 값이 있으면 false, 없으면 값을 저장하고 true3. remove -> 값이 없으면 false, 있으면 값을 제거하고 true4. getRandom -> 지금까지 저장된 값들 중 랜덤으로 하나 가져와서 보여줌풀이 과정 1. 알고..리즘? 맞나 이거?2. 그냥 위의 내용을 구현하면 되는데, O(1) 을 위해서는 아무래도 자료구조에 대해서 알고 있어야 할 것 같다.3. 사실 나는 그냥 간단하게 했는데 더 성능에 좋은 방법이 있을 듯 싶다.4. ArrayList     - getRandom을 위해 사용할 수밖에 없었다.    - contains의 경우 O(n) 이라서 사용하지 않음    - remove는 어쩔 수 없이 사용했다. 다른 방식을 쓰려고..

알고리즘 공부 2025.01.29