Today's Codekata
// 햄버거 만들기
class Solution {
public int solution(int[] ingredient) {
int answer = 0;
List<Integer> list = new ArrayList<>();
for (int i : ingredient) {
list.add(i);
if (list.size() >= 4 &&
list.get(list.size() - 4) == 1 && list.get(list.size() - 3) == 2 &&
list.get(list.size() - 2) == 3 && list.get(list.size() - 1) == 1) {
for (int j = 0; j < 4; j++) {
list.remove(list.size() - 1);
}
answer++;
}
}
return answer;
}
}
리스트로 만드는 것과 중간 부분을 반복해서 잘라내는 방식으로 구현했는데, 인덱스 범위 초과 오류가 자꾸 발생했다. 그래서 리스트에 바로바로 담으면서 [1,2,3,1] 패턴이 나올 때, 뒤에서부터 잘라내는 방식으로 해결했다. 답안을 제출한 후 다른 사람들의 풀이를 보니 처음보는 `Stack` 클래스를 많이들 사용하고 있어서 나도 스택을 사용해 다시 만들어봤다.
Stack
`Stack`은 후입선출(LIFO) 구조로, 가장 최근에 넣은 데이터를 먼저 꺼내야 할 때 유용하다.
| 메서드 | 설명 |
| push(item) | 스택에 요소 추가 |
| pop() | 가장 위의 요소 제거하고 반환 |
| peek() | 가장 위의 요소 확인 (제거 X) |
| isEmpty() | 스택이 비어있는지 확인 |
| size() | 스택에 쌓인 요소 개수 확인 |
| search(item) | 해당 요소가 몇 번째에 있는지 반환 |
public int solution(int[] ingredient) {
int answer = 0;
Stack<Integer> stack = new Stack<>();
for (int i : ingredient) {
stack.push(i);
if (stack.size() >= 4) {
int size = stack.size();
if (stack.get(size - 4) == 1 && stack.get(size - 3) == 2 &&
stack.get(size - 2) == 3 && stack.get(size - 1) == 1) {
for (int j = 0; j < 4; j++) {
stack.pop();
}
answer++;
}
}
}
return answer;
}
`stack.pop()`을 활용해서 패턴을 제거하는 방식 외에는 리스트 기반 코드와 구조가 거의 흡사하다. 두 방식 모두 시간복잡도는 O(n)으로 성능 차이는 거의 없지만, 문제의 의도와 더 잘 맞는 구조를 선택하는 것이 좋아보인다.
# Rising Temperature
SELECT w1.id
FROM Weather w1
JOIN Weather w2
ON DATE_SUB(w1.recordDate, INTERVAL 1 DAY) = w2.recordDate
WHERE w1.temperature > w2.temperature;
# Customer Who Visited but Did Not Make Any Transactions
select v.customer_id, count(*) as count_no_trans
from Visits v
left join Transactions t on v.visit_id = t.visit_id
where t.transaction_id is null
group by 1;
# Product Sales Analysis I
select p.product_name, s.year, s.price
from Sales s
join Product p on s.product_id = p.product_id;
`DATE_ADD(date, INTERVAL n unit)`: 날짜에 시간을 더 한다.
`DATE_SUB(date, INTERVAL n unit) `: 날짜에 시간을 뺀다.
`unit`: 단위 (`DAY`,`MONTH`,`YEAR`,`HOUR`,`MINUTE`,`SECOND` 등)
주말 내내 가족행사로 정신없었지만, 틈틈이 시간을 쪼개어 코딩테스트 문제를 풀며 감각을 유지하려 노력했다.
비록 충분한 공부는 못 했지만, 짧은 시간이라도 꾸준히 이어가는 게 더 중요하다고 믿는다.
내일도 잠깐이라도 코드카타를 통해 흐름을 놓치지 않도록 해봐야겠다.