문제 지문 #7
카프리카 수는 다음을 만족하는 수를 뜻합니다.
- 자신의 제곱수를 둘로 나누어 더한 값이 자기 자신과 같습니다.
- 단, 둘로 나뉜 수는 모두 양수여야 합니다.
예를 들어, 55^2는 3,025입니다. 3,025는 3과 025, 30과 25, 302와 5로 나눌 수 있습니다. 이때 30+25 = 55이므로 55는 카프리카 수입니다.
자연수 k가 매개변수로 주어질 때, k 이하인 모든 카프리카 수를 배열에 담아 오름차순으로 정렬하여 return 하도록 solution 메서드를 작성했습니다. 그러나, 코드 일부분이 잘못되었기 때문에, 코드가 올바르게 동작하지 않습니다. 주어진 코드에서 _한 줄_만 변경해 모든 입력에 대해 올바르게 동작하도록 수정해주세요.
매개변수 설명
자연수 k가 solution 메서드의 매개변수로 주어집니다.
- k는 50 이상 100,000 이하인 자연수입니다.
return 값 설명
k 이하인 모든 카프리카 수를 배열에 담아 오름차순으로 정렬하여 return 해주세요.
- 100,000 이하인 카프리카 수는 100개보다 작습니다.
예시
k | return |
500 | [9, 45, 55, 99, 297] |
예시 설명
9 x 9 = 81 → 8 + 1 = 9
45 x 45 = 2,025 → 20 + 25 = 45
55 x 55 = 3,025 → 30 + 25 = 55
99 x 99 = 9,801 → 98 + 01 = 99
297 x 297 = 88,209 → 88 + 209 = 297
혼자 풀이
한 줄 고치기 문제입니다.
한 줄 고치기는 틀린 곳이 조건문인 경우가 많습니다.
그리고, 한 줄 전체를 고치기보다는 부호라던지 숫자라던지 하나만 살짝만 고치면 되는 경우가 많았습니다.
이번 문제는 주어진 수의 각 자리별 숫자에 대한 연산을 하는 문제입니다.
자주 출제되는 유형이니 반드시 숙달이 필요하겠습니다.
/*******************************************************
3차 7번 자리 수 별로 연산하는 방법
*******************************************************/
import java.util.Arrays;
class MySolution {
public int[] solution(int k) {
int[] kaprekarArr = new int[k];
int count = 0;
for (int i = 1; i <= k; i++) {
long squareNum = i * i;
long divisor = 1;
// while (squareNum % divisor != 0) {
while (squareNum / divisor > 1) { //divisor가 가장 큰 자리수에 도달하면 루프 중단
long front = squareNum / divisor;
long back = squareNum % divisor;
divisor *= 10;
if (back != 0 && front != 0)
if (front + back == i) {
kaprekarArr[count] = i;
count++;
}
}
}
int[] answer = new int[count];
for (int i = 0; i < count; i++)
answer[i] = kaprekarArr[i];
return answer;
}
// 아래는 테스트케이스 출력을 해보기 위한 main 메소드입니다. main 메소드는 잘못된 부분이 없으니, solution 메소드만 수정하세요.
public static void main(String[] args) {
MySolution sol = new MySolution();
int k = 500;
int[] ret = sol.solution(k);
// [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
System.out.println("solution 메소드의 반환 값은 " + Arrays.toString(ret) + " 입니다.");
}
}
정답
굳이 1보다 작다를 할 필요 없이 %를 /로 변경해주기만 해도 되네요.
어차피 squareNum과 divisor 둘 다 정수형이어서 연산 결과도 정수형입니다.
class CorrectSolution {
public int[] solution(int k) {
int[] kaprekarArr = new int[k];
int count = 0;
for (int i = 1; i <= k; i++) {
long squareNum = i * i;
long divisor = 1;
while (squareNum / divisor != 0) {
long front = squareNum / divisor;
long back = squareNum % divisor;
divisor *= 10;
if (back != 0 && front != 0)
if (front + back == i) {
kaprekarArr[count] = i;
count++;
}
}
}
int[] answer = new int[count];
for (int i = 0; i < count; i++)
answer[i] = kaprekarArr[i];
return answer;
}
}
첨부 파일
프로젝트 파일 전체를 첨부합니다.
Solution 이 문제, CorrectSolution 이 정답, MySolution이 제가 푼 것입니다.
"Project from existing sources..." 메뉴에서 불러다 쓰시면 됩니다.
'Programming > Cos Pro 1급' 카테고리의 다른 글
Cos Pro 1급 - 샘플 문제 풀이 3차 9번 (숫자 배열의 구간별 합계) (1) | 2022.10.21 |
---|---|
Cos Pro 1급 - 샘플 문제 풀이 3차 8번 (continue와 break) (2) | 2022.10.20 |
Cos Pro 1급 - 샘플 문제 풀이 3차 6번 (n이하의 소수를 찾아 더하기) (1) | 2022.10.19 |
Cos Pro 1급 - 샘플 문제 풀이 3차 5번 (전광판 어플 문구 출력하기) (0) | 2022.10.19 |
Cos Pro 1급 - 샘플 문제 풀이 3차 4번 (substring() 활용) (0) | 2022.10.18 |
댓글