2025-10-06 학습 기록

랏 뜨·2025년 10월 6일

🦾 오늘의 컨디션 및 특이사항(개인 일정 등)


  • 수면 시간
    • 5시간
  • 학습 시간
    • 11 : 00 ~ 16 : 30
  • 특이사항

📑 세부 학습 내용


📅 스케쥴

  • 3시간 30분 강의 + 궁금한 개념 조사 및 학습 + 2시간 코딩테스트 및 풀이 리뷰
  • 5시간 30분

📺 인프런 강의

📺 김영한의 실전 데이터베이스 - 기본편 (김영한)

  • 데이터를 처리하기 위한 SQL 문법을 확실하게 마스터하는 것과 더불어, 특히 조인 및 인덱스의 정의 및 올바른 사용 방법을 확실하게 이해하여 쿼리 성능을 최적화 - 극대화할 수 있는 개발자로 성장하고, 추가로 데이터베이스에서의 트랜잭션 관련도 더 확실하게 이해하여 DB 쿼리 성능을 최대한 최적화 할 수 있는 성능에 민감한 개발자를 목표로 학습 시작
  • 72. 외래 키 제약 조건 ~ 84. 다음으로 까지 학습 완료 (완강)
  • 과정의 모든 내용 이해 및 실습 완료
  • 강의 내 퀴즈 모두 풀이 및 오답노트
  • 강의에 없는 내용 중 이해가 안 되거나 궁금한 부분은 따로 추가 학습 진행
  • 이전 내용 중 헷갈리는 부분 복습하면서 진행

✏️ 코딩 테스트

⭕ 풀이 코드

class Solution {

    List<String> operList;
    boolean[] visited;
    int n;
    long max = Long.MIN_VALUE;

    public long solution(String expression) {
        Set<String> operSet = new HashSet<>();
        for (String str : expression.split("")) {
            if (str.equals("+") || str.equals("-") || str.equals("*")) {
                operSet.add(str);
            }
        }

        operList = new ArrayList<>(operSet);
        n = operList.size();
        visited = new boolean[n];

        permutation(new ArrayList<>(), expression);

        return max;
    }

    private void permutation(List<String> list, String expression) {
        if (list.size() == n) {
            max = Math.max(Math.abs(logic(list, expression)), max);
            return;
        }

        for (int i = 0; i < n; i++) {
            if (!visited[i]) {
                visited[i] = true;
                list.add(operList.get(i));
                permutation(list, expression);
                list.remove(list.size() - 1);
                visited[i] = false;
            }
        }
    }

    private long logic(List<String> list, String expression) {
        List<Long> nums = new ArrayList<>();
        List<String> ops = new ArrayList<>();

        StringBuilder sb = new StringBuilder();
        for (char c : expression.toCharArray()) {
            if (c == '+' || c == '-' || c == '*') {
                nums.add(Long.parseLong(sb.toString()));
                sb.setLength(0);
                ops.add(String.valueOf(c));
            } else {
                sb.append(c);
            }
        }
        nums.add(Long.parseLong(sb.toString()));

        for (String op : list) {
            for (int i = 0; i < ops.size();) {
                if (ops.get(i).equals(op)) {
                    long result = calculate(nums.get(i), nums.get(i + 1), op);
                    nums.remove(i + 1);
                    nums.set(i, result);
                    ops.remove(i);
                } else {
                    i++;
                }
            }
        }

        return nums.get(0);
    }

    private long calculate(long val1, long val2, String operation) {
        switch (operation) {
            case "+":
                return val1 + val2;
            case "-":
                return val1 - val2;
            default:
                return val1 * val2;
        }
    }
}
  • 순열 및 브루트포스를 이용해 해결
    • 순열을 이용하여 각 연산자 우선순위 리스트 획득
    • 획득한 리스트를 이용하여 내부적으로 연산 우선순위를 고려한 연산 실행
      • 숫자 리스트와 연산 리스트를 분리
      • 숫자 리스트의 크기는 항상 연산 리스트 크기 + 1임을 이용
    • 순열마다 얻은 값들 중, 최대값을 반환
  • 시간 복잡도 O(N)
    • 3 <= N == expression 크기 <= 100
    • 연산자는 최대 3개 : 사실상 O(1)
    • O(N) 의 시간복잡도 소요

💡 어려웠던 것 || 알게 된 것


  • 금일은 없음
profile
기록

0개의 댓글