문제 설명
여러분은 N개의 정수로 이루어진 배열 A와 정수 M이 주어질 때, 배열 A의 모든 원소를 M으로 나눈 나머지의 합을 구해야 합니다. 이를 통해 나머지의 성질과 배열을 효율적으로 다루는 방법에 대한 이해를 높이고, 코틀린에서의 반복문 및 조건문 활용 능력을 기를 수 있습니다.
입력 형식
- 첫 번째 줄에 배열의 크기 N (1 ≤ N ≤ 10^6)과 정수 M (1 ≤ M ≤ 1000)이 주어진다.
- 두 번째 줄에 N개의 정수 A1, A2, …, AN이 주어진다. (0 ≤ Ai ≤ 109)
출력 형식
배열 A의 모든 원소를 M으로 나눈 나머지의 합을 출력한다.
예시
입력: 5 3 1 2 3 4 5 출력: 1
문제 해결 과정
이 문제를 해결하기 위해서는 배열 A의 원소를 하나씩 M으로 나누고, 그 나머지를 모두 더하는 방식으로 접근할 수 있습니다. 이러한 접근법은 시간 복잡도가 O(N)으로 매우 효율적이며, 주어진 제약 조건 내에서 충분히 수행될 수 있습니다.
단계별 절차
- 입력받은 N과 M의 값을 저장합니다.
- 배열 A의 원소들을 입력받습니다.
- 모든 원소를 M으로 나눈 나머지를 계산하여 그 합을 구합니다.
- 결과를 출력합니다.
코틀린 코드 구현
아래의 코드는 위의 절차를 모두 구현한 코틀린 프로그램입니다:
fun main() { // 입력 val (n, m) = readLine()!!.split(" ").map { it.toInt() } val a = readLine()!!.split(" ").map { it.toInt() } // 나머지 합 계산 var remainderSum = 0 for (i in 0 until n) { remainderSum += a[i] % m } // 결과 출력 println(remainderSum) }
코드 설명
위 코드에서 readLine()
을 사용해 사용자로부터 입력을 받습니다. 첫 번째 라인은 배열 크기 N과 M을 입력받고, 두 번째 라인은 배열 A의 원소들을 입력받습니다. 그 후, for
루프를 사용하여 A의 모든 원소를 M으로 나눈 나머지를 계산하고, 이를 remainderSum
변수에 누적합니다. 마지막으로, 계산된 나머지의 합을 출력합니다.
복잡도 분석
이 문제의 시간 복잡도는 O(N)입니다. 이는 배열의 모든 원소를 한번씩 방문하기 때문입니다. 또한, 공간 복잡도는 O(1)로, 추가적인 변수 1개만 사용하여 결과를 저장하기 때문에 매우 효율적입니다.
최적화
주어진 문제의 구조상 가장 최적화된 방법으로 접근하고 있으며, 추가적인 최적화를 할 필요는 없습니다. 모든 원소를 한 번만 반복하여 결과를 얻기 때문입니다.
마무리
이 강좌에서는 나머지 합 구하기라는 문제를 통해 배열을 효율적으로 처리하는 방법과 코틀린의 기본적인 입출력, 반복문 사용법을 익혔습니다. 이러한 기초적인 문제를 통한 연습은 코딩 테스트의 기본을 다지는 데 큰 도움이 될 것입니다. 앞으로도 다양한 문제들을 풀어보며 실력을 쌓아가길 바랍니다.