문제 지문 #3
A 사이트에서 아래 조건에 맞는 게시글을 최초로 작성하는 이용자에게 경품을 제공하려 합니다.
- 현재 작성되어있는 가장 마지막 게시글 이후에 작성된 게시글이어야 합니다.
- 게시글 번호의 자릿수가 짝수여야 합니다.
- 게시글 번호가 2n 자릿수 일 때, 앞 n 자리의 각 자릿수의 합과 뒤 n 자리의 각 자릿수의 합이 같아야 합니다.
이 사이트의 게시글 번호는 마지막에 작성된 게시글 번호부터 1씩 증가합니다. 예를 들어, 가장 마지막 게시글의 번호가 235386이라면, 이후에 작성되는 게시글의 번호는 235387, 235388... 이 되며, 번호가 235387 이상인 게시글이 경품 당첨의 대상이 됩니다.
당신은 경품을 받기위해 앞으로 게시글을 몇 개 더 작성해야 하는지 구하려 합니다. 이를 위해 다음과 같이 프로그램 구조를 작성했습니다.
1. 게시글 번호를 1 증가시키고 자릿수를 구합니다.
2. 만약 자릿수가 짝수가 아니라면 1로 돌아갑니다.
3. 만약 구한 자릿수가 짝수라면 다음을 수행합니다.
3-1. 앞 자릿수 절반과 뒷 자릿수 절반을 분리합니다.
3-2. 앞 자릿수 절반의 자릿수 합과 뒷 자릿수 절반의 자릿수 합을 구합니다.
3-3. 위에서 구한 합이 서로 같으면 4로 가고, 같지 않으면 1로 돌아갑니다.
4. (3에서 구한 수 - 처음에 매개변수로 주어진 수)를 return 합니다.
가장 마지막 게시글의 번호 num이 매개변수로 주어질 때, 경품을 받기 위해 앞으로 더 작성해야 하는 게시글의 개수를 return 하도록 solution 메서드를 작성하려 합니다. 위 구조를 참고하여 코드가 올바르게 동작할 수 있도록 빈칸에 주어진 func_a, func_b, func_c 메서드와 매개변수를 알맞게 채워주세요.
매개변수 설명
현재까지 작성된 가장 마지막 게시글의 번호 num이 매개변수로 주어집니다.
- num은 1 이상 50,000,000 이하의 자연수입니다.
return 값 설명
경품을 받기위해 앞으로 더 작성해야 하는 게시글의 개수를 return 해주세요.
예시
num | return |
1 | 10 |
235386 | 20 |
예시 설명
예시 #1
가장 마지막에 작성된 게시글의 번호가 1입니다.
당첨 조건을 만족하는 게시글 번호는 11이며, 따라서 최소 10번 더 게시글을 작성해야 합니다.
예시 #2
가장 마지막에 작성된 게시글의 번호는 6자리이며, 3자리씩 끊으면 다음과 같습니다.
- 앞 4자리 : 235
- 뒤 4자리 : 386
앞 3자리의 각 자릿수 합은 다음과 같습니다.
- 2 + 3 + 5 = 10
뒤 3자리의 각 자릿수 합은 다음과 같습니다.
- 3 + 8 + 6 = 17
앞으로 최소 20개의 글을 더 작성한다면, 글 번호는 235406이 되며, 뒤 3자리의 각 자릿수 합은 다음과 같습니다.
- 4 + 0 + 6 = 10
따라서 경품을 받기 위해 최소 20개의 글을 더 작성하면 됩니다.
혼자 풀이
빈칸 채우기 문제인데, 어려웠습니다. 꽤 오래 고민해서 풀었고, 문제가 틀렸다고 생각해서 디버그 모드도 돌려봤습니다.
크게 봤을 때는 주어진 수의 각 자릿수의 합을 구하는 알고리즘을 사용하는 문제입니다.
자리에 들어가야 하는 메서드가 func_a인지 func_b인지 func_c인지 찾는 것은 어렵지 않았습니다.
그런데, nextNum의 자릿수를 구해야 되는 func_b가 10으로 아무리 나눠도 0보다 클 것이라고 생각해서 문제가 틀린 줄 알았습니다.
그래서 무한 루프를 돌 것이라고 생각했는데, 실제로도 무한루프에 빠져 실행결과가 나오지 않았습니다.
그래서 결국 디버그 모드에서 돌려보았는데, 무한루프에 빠진 것은 func_b에 nextNum이 입력되어야 하는데, 그냥 num을 넣었기 때문이었습니다. 핵심은 func_b의 입력값 n이 int이기 때문에 1의 자릿수일 때 10으로 나누면 몫은 0이 된다는 것이었습니다.
func_c도 마찬가지였고요.
그리고, func_a의 입력값이 length 그대로가 아니라 length/2(이것이 n임) 이 들어가야 한다는 것도 발견하는데 한참 걸렸네요.
전체적으로 30분 정도 걸렸는데, 디버그 모드를 사용하지 않으면 시간이 더 걸렸을 것 같습니다.
/*************************************************
2차 3번 경품을 받기위해 작성해야 하는 글 수 구하기
************************************************/
class MySolution {
public int func_a(int n){ //자리수를 입력받아서 가운데를 나누는 수를 구한다.
int ret = 1;
while(n > 0){
ret *= 10;
n--;
}
return ret;
}
int func_b(int n){
int ret = 0;
while(n > 0){
ret++;
n /= 10; //10으로 나누면 어느 순간 n이 0이됨(int이기 때문)
}
return ret;
}
int func_c(int n){
int ret = 0;
while(n > 0){
ret += n%10; //10으로 나눈 나머지를 더하고 n은 10으로 나누어 자리수를 감소시킨다.
n /= 10; //1의 자리를 10으로 나누면 n이 int 이므로 몫이 0이된다.
}
return ret;
}
public int solution(int num) {
int nextNum = num;
while(true){
nextNum++;
// int length = func_@@@(@@@);
int length = func_b(nextNum); //수정한 부분 1씩 증가시키는 nextNum이 2n의 자리수를 가지는지 확인
if(length % 2 != 0)
continue;
// int divisor = func_@@@(@@@);
int divisor = func_a(length/2); //수정한 부분 length /2 가 n임
int front = nextNum / divisor;//divisor로 나누면 앞자리이고,
int back = nextNum % divisor;//divisor로 나눈 나머지가 뒷자리이다.
// int frontSum = func_@@@(@@@);
// int backSum = func_@@@(@@@);
int frontSum = func_c(front); //앞자리의 각 숫자를 더해준다.
int backSum = func_c(back); //뒷자리의 각 숫자를 더해준다.
if(frontSum == backSum)
break;
}
return nextNum - num;
}
// 아래는 테스트케이스 출력을 해보기 위한 main 메소드입니다.
public static void main(String[] args) {
MySolution sol = new MySolution();
int num1 = 1;
int ret1 = sol.solution(num1);
// [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
System.out.println("solution 메소드의 반환 값은 " + ret1 + " 입니다.");
int num2 = 235386;
int ret2 = sol.solution(num2);
// [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
System.out.println("solution 메소드의 반환 값은 " + ret2 + " 입니다.");
}
}
# 첨부 파일
프로젝트 파일 전체를 첨부합니다.
Solution 이 문제, CorrectSolution 이 정답, MySolution이 제가 푼 것입니다.
"Project from existing sources..." 메뉴에서 불러다 쓰시면 됩니다.
'Programming > Cos Pro 1급' 카테고리의 다른 글
Cos Pro 1급 - 샘플 문제 풀이 2차 5번 (배열: Index Out of Bounds피하기) (0) | 2022.10.13 |
---|---|
Cos Pro 1급 - 샘플 문제 풀이 2차 4번 (배열에서 중복없이 추출하기) (0) | 2022.10.12 |
Cos Pro 1급 - 샘플 문제 풀이 2차 2번 (0) | 2022.10.10 |
Cos Pro 1급 - 샘플 문제 풀이 2차 1번 (0) | 2022.10.09 |
Cos Pro 1급 - 샘플 문제 풀이 1차 10번 (0) | 2022.10.08 |
댓글