240503 프로그래밍 심화 - 과제 마무리하고 KPT 회고

노재원·2024년 5월 3일
0

내일배움캠프

목록 보기
32/90
post-custom-banner

과제제출 후 해설 듣기

Readme 작성

이번 Readme는 계산기 과제 할 때랑 포맷은 똑같다고 할 수 있는데 Level 별이 아닌 기능별 구현부로 나눠서 정리했다.

하지만 구현 의도는 둘째치고 구조를 파악하는데에는 크게 도움이 안될 것 같아서 순서도나 클래스 다이어그램 툴이라도 써서 적어볼까 했는데 영 납득할만한 구조를 짤 경험이 없어서 포기했다.

야구 게임 해설

구현 기능이 딱 정해진 계산기랑 달리 야구 게임은 핵심 알고리즘이야 비슷하겠지만 구조를 짜는 부분에서 사람마다 워낙 달라질테니 튜터님의 객체지향적 숫자 야구 게임은 어떤지를 중점으로 봤다. 주로 원론적이지만 프로그램을 정의하는 순서를 아주 잘 설명해주셔서 그 프로세스대로 정리해봤다.

  • 어떤 객체(등장인물)가 등장하면 좋은가?
    • Main - 입력을 받을 것
    • History - 게임 기록
    • BaseballGame - 게임

  • 어떻게 진행(대화)될 것인가?
    1. Main에서 사용자 입력을 무한루프로 받는다.
    2. 사용자가 게임을 하려고 하면 Main -> BaseballGame으로 요청을 보낸다.
    3. BaseballGame의 결과는 게임의 기록이고 Main은 이걸 History에 요청을 보낸다.
    4. 기록 조회시 Main은 History에 요청을 보낸다.
    5. 사용자가 종료 요청 보내면 무한루프를 탈출한다.
      그 외에도 게임의 시나리오, 기록의 시나리오도 코드 말고 주석으로 먼저 작성하셨다.

튜터님과 차이점이라면:

  1. 게임 기록 조회부를 어차피 IOUtils로 받아온다고 짧아져서 Main에서 처리했는데 기록 처리하는 부분을 모델로 뺐으면 더 좋은 구조로 작성했을 것 같다.
  2. 로직은 전부 객체로 넘기고 출력도 넘기면서 Main 코드를 최소화했다.
  3. 랜덤 정답에 slice 말고 take 쓰면 좀 더 간결하게 자를 수 있었다.
  4. 입력값 예외처리도 함수 하나 파서 체크했으면 좋았을 것 같다.
  5. 기능 구현 설계의 단위를 작게 설계하시고 크게 생각하면 복잡해진다고 하셨다.
  6. 숫자 범위 1~9 게임과 0~9 게임을 구분하기 위해 새로 Class를 만들고 상속을 쓰셨다.
  7. 예외회복 단계를 대입문으로 썼고 return 결과도 also scope로 처리했다.
  8. 입출력을 굳이 Main으로 한정짓는건 나중에 로직 변경시 두 파일을 오가며 수정하다가 캡슐화가 망가질 수도 있다.
    앱 설계때도 이걸 고민했었는데 MVC랍시고 통신 제한을 이상하게 걸었던 것 같으니 패턴의 의도에 대해서는 추가적인 조사를 해야할 것 같다.

미뤄뒀던 Kotlin 강의 마무리

비동기, Thread, Coroutine을 다루고 있던 5장은 과제에는 딱히 쓰지 않을테니 안듣고 있다가 오늘 과제 해설까지 다 듣고 마저 다 들었다.

사실 비동기의 개념은 실무에서도 아주 찔끔찔끔 써보기도 했고 사전캠프때 비동기만 따로 공부해서 발표까지 제대로 했을 정도인데 아무래도 진짜 쓸 때는 사용법 자체가 까다롭게 느껴질 때가 많았다.

그런데 개념도 이해할만 해지고 Coroutine도 실무때 갓 나온 기술이라 뭔 소린지 못알아먹겠던 때보다 훨씬 들을만 했고 꽤 수월하게 수강할 수 있었다.
(물론 실무에 적용할 노하우가 생긴 건 아니니 이럴 때 딱 써먹어야겠다 라는 감은 없다.)


오늘중으로 다음주부터 진행할 Spring 강의도 지급을 받아서 목차만 간략히 확인했다. 뭐라고 표현해야할지 모르겠는데 딱 모르겠다는 느낌으로 용어 자체가 앱 클라이언트 만지작거리던 내가 듣기엔 생소한 표현이 목차부터 많이 보였고 내가 API, GQL로 데이터 다룰 때 쓰던 것들을 제외하면 완전 새로 배우는 거니 내 멍청함이 돋보일까봐 걱정된다.


2주간의 Kotlin 챕터를 마친 후 KPT 회고

사실 1주차랑 겹치는 부분이 대부분이었지만 2주차에서는 새롭게 느껴지는 문제점이 있어 새로운 점만 추가로 적을 부분이 있었다.

Keep

  • GPT 활용법도 늘려가기
    자아의탁은 하면 절대 안되지만 GPT는 잘쓰면 부족한 레퍼런스 검색 능력을 정말 많이 커버쳐준다.

Problem

  • 강의 범위가 워낙 큰 만큼 알고리즘 만들기, 숫자 야구 구조 잡기, 강의 내용 정리하기같은 목표를 설정할 때 갈피를 잡기 어려웠다.
    내가 느낀 문제점이었고 월, 화, 수를 각자 복습하며 숫자야구 진도 나가기를 목표로 했었던 2주차였는데 입문자가 느끼기엔 Kotlin 문법의 범위는 너무 광대했고 숫자야구에 어떤 키워드를 써서 구조를 잡았으면 됐는지 목표 설계부터가 어려운 걸 몰랐었다.

Try

  • 튜터님께 따로 클래스 강의를 들었을 때처럼 사자 객체 만들기 처럼 작은 단위로 운용해가며 강의를 연계해 타입 10~15개로 변수 만들어서 공유하기 같은 미니 과제를 1~2시간 마다 공유하는 식으로 복습을 하는게 좋지 않았을까? 라는 생각이 이제야 들었다.
  • 모르는 부분은 GPT 활용법을 배워가며 더 공부하고 주말에도 좋고 코드 설계가 어려우면 한글로 먼저 기획서 작성하듯이 프로그램을 생각하면 좋을 것이다.

2주차는 1주차보다 어려웠던 만큼 팀원분들의 고생도 눈에 더 잘 보여서 내 아쉬움이 더 크게 적힌 KPT 회고가 된 것 같다. 튜터나 매니저로 팀에 들어온 건 아니니까 과제를 내주며 나대면 안된다는 선이 존재했었는데 사실 그러기보단 적극적으로 공부를 추진하는게 오히려 12시간을 힘들게 공부하시는 것보다 팀원으로서도 훨씬 도움이 됐을 거라고 생각한다.


코드카타 - 프로그래머스 콜라 문제

오래전 유행했던 콜라 문제가 있습니다. 콜라 문제의 지문은 다음과 같습니다.

정답은 아무에게도 말하지 마세요.

콜라 빈 병 2개를 가져다주면 콜라 1병을 주는 마트가 있다. 빈 병 20개를 가져다주면 몇 병을 받을 수 있는가?

단, 보유 중인 빈 병이 2개 미만이면, 콜라를 받을 수 없다.

문제를 열심히 풀던 상빈이는 일반화된 콜라 문제를 생각했습니다. 이 문제는 빈 병 a개를 가져다주면 콜라 b병을 주는 마트가 있을 때, 빈 병 n개를 가져다주면 몇 병을 받을 수 있는지 계산하는 문제입니다. 기존 콜라 문제와 마찬가지로, 보유 중인 빈 병이 a개 미만이면, 추가적으로 빈 병을 받을 순 없습니다. 상빈이는 열심히 고심했지만, 일반화된 콜라 문제의 답을 찾을 수 없었습니다. 상빈이를 도와, 일반화된 콜라 문제를 해결하는 프로그램을 만들어 주세요.

콜라를 받기 위해 마트에 주어야 하는 병 수 a, 빈 병 a개를 가져다 주면 마트가 주는 콜라 병 수 b, 상빈이가 가지고 있는 빈 병의 개수 n이 매개변수로 주어집니다. 상빈이가 받을 수 있는 콜라의 병 수를 return 하도록 solution 함수를 작성해주세요.

문제 링크

fun solution(a: Int, b: Int, n: Int): Int {
    var answer: Int = 0
    var calculatedColaCount = n
    
    while (calculatedColaCount >= a) {
        (calculatedColaCount / a * b).let {
            answer += it
            calculatedColaCount = it + (calculatedColaCount % a)
        }
    }
    
    return answer
}

문제 자체는 조건만 잘 세우면 복잡한 시간복잡도 없이 풀 수 있게 매개변수가 잘 주어진 문제였다. 일단 작성하고 나서 아무리 그래도 최적화 할 방법이 있겠거니 다방면으로 생각해봤지만

  1. 매개변수가 많이 필요해서 재귀함수엔 어울리지 않고
  2. repeat 같은 다른 반복문을 채용하기엔 while이 가장 잘 어울린다

어쨌든 짱구를 더 굴려봐도 답이 안나와서 제출하고 퍼포먼스상으론 정말 좋길래 문제 없다고 생각했는데 좋은 풀이가 있었다.

fun solution(a: Int, b: Int, n: Int): Int = (if (n > b) n - b else 0) / (a - b) * b

이게 순회 없이 풀 수 있는 문제였다니 놀랍다.

짱구를 굴려봤는데 일단 기본 예시의 a=3, b=1, n=20을 예로 들었을때

  1. n-b = 19
  2. 19 / (a-b) * b
  3. 19 / 2 * 1 = 9

결국 코드가 의미하는 연산의 의미에서
n-b 는 n중에서 실제로 교환 가능한 콜라의 갯수를 구하며
a-b는 콜라를 교환 받을 때 실제로 필요한 빈 병의 수 2병 을 의미하며
b는 교환시 교환비를 의미하니 (실제 계산가능 콜라) / (실제로 필요한 빈병 개수)를 해주고 마지막에 교환비를 곱해주면 받을 수 있는 콜라 양이 나온다.

이처럼 실제 교환 가능한 19병을 실제 필요 병 갯수와 교환비를 곱하는 수학적인 공식이 가능했다. a=3, b=2 처럼 바꿔보고 직접 풀어보느라 이해하는데 좀 걸리긴 했는데 많이 신기했다.

post-custom-banner

0개의 댓글