728x90
반응형

한수 성공

 
문제

어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오. 

입력

첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.

출력

첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.

 

처음 문제를 대충 읽었을 때는 어렵겠다고 생각. 하지만 입력되는 N의 조건이 간단함

 

1. 한자리수의 경우, 원소가 하나이므로 등차 수열이다.

2. 두자리 수의 경우, 원소가 두개 밖에 없으므로 등차 수열이다.

즉, N<100 인 경우, '한수'의 개수는 99개이다.

 

3. 세자리의 경우

백의 자리, 십의 자리, 일의 자리 의 차이가 일정할 경우 등차 수열이라 할 수 있다.

백의 자리는 i/100

십의 자리는 i/10%10

일의 자리는 i%10

으로 나타낼 수 있다.

 

입력된 정수 N 보다 작거나 같은 한 수의 개수를 세기 위해

100이상 N이하의 정수에 대하여 백-십 = 십-일 인지 확인해본다.

 

 

#include <stdio.h>

int ishan(int x){
    int count=0;
    //문제에서 입력은 1000보다 작거나 같음
    //따라서 한자리수나 두자리수의 경우는 무조건 등차수열이다.
    if(x<100) {
         return x;  
    }else{
        count = 99;
        
        for(int i=100; i<=x; i++){
            int hund = i/100;
            int ten = (i/10)%10;
            int one = i%10;
            
            if((hund-ten)==(ten-one)){
                count++;
            }
            
        }
        return count;
    }
    
    
    
    
    
}

int main()
{
    //어떤 양의 정수 x 의 각 자리가 등차수열을 이룬다면..한수
    int x;
    
    scanf("%d",&x);
    
    printf("%d",ishan(x));
    return 0;
}

 

 

 

반응형

'백준 단계별로 풀어보기 > 함수' 카테고리의 다른 글

백준 4673 셀프 넘버  (0) 2022.09.21
728x90
반응형

문제

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.

26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다.

위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.

N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. N은 0보다 크거나 같고, 99보다 작거나 같은 정수이다.

출력

첫째 줄에 N의 사이클 길이를 출력한다.

 

 

규칙을 보자마자 든 생각 : 10의 자리와 1의 자리를 분리해서 계산하면 편하겠다.

ten, one 이용한다.

 

#include <stdio.h>
#include <math.h>


int main(){

    int num;
    scanf("%d",&num);
    int ten = num/10;
    int one = num%10;
   
    //printf("%d ",ten);
    //printf("%d \n",one);

    int i = 0;

    do{
        int temp = ten;
        ten = one;
        one = (temp+one)%10;
        i++;
        //printf("%d a\n",ten);
        //printf("%d a\n",one);


    }while(ten*10 + one != num);

    printf("%d",i);

    return 0;
}

ten 은 num / 10

one 은 num % 10 이다.

 

규칙을 적용하면 ten 은 기존의 one 이 되고,

one 은 기존의 ten 과 one 의 합을 10으로 나눈 나머지가 된다.

 

이 과정을 반복하다 보면 ten * 10 + one 의 결과가 num 과 일치할 때가 생기는데, 이때까지 반복한 횟수를 출력한다.

반응형

'백준 브론즈' 카테고리의 다른 글

백준 1942 디지털시계  (0) 2024.03.03
728x90
반응형

문제

시작 -> 실행 -> cmd를 쳐보자. 검정 화면이 눈에 보인다. 여기서 dir이라고 치면 그 디렉토리에 있는 서브디렉토리와 파일이 모두 나온다. 이때 원하는 파일을 찾으려면 다음과 같이 하면 된다.

dir *.exe라고 치면 확장자가 exe인 파일이 다 나온다. "dir 패턴"과 같이 치면 그 패턴에 맞는 파일만 검색 결과로 나온다. 예를 들어, dir a?b.exe라고 검색하면 파일명의 첫 번째 글자가 a이고, 세 번째 글자가 b이고, 확장자가 exe인 것이 모두 나온다. 이때 두 번째 문자는 아무거나 나와도 된다. 예를 들어, acb.exe, aab.exe, apb.exe가 나온다.

이 문제는 검색 결과가 먼저 주어졌을 때, 패턴으로 뭘 쳐야 그 결과가 나오는지를 출력하는 문제이다. 패턴에는 알파벳과 "." 그리고 "?"만 넣을 수 있다. 가능하면 ?을 적게 써야 한다. 그 디렉토리에는 검색 결과에 나온 파일만 있다고 가정하고, 파일 이름의 길이는 모두 같다.

입력

첫째 줄에 파일 이름의 개수 N이 주어진다. 둘째 줄부터 N개의 줄에는 파일 이름이 주어진다. N은 50보다 작거나 같은 자연수이고 파일 이름의 길이는 모두 같고 길이는 최대 50이다. 파일이름은 알파벳 소문자와 '.' 로만 이루어져 있다.

 

 

#include <stdio.h>
#include <string.h>

 

int main(){

 

    /*
    첫째 줄에 파일 이름의 개수 N이 주어진다. 둘째 줄부터 N개의 줄에는 파일 이름이 주어진다.
     N은 50보다 작거나 같은 자연수이고 파일 이름의 길이는 모두 같고 길이는 최대 50이다.
    파일이름은 알파벳 소문자와 '.' 로만 이루어져 있다.
    */

 

    int N;
    char a[51][51];
    int check =1
//참과 거짓을 구분한다.
 

 

    int len;



    scanf("%d", &N);

//먼저 문자열의 갯수를 입력 받고

    for(int i=0; i<N; i++){
        scanf("%s", a[i]);
    }

//배열의 행 마다 입력받는다. 

 

    len = strlen(a[0]);

//첫번 째로 입력한 문자열의 길이

    if(N==1){
        printf("%s",a[0]);
        return 0;
    }
//만약 문자열이 한개면 비교의 의미가 없다.
    else{
        for(int i=0; i<len; i++){
            check =1;
            for (int j=0; j< N; j++){

//한개가 아니다.

//각 열 별로 같은지 다른지를 확인한다. 

//각 행의 i번 째 문자에 대하여...;

                if(a[j][i]!=a[0][i]){
                    check = 0;
                }
            //만약에 j행의 i번 째 문자가 첫번째 행의 i 번째 문자와 다르다면? : check = false
            }
//for 문의 끝
            if(check == 0){
                a[0][i]='?';
            }
            //비교의 결과 check 가 false 라면 ? i 번째 열의 문자는 첫번째 행의 i번 째 문자열과 다른 게 있다 -> 공통 패턴이 아니다. 따라서 '?' 로 변경한다.
           
        }
        printf("%s",a[0]);
    }
 







}
반응형

'백준 실버' 카테고리의 다른 글

백준 좋은구간 1059  (0) 2024.03.04
백준 1049 기타줄  (0) 2024.03.04
백준 1003번  (0) 2021.11.19
728x90
반응형

피보나치 함수

 

다음 소스는 N번째 피보나치 수를 구하는 C++ 함수이다.

int fibonacci(int n) {
    if (n == 0) {
        printf("0");
        return 0;
    } else if (n == 1) {
        printf("1");
        return 1;
    } else {
        return fibonacci(n‐1) + fibonacci(n‐2);
    }
}

fibonacci(3)을 호출하면 다음과 같은 일이 일어난다.

  • fibonacci(3)은 fibonacci(2)와 fibonacci(1) (첫 번째 호출)을 호출한다.
  • fibonacci(2)는 fibonacci(1) (두 번째 호출)과 fibonacci(0)을 호출한다.
  • 두 번째 호출한 fibonacci(1)은 1을 출력하고 1을 리턴한다.
  • fibonacci(0)은 0을 출력하고, 0을 리턴한다.
  • fibonacci(2)는 fibonacci(1)과 fibonacci(0)의 결과를 얻고, 1을 리턴한다.
  • 첫 번째 호출한 fibonacci(1)은 1을 출력하고, 1을 리턴한다.
  • fibonacci(3)은 fibonacci(2)와 fibonacci(1)의 결과를 얻고, 2를 리턴한다.

1은 2번 출력되고, 0은 1번 출력된다. N이 주어졌을 때, fibonacci(N)을 호출했을 때, 0과 1이 각각 몇 번 출력되는지 구하는 프로그램을 작성하시오.

 

피보나치를 호출 할 때 리턴 값이 0,1 인 경우를 count 하면 되지 않나

반응형

'백준 실버' 카테고리의 다른 글

백준 좋은구간 1059  (0) 2024.03.04
백준 1049 기타줄  (0) 2024.03.04
백준 1032  (0) 2021.11.19

+ Recent posts