본문 바로가기
Programming/Cos Pro 1급

Cos Pro 1급 - 샘플 문제 풀이 3차 7번 (자리수 별 연산 방법)

by 우공80 2022. 10. 20.
728x90

자리수 별 연산 방법

문제 지문 #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

728x90

 

혼자 풀이


한 줄 고치기 문제입니다.
한 줄 고치기는 틀린 곳이 조건문인 경우가 많습니다.
그리고, 한 줄 전체를 고치기보다는 부호라던지 숫자라던지 하나만 살짝만 고치면 되는 경우가 많았습니다.

이번 문제는 주어진 수의 각 자리별 숫자에 대한 연산을 하는 문제입니다.
자주 출제되는 유형이니 반드시 숙달이 필요하겠습니다.

/*******************************************************
   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..." 메뉴에서 불러다 쓰시면 됩니다.

ThirdQuestion7.zip
0.01MB

출처: https://www.ybmit.com/cos_pro/cos_pro_r_test.jsp

728x90

댓글