• [커널아카데미] 백엔드 개발 부트캠프 12기 7주차 - 연휴 끝 1일 1코테 시작

    2025. 5. 16.

    by. 고구마달랭이

    내 황금 연휴는 어디갔을까

    진짜진짜진짜 엄청나게 행복했던 황금 연휴가 끝났다. 고작 수목금 3일 학원 간건데 일주일을 안쉬고 내리 출근한 것 마냥 피곤했다... 집중도 안돼서 계속 딴짓했다. 하루종일 빗소리 ASMR 켜놓고 공부했는데 자꾸 진짜로 비오는 것 같아서 창 밖을 보곤 했다.(TMI)

     

    새로운 cs스터디 시작

     

    그럼에도 코테를 열심히 풀었는데!! 이번에 들어간 새로운 CS스터디 덕분이다.
    나는 이론을 먼저 다지고 실습을 들어가는 것 보다 일단 뭔갈 만들면서 틀린 부분을 찾아가며 공부가 더 잘 되는 편이다. 당연히 이론은 정말 중요하지만 끝없는 '그래서 왜?', '왜 배워야 하는거지?', '어디에 쓰이는 건데?'하는 의문 때문에 흐름이 자꾸만 끊긴다.

     

    그렇기에 실제로 코드를 짜고 싶었는데... 코테를 풀고 싶진 않았다...(?)
    하지만 스터디를 통해 강제로 풀게 됐으니 코딩 왕초보인 나는 0레벨 부터 뿌실 예정이다. 신입으로 취업하려면 3레벨은 풀 수 있어야 되지 않을까? 아직 갈 길이 멀다 ㅠ ㅠ

     

    금요일에 처음으로 다같이 모여서 스터디 진행 방향에 대해 의견을 나눴다. 총 네명인데 다들 엄청 멋지시다!! 이력서가 정말 화려하시고... 실력도 화려하시고 모두 전공을 하셨다. 그... 공부 잘하고 싶으면 1등 옆에 앉으라는 말이 있다. 그래서 혜정님 따라 스터디에 온건데 여기 무슨 고등학교로 치면 SKY반 같다. 너무 어나더레벨이라 비교도 안하게 된다. 한 달 동안 이 멋쟁이 스터디원님들 쫓아가봐야지!!!

     

    프로그래머스

     

    원래 완전 입문 레벨0 부터 시작하려다가, 이전에 부캠 합류 전 0렙 문제들 반 정도를 풀어놨어서 제네릭에 익숙해질 겸 해시 문제를 풀었다. 사실 자바의 정석 교재로 공부할 때 제네릭 파트는 너무 안읽히고 사실 보고싶지 않아서... 넘겼다. 직접 써보는게 빠를 것 같았기 때문에..

     

    프로그래머스에 알고리즘 고득점 Kit라고 있다. 장유나가 알고리즘 부터 먼저 익숙해지면 다른 코테 푸는데에 많이 도움이 된다고 해서 해시 자료구조 부터 시작했다. 클린코드 어쩌구 강의도 들어봐야 되는데 아 할게 넘 많다🤯

     

    완주하지 못한 선수 🏃🏻‍♀️

    🔗 프로그래머스 문제 링크

     

    참가자 리스트 participant[]와 완주자 리스트 completion[]이 주어지고, 완주하지 못한 참가자를 추려내는 문제이다. 동명이인이 있을 수 있다.

    첫 문제 부터 난관에 봉착했다. 일단 문제 카테고리 자체가 '코딩테스트 연습 > 해시' 이기 때문에 해시를 사용해야된다는 건 알고있지만 무엇을, 어떻게 사용해야되는지 몰랐다. 그래서 이 문제는 GPT의 도움을 받았다.

    import java.util.*;
    class Solution {
    public String solution(String[] participant, String[] completion) {
    String answer = "";
    Map<String, Integer> mapParticipant = new HashMap<>();
    Map<String, Integer> mapCompletion = new HashMap<>();
    for (String p : participant) {
    mapParticipant.put(p, mapParticipant.getOrDefault(p, 0) + 1);
    }
    for (String c : completion) {
    mapCompletion.put(c, mapCompletion.getOrDefault(c, 0) + 1);
    }
    for (String s : mapParticipant.keySet()) {
    if (mapParticipant.get(s) > mapCompletion.getOrDefault(s, 0) ){
    return s;
    }
    }
    return "";
    }
    }

    그러면서 Map은 키와 값을 저장하는 것과, Set은 중복 없는 값만을 저장한다는 게 무슨 뜻인지 제대로 알게됐다. 역시 직접 코드를 쳐보면서 차이를 느껴보니까 이해가 너무 잘됐다. 제네릭 문법<>은 타입을 지정해서 받을 수 있다는 말 또한 정말 어렵게 느껴졌었는데 바로 이해됐다.

     

    • Map : 키(Key) - 값(Value), put(), getOrDefault()
    • Set : 중복 없는 값, add()

     

    예전에 0렙 문제 풀 때도 ArrayList가 뭔지도 정확히 모르면서 쓴 적이 있는데 이젠 알고 쓰니까 감회가 새로웠다. 0.2퍼센트 성장한 느낌

    getOrDefault(key, defaultValue)는 Map의 메서드인데 Key가 있냐 없냐를 반환하는 메서드다. 그러니까 저 코드에선 p, c, s가 있으면 그 '키의 값'을, 없으면 0을 리턴한다.

     

    이 연습을 토대로 다음 문제는 GPT의 도움 일절 없이 혼자서 풀어봤다.

     

    폰켓몬 👾

    🔗프로그래머스 문제 링크

     

    연구실에 있는 폰켓몬들의 종류 번호가 들어있는 리스트 nums를 받고 그 리스트의 절반의 폰켓몬을 선택할 수 있다. N/2의 폰켓몬을 고를 때 선택할 수 있는 폰켓몬 종류의 최댓값을 구하는 문제다.

    import java.util.HashSet;
    import java.util.Set;
    class Solution {
    public int solution(int[] nums) {
    int answer = 0;
    int canGet = nums.length / 2;
    Set<Integer> hashset = new HashSet<>();
    for (int num : nums) {
    hashset.add(num);
    }
    if (hashset.toArray().length < canGet) return hashset.toArray().length;
    // 다른 사람의 풀이 보니까 size()를 쓰면 된다! 맞다맞다
    return canGet;
    }
    }

     

    문제를 보고 생각해봤다. 어떤 식으로 접근해야될까?

    1. 겹치는 폰켓몬이 없다면 답은 무조건 리스트의 절반일 것이다.
    2. 최대한 다양한 종류의 폰켓몬이라면 중복된 숫자를 삭제해야겠다.
    3. 중복이라면 Set을 사용하면 되겠구나!

     

    노트에 나름대로 폰켓몬도 그려보며 생각했다. 솔직히 쉬운 문제 같은데 바로 답을 생각해내지 못하는 것 같아서 자괴감도 조금 느꼈지만 번뜩하고 생각이 딱 나서 이거다!하고 풀었다. (정말 기뻤다)

     

    그러고 나서 다른 사람의 풀이를 보니 toArray().length가 아닌 초간단 size()를 사용하더라. '아 맞다!! size()가 있었지!' 하고 생각이 났다. 이 경험을 통해 다음 부턴 길이를 잴 때 꼭 size()를 사용하게 될 것 같다.

     

    그리고 나서 용기를 얻어 다음 문제를 풀려고 했다.

     

    전화번호 목록 ☎️

    🔗프로그래머스 문제 링크

     

    이 문제는 접두사 찾기 문제다. 예를 들어
    구조대 : 119
    김현정 : 11 9552 4423
    이라는 번호를 가지고 있으면 구조대 전화번호는 김현정 전화번호의 접두사다.

     

    검색해보니 트라이(Trie) 자료구조를 사용하는 문제인 것 같은데 문제는 저 알고리즘이 나한테 너무 어려웠다. 구현을 계속 따라해봤으나 아직 이해가 가지 않는 부분들이 있었다.

     

    GPT랑 같이 풀고 싶진 않아서 결국 못풀었다. 다음에 다른 포스팅에서 당당하게 트라이 자료구조 구현과 문제 풀이를 들고 오겠다... (아마도)

     

    개미군단 🐜

    🔗프로그래머스 문제 링크

     

    사냥감의 체력에 딱 맞게 최소한의 병력을 구성하려면 몇 마리의 개미가 필요한지를 return하는 문제다.

    class Solution {
    public int solution(int hp) {
    int answer = 0;
    int big = 5;
    int mid = 3;
    int small = 1;
    answer = hp / big;
    hp -= big * answer;
    answer += hp / mid;
    hp -= mid * (hp / mid);
    answer += hp / small;
    return answer;
    }
    }

     

    내가 이 문제를... 몇 달 전 풀어보려고 했었는데 도저히 모르겠어서 넘기고 다음 문제를 풀었었다. 정말 오랜만에 본 문제인데 수요일에 풀려고 보니 아직도 모르겠었다. 근데 저 전화번호 목록 ☎️ 문제를 도저히 못풀겠어서 일요일인 오늘, 다시 개미군단 🐜 문제를 풀어봤는데...!!!!! 와~~~ 드디어 풀었다!!!

     

    누군가에겐 정말 쉬운 쪼렙 0렙짜리 문제겠지만 정말 몇 달 만에 풀었다!! 너무 신기하다. 그럴 때가 있다. 갑자기 머리에 팍! 하고 생각이 난다. 이 문제도 그랬다. 정말 기쁘다 ㅠㅠ

     

    제출하고 다른 사람의 풀이를 보니 내 코드와 비슷하면서도 훨 나은 코드가 있었다.

    class Solution {
    public int solution(int hp) {
    int answer = hp / 5;
    hp %= 5;
    answer += hp / 3;
    hp %= 3;
    answer += hp / 1;
    return answer;
    }
    }

     

    바로 이것!! hp에다가 뭘 곱한 것을 빼고 자시고 안하고 나머지 연산자 % 하나로 해결되는 일이었다. 또 하나 배웠다. 계산이 훨씬 단순해서 보기 좋다. 나눗셈 연산자(/)와 나머지 연산자(%)의 활용은 엄청나구나.

     

    마무리

     

    이제 SQL도 시작했고 쿼리도 여러개 짜봤다. SQL, DB는 실시간 강의 진도를 따라가고 있진 않고 나 혼자 하고있는데 잘 모르겠다 어떤 방법이 맞는 건지.. 이전에 mysql 찍먹 경험이 있어서 기초적인 쿼리는 어렵지 않지만 이렇게 실습 우선으로 가다간 갑자기 장벽에 막힐까봐 걱정이 들긴 한다.

     

    이미 수업 진도를 놓쳐버려서 DB랑 SQL은 계속 이런식으로 혼자 공부해볼건데 막히면 그 때 다시 이론 공부 하면 되지! 그리고 막혀도 괜찮다. 내겐 궁성이형이 있으니까 (강사님 헬프미 ~~ 🥹)

    인프런 할인 기간 때 영한이형 스프링 강의도 샀다. 금요일에 입문 부터 듣기 시작했는데 나의 엄청난 집중력 덕분에 딸랑 2강밖에 안들었다. ㅋㅋ🤦🏻‍♀️

     

    이제서야 아주 조오금씩 학원 가서 시간을 어떻게 써야할지 아주 쪼오금씩 감이 오는 것 같다. 모니터 보고 멍 때리는 시간 좀 줄이고 내게 주어진 시간을 더 효율적이게 알차게 보내는 노력을 하자! 공부 습관이 조금씩 잡히는 것 같아서 좋다.

     

    아 그리고 집 앞 헬스장 이용권이 끝나서 재등록할지 학원 지하 헬스장을 신규 등록 할지 고민 중이다. 학원에 12시간 넘게 앉아있고 저녁 마다 맛있는 거 먹어대서 이러다간 정말 곧 굴러다닐 것 같다 데굴데굴⚽️ 이제 학원에 적응 100% 했으니까 건강 챙기는 것도 필수다!!!! 잊지말거라 현정아 화팅

     

     

    일주일 같았던 3일 간의 7주차 끝💗

    profile
    고구마달랭이

    내 꿈은 억만장자

    댓글