최근 코딩테스트에서 자주 등장하는 수학적 문제 중 하나가 바로 Ax + By = C 형태의 방정식과 관련된 문제입니다. 이 강좌에서는 이 문제를 분석하고, 코틀린을 사용하여 해결하는 방법을 상세히 설명하겠습니다.
문제 설명
다음과 같은 조건을 가진 정수가 주어졌습니다:
- A, B, C는 정수이며, 1 <= |A|, |B|, |C| <= 1000입니다.
- x와 y는 0 이상인 정수입니다.
주어진 A, B, C에 대해 Ax + By = C를 만족하는 (x, y)의 모든 쌍을 찾으세요.
입력 형식
첫 번째 줄에 A, B, C가 공백으로 구분되어 주어집니다.
출력 형식
Ax + By = C를 만족하는 모든 (x, y) 쌍을 출력합니다. 쌍들은 오름차순으로 정렬되어야 하며, x 값이 같을 경우 y 값을 기준으로 정렬해야 합니다.
예시 입력
2 3 6
예시 출력
0 2 1 1 2 0
문제 접근 방법
이 문제를 해결하기 위해서는 먼저 Ax + By = C의 조건을 만족하는 정수 x와 y를 찾는 방식에 대해 알아보겠습니다. 이 조건을 만족하는 (x, y)의 쌍을 찾기 위해 다음과 같은 과정을 따릅니다:
- 루프 설정: x의 값은 0에서 C/A (C가 A로 나누어 떨어지지 않는 경우 주의)까지 변경하며 확인합니다. y의 값은 C – Ax로부터 계산할 수 있습니다.
- 정수 조건 확인: 계산된 y는 0보다 크거나 같아야 하며, 정수여야 합니다. 이 조건을 확인합니다.
- 결과 저장 및 출력: 조건을 만족하는 (x, y) 쌍을 리스트에 저장한 뒤, 최종적으로 정렬하여 출력합니다.
코틀린 구현
fun findSolutions(A: Int, B: Int, C: Int) { val solutions = mutableListOf>() for(x in 0..C / A) { val yValue = (C - (A * x)) / B // 조건을 검사하여 (x, y) 쌍을 추가 if (yValue >= 0 && (C - A * x) % B == 0) { solutions.add(Pair(x, yValue)) } } // 정렬 solutions.sortWith(compareBy({ it.first }, { it.second })) // 출력 for (solution in solutions) { println("${solution.first} ${solution.second}") } }
전체 코드
fun main() { val input = readLine()!!.split(" ") val A = input[0].toInt() val B = input[1].toInt() val C = input[2].toInt() findSolutions(A, B, C) }
결론
이번 강좌에서는 Ax + By = C 문제를 해결하기 위한 알고리즘과 그 구현 방법을 알아보았습니다. 이러한 유형의 문제는 특히 코딩테스트에서 자주 접할 수 있으며, 문제의 구조를 잘 이해하고 접근 방식을 명확히 하는 것이 중요합니다. 이와 같은 문제를 연습하여 알고리즘적 사고력을 기르고, 코틀린으로 다양한 문제를 해결하는 능력을 키우시길 바랍니다.