240414

Regular Kim·2024년 4월 14일
0

회고

목록 보기
37/67
post-custom-banner

240414 회고 💬

갑자기 더워진 날씨에 선풍기를 틀고 말았다. 💦 아침에는 좀 쌀쌀하고 낮에는 엄청 덥고, 어느 장단에 맞춰야 할지 아직 고민되는 날씨가 찾아왔다. 덥다 보니 집에 돌아오면 땀 범벅이 돼버린다. 이러면 운동하기가 너무 괴롭다. 4월에 30도라니! 너무한 거 아니냐고~~ 😡

Keep 👍

  • 알고리즘 문제 풀이를 이번 주에도 7일 연속으로 해냈다. 이번 주 주제는 투 포인터와 이분탐색이다. 개인적으로 이 주제가 가장 자신이 없다. 한 주 더 같은 주제를 가지고 문제 풀이를 할 예정이다.
    숫자 카드 2 이전에 푼 문제(이전에 풀었던 문제는 7일 문제 풀이 카운트에 포함하지 않는다)지만 lower bound, upper bound 개념 학습을 목적으로 한 번 더 풀어봤다. 이분 탐색이 개념은 쉽지만, 응용 문제가 나온다면 해결하기가 엄청 어려워서 이런저런 연습 겸 이전 문제를 다시 풀었다.
    좌표 압축 lowerBound 코드 연습에 좋은 문제다. 중복되는 값을 제거한 후 오름차순으로 정렬한다. 이 과정을 압축이라고 부른다. 이후 원래 배열을 순회하며 해당 원소를 압축된 배열에서 찾는다. 압축된 배열에서 위치하는 인덱스의 값이 해당 원소보다 작은 원소가 몇개 있는지 알려주는 값이다.
    예를 들어 [2, 4, -10, 4, -9] 배열이 있다고 하자. 이 배열을 압축하면 [-10, -9, 2, 4] 배열이 된다. 이제 원 배열을 순회하며 압축된 배열에서 인덱스 값을 찾는다. 원배열 가장 처음의 원소는 2 이므로 압축된 배열에서 이 원소의 인덱스를 찾으면 2이다. 따라서 원 배열에서 2보다 작은 값을 가지는 원소의 개수는 2개임을 알 수 있다.
    The Pleasant Walk 투 포인터로 풀 수 있는 대표적인 문제다. (영어 문제여서 푼 사람이 2자리 수인건 안 비밀) 문제 이해만 하면 쉽게 풀 수 있다.
  • 평일에만 집에서 운동을 했다. 요즘들어 운동 시간이 많이 줄어들었다. 바쁘기도 하고 공부할게 많아서(핑계임) 그렇다라고 생각하기로 했다. 주말에 운동 못한게 조금 아쉽다.
  • 아침 스터디 시간을 1번 가졌다. 요즘 재택근무를 하면서 아침 스터디 시간을 갖는 시간이 2번 줄어들기도 했다. 그리고 출근하는 날에도 피곤해서 늦잠을 자다보니 아침 공부 시간을 꾸준히 갖지 못하고 있다.
  • 출퇴근 시간에 자바 복습을 하고 있다. 이번 주에는 열거형을 공부했다. 아직까지 프로젝트를 하면서 열거형을 쓸 일이 없었다. 마침 이번 업무에 사용할 수 있을 듯한 로직이 몇가지 보인다. 공부한 내용이 아깝지 않게 적용해볼 계획이다.
  • 서블릿 공부를 계속하고 있다. 이번 주에는 ServletConfig 를 주제로 공부했다.

Extras 😀

숫자 카드 2

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {

            Solution s = new Solution();
            System.out.println(s.solution(getInput(br), getInput(br)));

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private static int[] getInput(BufferedReader br) throws IOException {
        int len = Integer.parseInt(br.readLine());
        int[] arr = new int[len];
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < len; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        return arr;
    }
}

class Solution {

    public String solution(int[] arr, int[] targets) {
        Arrays.sort(arr);

        StringBuilder answer = new StringBuilder();

        for (int target : targets) {
            int start = getLowerBound(arr, target);
            int end = getUpperBound(arr, target);

            answer.append(end - start).append(" ");
        }
        return answer.toString();
    }

    private int getLowerBound(int[] arr, int target) {
        int l = 0;
		int r = arr.length;
		int mid = 0;
		while (l < r) {
			mid = (l + r) / 2;

			if (arr[mid] < target)
				l = mid + 1;
			else
				r = mid;
		}
		return r;
    }

    private int getUpperBound(int[] arr, int target) {
        int l = 0;
		int r = arr.length;
		int mid = 0;

		while (l < r) {
			mid = (l + r) / 2;
			if (arr[mid] <= target) {
				l = mid + 1;
			} else {
				r = mid;
			}
		}
		return r;
    }
}

좌표 압축

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.TreeSet;

public class Main {

    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {

            Solution s = new Solution();
            System.out.println(s.solve(getInput(br)));

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private static int[] getInput(BufferedReader br) throws IOException {
        int len = Integer.parseInt(br.readLine());
        int[] arr = new int[len];
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        for (int i = 0; i < arr.length; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        return arr;
    }
}

class Solution {

    public String solve(int[] arr) {
        StringBuilder answer = new StringBuilder();

        int[] compressedArray = compress(arr);

        for (int i : arr) {
            int index = getLowerBound(compressedArray, i);
            answer.append(index).append(" ");
        }
        return answer.toString();
    }

    private int getLowerBound(int[] arr, int target) {
        int lp = 0;
        int rp = arr.length;

        while(lp < rp) {
            int mid = (lp + rp) / 2;

            if (arr[mid] < target) {
                lp = mid + 1;
            } else {
                rp = mid;
            }
        }
        return rp;
    }

    private int[] compress(int[] arr) {
        TreeSet<Integer> set = new TreeSet<>();
        for (int i : arr) {
            set.add(i);
        }
        int[] result = new int[set.size()];
        int idx = 0;
        for (Integer i : set) {
            result[idx++] = i;
        }
        return result;
    }
}

The Pleasant Walk


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {

            Solution s = new Solution();
            System.out.println(s.solution(getInput(br)));

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private static int[] getInput(BufferedReader br) throws IOException {
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int len = Integer.parseInt(st.nextToken());
        int colors = Integer.parseInt(st.nextToken());
        int[] arr = new int[len];
        st = new StringTokenizer(br.readLine(), " ");
        for (int i = 0; i < arr.length; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        return arr;
    }
}

class Solution {

    public int solution(int[] arr) {
        int maxLen = 0;
        int curColor = -1;
        int curLen = 1;

        for (int i = 0; i < arr.length; i++) {
            int nextColor = arr[i];

            if (curColor == nextColor) {
                curLen = 1;
            }
            maxLen = Math.max(maxLen, curLen++);
            curColor = nextColor;
        }
        return maxLen;
    }
}
profile
What doesn't kill you, makes you stronger
post-custom-banner

0개의 댓글