🦾 오늘의 컨디션 및 특이사항(개인 일정 등)
📑 세부 학습 내용
📅 스케쥴
- 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) 의 시간복잡도 소요
💡 어려웠던 것 || 알게 된 것