Kotlin 사전캠프 TIL 4일차

노재원·2024년 3월 22일
0

내일배움캠프

목록 보기
4/90

처음으로 조별로 뭔가 진행하기

캠프에 참가한지 벌써 4일차, 처음에 사전 OT 듣는다고 설레발떤 것까지 포함하면 이번 주차를 내내 진행했다. 온라인이라 몸은 편해서 다행인게 어디 가까운 강남이라도 오프라인으로 출퇴근하라 그랬으면 아침마다 일어나기가 벌써 싫어졌을 것이다.


웹 용어 조사하기

본 캠프는 조별 프로젝트가 있다고 커리큘럼에서 확인하긴 했는데 사전 캠프에도 조는 있었다. 처음에 매니저님이 바로 조를 짜주긴 하셨는데 조별로 바로 뭔가 하는건 아니었고 각자 공부를 진행하며 진도를 채워야 했기에 앞으로도 그럴 줄 알았다. 그런데 바로 어제, 조별로 웹 관련 용어를 조사해서 발표하는 과제가 생겨서 처음으로 조원분들과 인사도 나누고 발표도 진행하게 됐다.

웹 개발 관련해서 많이 듣게 되는 기초적인 단어 12개중 나는 버그, 에러, 예외처리를 묶어서 가져갔는데 다들 어디선가 들어봐서 익숙할 것이기도 하고 내 실무 경험이랑 빗대어 예제를 들면 좀 재밌지 않을까 싶어서 가져왔다. 그런데 지금 와서 생각해보면 버그 에러 가져온건 생각보다 꿀통이 아닐까 싶어서 남들 고생할 때 나만 꿀 빤건 아니겠지 싶은 생각도 들었다.

어쨌든 약 3시간에 걸쳐 적절한 레퍼런스와 예제를 판별해서 노션에 적어넣기 시작했다. 그런데 너무 심취했는지 내용이 참 길어진게 문제였다. 이거 발표하기로 했는데..

TMI지만 학창시절부터 발표라는 건 나한테 큰 적이었다. 어찌저찌 발전해와서 지금에서야 말을 떨진 않지만

  • 점차 말이 빨라지고 숨쉬는 타이밍이 없음
  • 화면 구성이 알차지가 않아서 화면 이리저리 왔다갔다 하기 일쑤
  • 마이크를 잡은 손이 눈에 띄게 벌벌 떨림
  • 되도 않는 애드립 첨부

그야말로 총체적 난국이었기에 발표를 맡기면 좌절감이 먼저 사로잡곤 했다. 다니던 회사에서 사내 개발자 컨퍼런스를 많이 열어줘서 지금만큼이라도 나아진게 참 다행이다.

TMI는 끊고 어쨌든 발표까지 진행하긴 했다. 역시나 내용은 쓸데없는 부분이 많아 길었고 말은 굉장히 빨랐다. 차라리 글이라도 잘 읽히면 좋겠다는 생각밖에 들지 않는다.

어쩌면 오류 덩어리의 글 뭉치일수도 있지만 노션에 게시해서 이 곳에 남긴다.

Notion: 버그, 에러, 그리고 예외처리


음양 더하기

어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.

문제 링크

fun solution(absolutes: IntArray, signs: BooleanArray): Int {
        var answer: Int = 123456789
        
        answer = signs.withIndex().map { (index, sign) ->
            if (sign) absolutes[index] else -absolutes[index]
        }.sum()
        
        return answer
    }

절댓값만 담긴 배열과 부호만 담긴 배열을 잘 짬뽕해서 실제 정수로 만든 후 합을 구하는 문제다.
문제 난이도 자체는 쉽지만 이걸 얼마나 맛깔나게 풀어낼지 고민이 많았는데,

첫번째 방법은 .Zip을 써서 Pair로 묶는건데 실패했다. IntArray와 BooleanArray 도 Zip이 되는 걸로 기억하는데 왜 안되는 걸까?

두번째 방법이 .withIndex였다. 뭔가 마음엔 안들지만 Pair로 묶어내는 결과는 같고 절댓값 배열의 Index는 부호 배열과 길이가 같다는 명제가 있으니 적당히 .map으로 볶아 .sum으로 마무리 지었다.

이번에도 내 답안보다 명백하게 좋은 해답이 있을거라 믿어 의심치 않아 다른 풀이를 보니 매우 좋은 수가 있었다.

 fun solution(absolutes: IntArray, signs: BooleanArray) =
        absolutes.foldIndexed(0) { idx, acc, num -> acc + if (signs[idx]) num else -num }
fun <T, R> Iterable<T>.foldIndexed(
    initial: R,
    operation: (index: Int, acc: R, T) -> R
): R

.foldIndexed는 초기값을 지정하고 요소의 index, 누적된 결과인 acc, 요소인 T 세가지를 이용해 연산을 진행한다.

absolutes 에서 절댓값을 꺼내와 signs 에서 index로 참조해 절댓값과 바로 비교해 연산을 진행하는 멋진 모습을 보여줬다. 이게 최적인 이유는 아무래도 한 번의 Iterator로 누적된 결과값까지 뽑아내고 연산까지 마쳤기 때문이다. 내 답안은 두 번 돌아갔으니 안타까울 뿐이었다.

실무중에는 썼다 하면 sort, filter, map만 주구장창 애용했는데 여기서도 밑천이 드러난다.

0개의 댓글