240429 프로그래밍 심화 - 발제

노재원·2024년 4월 29일
0

내일배움캠프

목록 보기
28/90

이번 주도 잘 시작됐는데 사실 충격을 하나 먹은 건 학생에 맞춰서 수업이 진행되기 때문에 근로자의 날은 쉬지 않는다는 점이었다. 솔직히 수요일은 특히 쉬기 좋아서 쉬고 싶긴 하다.

그래도 친숙한 조도 프로그래밍 챕터라 바뀌지 않았고 아직 Kotlin 문법 단계라서 부담이 큰 단계는 아니니 수요일도 기왕 이렇게 된거 열심히 해야겠다.

2주차 과제 피드백

리드미, 알고리즘같은 부분은 딱히 문제 없고 설명할 때 귀찮다고 파일 이름들을 Level로 대충 퉁친것만 피드백 받았다.

3주차는 약간은 그럴싸하게 작명하고 분리도 뭐 긴 거 있으면 좀 하고 제출해야겠고 추가로 강의에서 나오는 예제들도 파일에 끼워놓은게 문제가 됐는데 그냥 괜히 가져오지 말고 ignore 등록하던지 삭제하고 제출할걸 그랬다.

3주차 프로그래밍 심화 발제 - 숫자 야구

3주차는 Kotlin 문법 심화 및 프로그래밍 심화로 2주차처럼 개인 과제로 진행된다.

과제 목표는 숫자 야구 게임이고 만들어본 적 있지만 기억날 리가 없으니 좀 고민하면서 다시 만들어야겠다. 강의에서 나오는 내용을 충분히 응용하면 풀 수 있는 문제지만 코드 완성도까지 따지다보면 내장함수도 더 써야할 거고 설명 난이도가 좀 올라가지 않을까 싶다.

이걸 설명하기에 앞서서 팀원 분들에게는 차라리 코드카타를 통한 코드 리딩과 문법 친화력을 권장드리는게 맞나 싶기도 하고 아무래도 3주차를 풀어나가면서 고민이 필요한 부분같다.

이번에도 그냥 제출만 하는 거에 더해서 뭔가 기능을 늘릴 걸 미리 적어봐야겠다.

  • 풀이 기록과 정답 저장하기
    기록 보기에 더해서 랭킹 기능, 날짜 저장, 대충 파일입출력 활용
  • 여러 예외처리
  • 숫자 늘리기 좋게 설계하기
    난이도 조정용으로 Easy, Normal, Hard 구분
  • 테스트 케이스 설계

특히 테스트 케이스같은 경우는 실무때도 한 두번빼고 작성해본 적이 없는데 한 번 다양하게 작성해볼 생각이다.



그리고 팀원분들과 스크럼을 할 때 이 과제에 대해서 차근차근 진행하시고 답부터 정하고 알고리즘 응용을 시작해보시라고 추천을 드렸고, 강의가 지루하시면 본격적으로 알고리즘 코드카타를 진행해보시라고 추천을 드렸다.

질문중에 여러가지가 들어올 수 있는 챕터고 특히 적절한 Kotlin 내장함수의 정보나 다른 언어로 작성된 알고리즘 이해하기같은 게 어려울 수 있으니 아주 소규모 단위로 ChatGPT 프롬포트 쓰는 법도 알려드렸는데 GPT 사용이 독이 될 수 있지만 이제 문법 기초가 아닌 응용 단계 과제가 나왔고 프롬포트를 소규모 단위로 쓰시고 질문을 꼬리물듯 이어나가시면 분명 이해에도 도움이 되실 거라 생각한다.


코드카타 - 프로그래머스 K번째수 정렬

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

  1. array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
  2. 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
  3. 2에서 나온 배열의 3번째 숫자는 5입니다.

배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

문제 링크

fun solution(array: IntArray, commands: Array<IntArray>): IntArray = 
commands.map { array.sliceArray(it[0] - 1..it[1] - 1).sorted()[it[2] - 1] }.toIntArray()

지난 문제에 이어서 Kotlin 내장 함수를 적절히 쓰면 아주 쉽게 풀 수 있는 문제였다. 이번에도 다른 풀이와 비교해도 군더더기는 딱히 없었고 .slice를 이용한 풀이와 .sliceArray 를 이용한 풀이만 비교해봤다.

slice는 일반 List의 split과 같은 방식으로 작동하며 IntArray에서 호출시 List로 바꾸고 처리한 다음 다시 IntArray로 바꿔준다고 하고 sliceArray는 IntArray에서만 작동되게 설계되어 있어 변형없이 IntArray로 계산하고 결과까지 바로 나온다고 한다.

실제로 시간 퍼포먼스도 sliceArray 쪽이 더 빨랐으니 앞으로 사용할 일이 있으면 참고해야겠다.

0개의 댓글