Today's Codekata
// 달리기 경주
class Solution {
public String[] solution(String[] players, String[] callings) {
Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < players.length; i++) {
map.put(players[i], i);
}
for (String calling : callings) {
int idx = map.get(calling);
String temp = players[idx - 1];
players[idx - 1] = calling;
players[idx] = temp;
map.put(calling, idx - 1);
map.put(temp, idx);
}
return players;
}
}
# Average Selling Price
SELECT p.product_id,
IFNULL(ROUND(SUM(p.price * u.units)
/ SUM(u.units), 2), 0) AS average_price
FROM Prices p
LEFT JOIN UnitsSold u ON p.product_id = u.product_id
AND u.purchase_date BETWEEN p.start_date AND p.end_date
GROUP BY p.product_id;
# Project Employees I
SELECT p.project_id, ROUND(AVG(e.experience_years), 2) AS average_years
FROM Project p
JOIN Employee e on p.employee_id = e.employee_id
GROUP BY p.project_id;
# Percentage of Users Attended a Contest
SELECT r.contest_id,
ROUND(COUNT(r.user_id) / (SELECT COUNT(*) FROM Users) * 100, 2) AS percentage
FROM Register r
GROUP BY r.contest_id
ORDER BY percentage DESC, r.contest_id;
팀 프로젝트 시작!

이번 팀 프로젝트 주제는 '뉴스피드 만들기' 였다. 본격적인 구현에 앞서 팀원들과 함께 API명세와 와이어프레임, ERD, 테이블 설계까지 이전 과제들과 달리 굉장히 구체적인 기획 과정을 거쳤다. 단순히 기능을 나열하는 데 그치지 않고, 실제 사용자 흐름과 데이터 구조를 고려해 설계한 덕분에 개발의 방향성이 훨씬 명확해졌다. 무엇보다도 인상 깊었던 것은 집단지성의 힘이었다. 혼자 구현했다면 놓쳤을 부분이나 여러 차례 리팩토링을 통해 도달했을 것도 팀원들과의 논의를 통해 어렵지 않게 도달할 수 있었다. 서로의 관점을 공유하고, 끊임없이 피드백을 주고받는 과정에서 프로젝트이 완성도가 굉장히 높아졌다. 아직도 다듬을 부분들이 많고, 예상치 못한 문제들과 계속 부딪히게 될 것이다. 하지만 이번 기획 과정을 통해 느낀 건, 계획이 탄탄하면 막연함은 줄어들고 자신감은 커진다는 점이다. 혼자 고민하던 부분을 팀 전체가 공유하고 함께 해결해가면서, 단순히 1+1이 아닌 10에 가까운 시너지를 낼 수 있다는 걸 알게 되었다. 이번 프로젝트를 통해 함께 일하고 싶은 개발자로서 더 성장하는 시간이 되었으면 한다.
