본문 바로가기
  • 개발하는 곰돌이

2023/0213

[Java/Kotlin] 자바 Stream을 통해 리스트의 요소를 특정 key 기준으로 grouping하여 다른 객체로 합치기 및 코틀린으로 변경해보기 목차 Stream이란? 자바의 Stream은 자바 8버전에 새로 추가된 기능으로, 컬렉션 객체에서 요소들을 순회하면서 람다 함수를 통해 이 요소들을 가공하거나 요소의 특정 필드를 추출, 또는 컬렉션 객체의 요소들을 토대로 한 새로운 객체를 생성하는 것 외에도 다양한 방법으로 활용할 수 있는 강력한 기능이다. 다양한 기능들이 있지만 map()과 filter()정도만 해도 다채롭게 사용할 수 있다. 이 포스트에서는 업무 중 마주했던, 리스트의 요소들을 특정 key를 기준으로 한 새로운 객체로 병합하여 이 새로운 객체들의 리스트로 변환한 내용과 스트림을 통해 이 코드들을 개선해나간 내용, 나아가서 이렇게 개선된 코드를 코틀린으로 표현하면 어떻게 되는지에 대해 정리할 것이다. 문제의 시작 DB에 위와 같은 형태.. 2023. 2. 9.
[Kotlin] 백준 11637 : 인기 투표 문제 링크 11637번: 인기 투표 각 테스트 케이스는 첫 번째 줄부터 순서대로 출력된다. 최다 득표자가 과반수 득표를 했을경우에는 "majority winner R", 절반 이하의 득표를 하였을 경우엔 "minority winner R"가 되며, 최다 득표자가 없 www.acmicpc.net 문제 해설 간단한 구현 문제이다. 각 테스트 케이스마다 매 입력으로 주어지는 득표 수 중 최대치와 득표 수의 합계를 구한다. 최대 득표 수의 개수가 1이 아니면(= 최다 득표자가 2명 이상이면) "no winner"를 출력한다. 최대 득표 수의 개수가 1이라면 득표 수의 합계를 2로 나눈 값과 최대 득표 수를 비교하여 "majority winner R" 또는 "minority winner R"를 출력한다. Code.. 2023. 2. 8.
[Kotlin] 백준 12931 : 두 배 더하기 문제 링크 12931번: 두 배 더하기모든 값이 0으로 채워져 있는 길이가 N인 배열 A가 있다. 영선이는 다음과 같은 두 연산을 수행할 수 있다. 배열에 있는 값 하나를 1 증가시킨다. 배열에 있는 모든 값을 두 배 시킨다. 배열 B가 주www.acmicpc.net문제 해설문제는 모든 값이 0으로 채워진 배열을 입력으로 주어진 배열로 만드는 것이지만, 역으로 생각해보면 입력으로 주어진 배열의 모든 값을 0으로 만들기 위한 연산의 최소 횟수를 구하는 문제라는 것을 알 수 있다. 역으로 접근하면 된다는 것을 알았으니 어떻게 연산을 진행할 지 생각해보자. 배열의 모든 값을 반으로 나누는 것이 값 하나를 1 감소시키는 것보다 훨씬 효율적이다. 그런데 홀수는 반으로 나눌 수 없으니 1 .. 2023. 2. 5.
[Kotlin/Java] 개인적인 Enum 활용기 목차 클린 코드(로버트 C. 마틴 著)를 읽거나 개발 강의를 듣다 보면 리터럴 대신 Enum을 사용하는 것을 권장하는 경우가 많다. 최근 프로젝트를 진행할 때 Enum을 사용하면서 느낀 점에 대해서 정리해보고자 한다. Enum? Enum이란 관련된 요소들을 모아놓은 집합 또는 단어 의미 그대로 열거해 놓은 것이라고 볼 수 있다. 사실 자바를 처음 배울 당시에만 해도 Enum에 대한 내용은 뭔가 잘 와닿지 않았다. 대부분 Enum에 대해서는 짧고 간단하게 다루는 경우가 많았고, 심지어 아예 Enum을 다루지 않은 책들도 있었다. 그러던 도중 배민 기술 블로그에서 Enum을 다룬 글과 최근 수강한 Spring Boot 강의에서 Enum을 활용하는 것을 보고 어떻게 Enum을 활용할 수 있을지 와닿은 점이 있.. 2023. 2. 4.
[Kotlin] 백준 1629 : 곱셈 문제 링크 1629번: 곱셈 첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다. www.acmicpc.net 문제 해설 \(A^B\mod C\)를 구해야 한다. 그런데 \(A\), \(B\), \(C\) 모두 최대치가 Int.MAX_VALUE이기 때문에 정말 정직하게 거듭제곱을 하면 무조건 시간초과가 발생한다. 따라서 효율적인 방법을 찾아서 해결해야 한다. 이 문제는 지수 법칙을 이용하면 수월하게 해결할 수 있다. \(x^{2n}=(x^2)^n\)인 성질과 \(x{n+m}=x^n\times x^m\)인 성질을 이용하여 지수를 계속 반으로 나누면서 밑을 제곱하는 것이다. 예를 들어 \(2^{14}\)를 지수 법칙을 이용해서 .. 2023. 2. 2.