티스토리 뷰

BaekJoon/C

[BaekJoon/C] 백준 1065번 한수

Gabii_Y 2019. 5. 29. 13:37

 

이번 포스팅은 백준 알고리즘 사이트의 1065번 한수 문제를 C 언어로 코딩해보도록 하겠습니다. 아래 url로 접속하시면 문제를 볼 수 있습니다.

 

https://www.acmicpc.net/problem/1065

 

이번 포스팅은 지난 포스팅과 같은 단계로 함수 사용하기 단계 문제입니다.

 

 

이 문제의 경우 하나의 정수(1,000보다 작거나 같은 자연수 N)를 입력 받아 입력 받은 수 전까지의 한수가 몇개인지를 출력하는 문제입니다.

 

한수는 어떤 정수의 자리수가 등차수열을 이루는 수라고 하는데 아래 사진을 보면 좀 더 이해하기 쉬울 것 같습니다.

 

 

위의 그림을 보면 아시다싶이 99까지의 두 자리 수는 등차수열인지를 판단할 다른 자리 수가 없기 때문에 모두 한수가 성립하게 됩니다. 100 이후의 3자리 수부터는 각 자리의 수를 비교해 등차수열인지를 판단하고, 등차수열이 성립할 때는 한수로 판단합니다. 예시로 123은 각 자리 수의 차가 1로 등차수열이 성립합니다. 그렇기에 123은 한수이고, 문제에서 원하는 해당 수까지의 한수 개수는 99(99까지 모두 한수) + 2(100 이후 한수 == 111, 123)으로 총 101개가 됩니다. 또다른 예로 112의 경우 99 + 1(100이후 한수 == 111)로 총 100개입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
int Han(int n);
void main(){
    int input, res;
    scanf("%d"&input);
    res = Han(input);
    printf("%d", res);
}
int Han(int n){
    int i, cnt = 0, hund, ten, one;
    if (n < 100)
        return n;
    else{
        for (i = 100; i <= n; i++){
        hund = i/100;
         ten = (i%100)/10;
         one = (i%100)%10;
         if ((hund - ten) == (ten - one))
             cnt++;
        }        
        return (99+cnt);
    }
}
 

 

이 문제는 함수 사용하기의 문제기에 그 수까지의 한수를 구하고, 한수의 개수를 카운트하여 최종 한수 개수를 return 하여 main 함수에서 받아주는 코드로 작성하였습니다.

 

먼저 main 코드부터 보시면 scanf를 통해 input 변수에 한수의 개수를 구하고자 하는 수를 입력 받습니다. 그리고 res라는 변수에 Han이라는 한수를 구하는 함수의 결과를 전달받아 출력해줍니다.

 

가장 중요한 Han이라는 함수를 보시면, main에서 받은 input을 인자로 전달 받습니다. if문을 이용해 전달받은 수가 100보다 작으면 return n으로 입력받은 수 그대로 돌려줍니다. 이유는 위에 한수 설명에서 기술하였다싶이 100이하의 수는 모두 한수로 성립되기 때문에 그대로 수를 돌려주게 됩니다.

 

100이후의 세자리 수부터는 각 자리수를 쪼개어 각 자리수의 차를 구해 등차수열이 성립되면 한수로 여기고 cnt 변수를 1증가시켜줍니다. for문의 반복을 100부터 n까지 한 이유는 99까지는 모두 한수기에 불필요한 반복을 막고자 하였습니다.

 

최종적으로 n까지 for문의 반복이 끝났다면 return을 통해 cnt를 넘겨주는데, for문을 100부터 돌렸기에 그 전의 한수는 계산되지 않은 상태입니다. 그래서 return (99+cnt)로 값을 넘겨주시면 됩니다.

 

 

백준 문제 중에 코드를 작성하는데 큰 문제는 없지만, 문제를 이해하는데 시간이 걸리는 문제들이 종종 있습니다. 저의 경우 이번 한수 문제도 문제를 이해하고 코드로 옮기는데 시간이 조금 걸렸던 것 같은데, 문제 이해만 완료하면 코드 작성에는 큰 어려움이 없다고 생각됩니다.

 

다음 포스팅에서는 다음 문제를 풀어보도록 하겠습니다.

 

다음 포스팅에서 봐요:))

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함