2, 3강 과제 정답

2강 문제

  • 아스키 코드

    • 문자도 숫자로 다루어진다는 것을 이해하는 문제입니다

      #include <stdio.h>
      int main()
      {
        char a;
        scanf("%c",&a);
        printf("%d",a);
      }
  • 스타워즈 로고

    • 알고리즘 문제를 풀 때는 주어진 문제의 출력 형식을 정확하게 맞춰줘야 합니다.

    • 따라서 문제의 출력 형식을 복사-붙여넣기로 맞춰주는 것이 좋습니다.

      #include <stdio.h>
      int main()
      {
        printf("    8888888888  888    88888\n");
        printf("   88     88   88 88   88  88\n");
        printf("    8888  88  88   88  88888\n");
        printf("       88 88 888888888 88   88\n");
        printf("88888888  88 88     88 88    888888\n");
        printf("\n");
        printf("88  88  88   888    88888    888888\n");
        printf("88  88  88  88 88   88  88  88\n");
        printf("88 8888 88 88   88  88888    8888\n");
        printf(" 888  888 888888888 88  88      88\n");
        printf("  88  88  88     88 88   88888888\n");
      }
  • We love krill

      #include <stdio.h>
      int main()
      {
          printf("강한친구 대한육군\n강한친구 대한육군");
          return 0;
      }
  • 나부 함대 데이터

      #include <stdio.h>
      int main()
      {
          printf("SHIP NAME      CLASS          DEPLOYMENT IN SERVICE\n");
          printf("N2 Bomber      Heavy Fighter  Limited    21        \n");
          printf("J-Type 327     Light Combat   Unlimited  1         \n");
          printf("NX Cruiser     Medium Fighter Limited    18        \n");
          printf("N1 Starfighter Medium Fighter Unlimited  25        \n");
          printf("Royal Cruiser  Light Combat   Limited    4         \n");
          return 0;
      }
    • printf 내부에서 "와 \는 특별한 의미를 가지기 때문에 이 문자들을 출력하기 위해서는 \를 붙여줘야 합니다.

      #include <stdio.h>
      
      int main()
      {
        printf("|\\_/|\n");
        printf("|q p|   /}\n");
        printf("( 0 )\"\"\"\\\n");
        printf("|\"^\"`    |\n");
        printf("||_/=\\\\__|\n");
      }
  • 고양이

      #include <stdio.h>
      int main()
      {
          printf("\\    /\\\n");
          printf(" )  ( ')\n");
          printf("(  /  )\n");
          printf(" \\(__)|\n");
      }
  • 콜센터

      #include <stdio.h>
      int main()
      {
          printf("     /~\\\n");
          printf("    ( oo|\n");
          printf("    _\\=/_\n");
          printf("   /  _  \\\n");
          printf("  //|/.\\|\\\\ \n");
          printf(" ||  \\ /  ||\n");
          printf("============\n");
          printf("|          |\n");
          printf("|          |\n");
          printf("|          |\n");
          return 0;
      }
  • A+B

    • 간단히 연산자를 사용해보는 문제입니다.

      #include <stdio.h>
      int main()
      {
        int a,b;
        scanf("%d%d",&a,&b);
        printf("%d", a+b);
      }
  • A-B

      #include <stdio.h>
      int main()
      {
          int a,b;
          scanf("%d%d",&a,&b);
          printf("%d", a-b);
      }
  • AxB

      #include <stdio.h>
      int main()
      {
          int a,b;
          scanf("%d%d",&a,&b);
          printf("%d", a*b);
      }
  • A/B

      #include <stdio.h>
      int main()
      {
          int a,b;
          scanf("%d%d",&a,&b);
          printf("%d", a/b);
      }
  • 사칙연산

      #include <stdio.h>
      int main()
      {
      int a, b;
      scanf("%d %d", &a, &b);
      printf("%d\n", a + b);
      printf("%d\n", a - b);
      printf("%d\n", a*b);
      printf("%d\n", a / b);
      printf("%d\n", a%b);
      return 0;
      }
  • 나머지

    • 나머지 연산의 속성을 묻는 문제입니다.

      #include<stdio.h>
      int main()
      {
        int A,B,C;
        scanf("%d %d %d",&A,&B,&C);
        printf("%d\n",(A+B)%C);
        printf("%d\n",(A%C + B%C)%C);
        printf("%d\n",(A*B)%C);
        printf("%d\n",((A%C)*(B%C))%C);
        return 0;
      }
  • 제리와 톰

    • 간단히 변수와 연산자를 활용하여 실생활의 문제를 푸는 문제입니다.

      #include<stdio.h>
      int main()
      {
        int n, m;
        scanf("%d%d", &n, &m);
        printf("%d %d", m - n, m);
      }
  • N찍기

    • 반복문과 반복문 변수를 활용하는 문제입니다.

      ```c

      include

      int main()

      {

      int n;

      scanf("%d", &n)

      for (int i = 0; i < n; i++)

      {

        printf("%d\n", i + 1);

      }

      }

  • Hello Judge

    • 위 문제와 같습니다.

      #include<stdio.h>
      int main()
      {
        int n;
        scanf("%d", &n)
        for (int i = 0; i < n; i++)
        {
            printf("Hello World, Judge %d!\n", i + 1);
        }
      }
    • 합을 저장할 변수를 만들고 반복문을 통해 합을 구합니다.

      #include<stdio.h>
      int main()
      {
        int sum = 0, n;
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
        {
            sum += i;
        }
        printf("%d", sum);
      }
    • 사실 등차수열의 합 공식을 쓰면 간단히 풀 수 있습니다.

      #include<stdio.h>
      int main()
      {
        int n;
        scanf("%d", &n);
        printf("%d", (n + 1) * n / 2);
      }
  • 구구단

      #include<stdio.h>
      int main()
      {
          int n = 0;
          scanf("%d", &n);
          for (int i = 1; i < 10; i++)
          {
              printf("%d * %d = %d\n", n, i, n * i);
          }
      }
  • 숫자의 합

    • 숫자의 개수가 최대 100개입니다. 따라서 최대 100자리의 숫자를 입력받아야 한다는 뜻입니다.

    • C언어에서 100자리의 숫자를 숫자로 저장할 수 있는 방법이 없습니다.

    • scanf의 서식문자중 %1d를 활용하여 '한자리'씩만 입력받아 합을 더해가는 방법이 있습니다.

      #include <stdio.h>
      int main()
      {
        int n, sum = 0;
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
        {
            int temp;
            scanf("%1d", &temp);
            sum += temp;
        }
        printf("%d", sum);
      }
    • 또는 연속된 숫자들을 문자로 취급하여 저장한 뒤 합을 더해가는 방법이 있습니다.

      #include<stdio.h>
      #include<string.h>
      
      int main()
      {
        int n;
        char s[101];
        scanf("%d%s", &n, s);
      
        int sum = 0;
        for (int i = 0; i < n; i++)
        {
            sum += s[i] - '0';
        }
        printf("%d", sum);
      }
  • 0 = not cute / 1 = cute

    • 정말 다양한 풀이가 있을 수 있습니다.

    • 반복문과 변수를 적절히 사용하여 푸는 문제입니다.

      #include<stdio.h>
      int main()
      {
        int n, tmp, cnt = 0;
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &tmp);
            if (tmp == 1)
            {
                cnt++;
            }
            else
            {
                cnt--;
            }
        }
        if (cnt > 0)
            printf("Junhee is cute!");
        else
            printf("Junhee is not cute!");
      }
    • 조금더 줄일 수 있습니다.

      #include<stdio.h>
      int main()
      {
        int n, tmp, cnt = 0;
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &tmp);
            tmp ? cnt++ : cnt--;
        }
        printf("%s", cnt > 0 ? "Junhee is cute!" : "Junhee is not cute!");
      }
  • X보다 작은 수

    • 알고리즘 문제의 채점은 출력값만 보기 때문에 반복문을 도는 도중에 출력해도 됩니다.

      #include <stdio.h>
      
      int main()
      {
        int n, m;
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)
        {
            int temp;
            scanf("%d",&temp);
            if(temp < m) printf("%d ",temp);
        }
      }
  • 시험 성적

    • 조건문의 구조를 이용하는 문제입니다.

      #include <stdio.h>
      int main()
      {
        int n;
        scanf("%d", &n);
        if (n >= 90)
        {
            printf("A");
        }
        else if (n >= 80)
        {
            printf("B");
        }
        else if (n >= 70)
        {
            printf("C");
        }
        else if (n >= 60)
        {
            printf("D");
        }
        else
            printf("F");
      }
  • 세 수

    • 조건문을 통해 경우의 수를 나눠서 문제를 풉니다.

      #include <stdio.h>
      int main()
      {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        if (a < b)
        {
            //a<b<c
            //c<a<b
            //a<c<b
            if (b < c) printf("%d", b);
            else if (c < a) printf("%d", a);
            else printf("%d", c);
        }
        else
        {
            //b<a
            //c<b<a
            //b<a<c
            //b<c<a
            if (c < b) printf("%d", b);
            else if (a < c) printf("%d", a);
            else printf("%d", c);
        }
      }
  • 최댓값

    • 최댓값을 구하기 위해서는 최댓값을 저장할 변수를 만들고 주어진 자료들을 전부 검사해야 합니다.

      #include <stdio.h>
      int main()
      {
        int max = 0;
        int pos = 0;
        for (int i = 0; i < 9; i++)
        {
            int temp;
            scanf("%d", &temp);
            if (max < temp)
            {
                max = temp;
                pos = i + 1;
            }
        }
        printf("%d\n%d", max, pos);
      }
  • 최소, 최대

    • 최댓값, 최솟값의 초기값은 주어진 자료의 최솟값, 최댓값으로 설정하거나 주어진 자료중 하나를 임의로 선택하여 초기값으로 지정해주는 방법이 있습니다.

      int main()
      {
        int n, temp;
        scanf("%d", &n);
        int max = -1000000;
        int min = 1000000;
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &temp);
            if (max < temp) max = temp;
            if (min > temp) min = temp;
        }
        printf("%d %d", min, max);
      }
      #include <stdio.h>
      int main()
      {
        int n, temp;
        scanf("%d%d", &n, &temp);
        int max = temp;
        int min = temp;
        for (int i = 1; i < n; i++)
        {
            scanf("%d", &temp);
            if (max < temp) max = temp;
            if (min > temp) min = temp;
        }
        printf("%d %d", min, max);
      }
  • 최대공약수와 최소공배수

    • 최대공약수를 구하는 방법은 두 수와 동시에 나누어 떨어지는 수를 반복문을 통해 찾는 방법이 있고 유클리드 호제법이라는 방법을 통해 찾을 수 있습니다.

    • 반복문 이용

      #include <stdio.h>
      int main()
      {
        int a, b;
        scanf("%d%d", &a, &b);
        int c = a > b ? b : a;
        int gcd;
        for (int i = c; i >= 1; i--)
        {
            if (a % i == 0 && b % i == 0)
            {
                gcd = i;
                break;
            }
        }
        printf("%d\n%d", gcd, a * b / gcd);
      }
    • 유클리드 호제법 이용

      #include <stdio.h>
      
      int gcd(int a, int b)
      {
        if (b == 0) return a;
        return gcd(b, a % b);
      }
      
      int main()
      {
        int a, b;
        scanf("%d%d", &a, &b);
        int c = gcd(a, b);
        printf("%d\n%d", c, a * b / c);
      }
  • 팩토리얼

    • 합을 구하는 문제와 비슷하지만 0!=1 임을 조심해야 합니다.

      #include <stdio.h>
      int main()
      {
        int n, ans = 1;
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
        {
            ans *= i;
        }
        printf("%d", ans);
      }
  • 2의 제곱인가?

    • 이 문제는 정말 다양한 풀이가 있습니다.

    • 2로 계속 나누다가 나머지가 있다면 2의 제곱이 아님

      #include <stdio.h>
      int main()
      {
        int n;
        scanf("%d", &n);
        while (n > 1)
        {
            if (n % 2)
            {
                printf("0");
                return 0;
            }
            n /= 2;
        }
        printf("1");
      }
    • 2의 제곱수를 만들어가다가 입력값보다 커지면 제곱수 아님 일치하면 2의 제곱수

      #include <stdio.h>
      int main()
      {
        int n;
        scanf("%d", &n);
        for (int i = 1; i <= n; i *= 2)
        {
            if (i == n)
            {
                printf("1");
                return 0;
            }
        }
        printf("0");
      }
    • 컴퓨터공학에서 2는 특별한 수 입니다. 컴퓨터는 숫자들을 2진수로 저장합니다. 따라서 2진수의 성질을 이용해서 풀 수 있습니다.

    • 2의 제곱수는 이진수로 나타내면 모두 100 1000 10000 의 형태를 가집니다. 따라서 2의 제곱수&2의 제곱수-1 을 하면 100 & 011 = 0 이런 식으로 모두 0이 됩니다.

      #include<stdio.h>
      int main()
      {
        int n;
        scanf("%d", &n);
        printf("%d", n&(n - 1) ? 0 : 1);
      }
  • 별찍기 - 1

    • 중첩 반복문을 사용하는 문제입니다.

      #include <stdio.h>
      int main()
      {
        int n;
        scanf("%d", &n);
        for (int j = 0; j < n; j++)
        {
            for (int i = 0; i < j + 1; i++)
            {
                printf("*");
            }
            printf("\n");
        }
      }
  • 히스토그램

    • 수를 입력받고 그만큼 출력합니다.

      #include <stdio.h>
      int main()
      {
        int n;
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
        {
            int m;
            scanf("%d", &m);
            for (int j = 0; j < m; j++)
            {
                printf("=");
            }
            printf("\n");
        }
      }

3강 문제

  • 수 뒤집기

    • 수를 뒤집는 테크닉과 변수를 활용하는 조금 복잡한 문제입니다. 함수를 활용하면 더 편하게 풀 수 있습니다.

    • 변수의 이름을 헷갈리게 지으면 안되고 초기화를 꼭 잘 해줘야 합니다.

      #include<stdio.h>
      int main()
      {
        int t;
        scanf("%d", &t);
        while (t--)
        {
            int n;
            scanf("%d", &n);
      
            int rev_n = 0;
            int temp = n;
            while (temp > 0)
            {
                rev_n *= 10;
                rev_n += temp % 10;
                temp /= 10;
            }
      
            int sum = n + rev_n;
      
            int rev_sum = 0;
            temp = sum;
            while (temp > 0)
            {
                rev_sum *= 10;
                rev_sum += temp % 10;
                temp /= 10;
            }
      
            if (sum == rev_sum) printf("YES\n");
            else printf("NO\n");
        }
      }
    • 함수 활용

      #include <stdio.h>
      int rev(int n)
      {
        int res = 0;
        while (n > 0)
        {
            res = res * 10 + n % 10;
            n /= 10;
        }
        return res;
      }
      
      int main()
      {
        int t;
        scanf("%d", &t);
        while (t--)
        {
            int n;
            scanf("%d", &n);
            int sum = n + rev(n);
            printf("%s\n", sum == rev(sum) ? "YES" : "NO");
        }
      }
  • 이진수

    • 10진수를 2진수로 변환하는 과정을 이해하면 풀기 쉽습니다.

      #include <stdio.h>
      int main()
      {
        int t;
        scanf("%d", &t);
        while (t--)
        {
            int n, cnt = 0;
            scanf("%d", &n);
            while (n > 0)
            {
                if (n % 2) printf("%d ", cnt);
                n /= 2;
                cnt++;
            }
            printf("\n");
        }
      }
  • A+B-3

    • 단순 반복문 문제입니다.

      #include <stdio.h>
      
      int main()
      {
        int n, a, b;
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
        {
            scanf("%d %d", &a, &b);
            printf("%d\n", a+b);
        }
      }
  • 짝수를 찾아라

    • 중첩 반복문 + 변수 활용

      #include <stdio.h>
      int main()
      {
        int t;
        scanf("%d", &t);
        while (t--)
        {
            int min = 100, sum = 0;
            for (int i = 0; i < 7; i++)
            {
                int temp;
                scanf("%d", &temp);
                if (temp % 2 == 0)
                {
                    sum += temp;
                    if (temp < min) min = temp;
                }
            }
            printf("%d %d\n", sum, min);
        }
      }
  • 별 찍기 - 2

    • 별도 찍고 공백도 찍어야 합니다.

      #include<stdio.h>
      int main()
      {
        int n;
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
        {
            //공백 출력부분
            for (int j = 0; j < n - i - 1; j++)
            {
                printf(" ");
            }
            //별 출력 부분
            for (int j = 0; j < 1 + i; j++)
            {
                printf("*");
            }
            printf("\n");
        }
      }
  • 별찍기 - 5

    • 별을 찍기 위해 반복을 몇 번 해야하는지 잘 생각해야 합니다.

      #include<stdio.h>
      int main()
      {
        int n;
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
        {
            //공백 출력부분
            for (int j = 0; j < n - i - 1; j++)
            {
                printf(" ");
            }
            //별 출력 부분
            for (int j = 0; j < 2 * i + 1; j++)
            {
                printf("*");
            }
            printf("\n");
        }
      }
  • 숫자의 개수

    • %연산자를 이용해 숫자를 한자리씩 다룰 수 있습니다.

    • 배열을 활용해 연속된 정보를 저장합니다.

      #include <stdio.h>
      int main()
      {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        int n = a * b * c;
      
        int check[10] = { 0, };
        while (n > 0)
        {
            check[n % 10]++;
            n /= 10;
        }
      
        for (int i = 0; i < 10; i++) printf("%d\n", check[i]);
      }
  • 음계

    • 배열의 오름차순, 내림차순을 검사하는 테크닉이 필요합니다.

      #include<stdio.h>
      int main()
      {
        int arr[8];
        for (int i = 0; i < 8; i++)
            scanf("%d", &arr[i]);
      
        //오름차순 판단 맞으면 출력 후 return 0
        int check = 1;
        for (int i = 0; i < 7; i++)
        {
            if (arr[i] > arr[i + 1])
            {
                check = 0;
                break;
            }
        }
        if (check)
        {
            printf("ascending");
            return 0;
        }
      
        //내림차순 판단 맞으면 출력 후 return 0
        check = 1;
        for (int i = 0; i < 7; i++)
        {
            if (arr[i] < arr[i + 1])
            {
                check = 0;
                break;
            }
        }
        if (check)
        {
            printf("descending");
            return 0;
        }
        else printf("mixed");
      }
  • 피보나치 수 5

    • 배열을 이용해서 피보나치의 값을 저장하고 이전에 저장한 값을 활용하여 나머지 값을 계산합니다.

      #include <stdio.h>
      int main()
      {
        int fibo[21] = { 0,1 };
        for (int i = 2; i <= 20; i++)
        {
            fibo[i] = fibo[i - 1] + fibo[i - 2];
        }
      
        int n;
        scanf("%d", &n);
        printf("%d", fibo[n]);
      }
  • 수 정렬하기

    • 배열을 정렬하는 여러 방법이 있습니다.

    • 버블소트를 이용해 문제를 풀 수 있습니다. 버블소트는 모든 수를 서로 비교해서 정렬하는 방법입니다.

      #include<stdio.h>
      int main()
      {
        int n;
        scanf("%d", &n);
      
        int arr[1000];
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &arr[i]);
        }
      
        for (int i = 0; i < n; i++)
        {
            for (int j = i + 1; j < n; j++)
            {
                if (arr[i] > arr[j])
                {
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
      
        for (int i = 0; i < n; i++)
        {
            printf("%d\n", arr[i]);
        }
      }
  • 열 개씩 끊어 출력하기

    • 문자열을 받고 문자열을 순회하면서 한문자씩 출력하고 10개를 출력했을 때 줄바꿈을 출력합니다.

    • strlen() 함수는 문자열의 길이만큼 시간이 걸리기 때문에 반복문 내부에 넣으면 안됩니다.

      #include <stdio.h>
      #include <string.h>
      int main()
      {
        char A[100];
        gets(A);
        int len = strlen(A);
        for (int i = 0; i < len; i++)
        {
            printf("%c", A[i]);
            if ((i+1) % 10 == 0) printf("\n");
        }
      }
  • 문자열 반복

    • 문자열을 받고 문자열을 순회하면서 한 문자를 반복문을 통해 여러번 출력합니다.

      #include <stdio.h>
      #include <string.h>
      int main()
      {
        int n1, n2;
        char A[21];
        scanf("%d",&n1);
      
        for(int i=0;i<n1;i++)
        {    
            scanf("%d %s",&n2,A);
            for(int j=0;j<strlen(A);j++)
            {
                for(int k=0;k<n2;k++)
                {
                    printf("%c",A[j]);
                }
            }
            printf("\n");
        }
      }
  • 그대로 출력하기

    • 서식문자 "%"를 이용해서 한 줄을 전부 입력받습니다.

    • "%"는 줄바꿈을 입력받지 않기 때문에 버퍼에 줄바꿈을 남김니다. 따라서 getchar()를 통해 줄바꿈을 버퍼에서 입력받아서 없애줘야 합니다.

      #include<stdio.h>
      int main()
      {
        char s[100];
        while (scanf("%[^\n]", s) != EOF)
        {
            printf("%s\n", s);
            getchar();
        }
      
      }
  • 알파벳 찾기

    • 문자열을 입력받고 순회하면서 처음 나온 알파벳의 위치를 배열에 저장합니다.

      #include <stdio.h>
      #include <string.h>
      int main()
      {
        int A[26];
        char Word[100];
        for (int i = 0; i<26; i++)
        {
            A[i] = -1;
        }
      
        scanf("%s", Word);
        int len = strlen(Word)
        for (int i = 0; i < len; i++)
        {
            if(A[Word[i] - 'a']==-1)A[Word[i] - 'a'] = i;
        }
      
        for (int i = 0; i<26; i++)
        {
            printf("%d ", A[i]);
        }
      }
  • IBM 빼기 1

    • 문자열을 입력받고 순회하면서 문자에 1을 더한 뒤 출력합니다. 만약 문자가 Z라면 A로 출력합니다

      #include <stdio.h>
      #include <string.h>
      int main()
      {
        int n;
        scanf("%d", &n);
        for (int t = 1; t <= n; t++)
        {
            printf("String #%d\n", t);
            char s[51];
            scanf("%s", s);
            int len = strlen(s);
            for (int i = 0; i < len; i++)
            {
                if (s[i] == 'Z') printf("A");
                else printf("%c", s[i] + 1);
            }
            printf("\n\n");
        }
      }
  • OX퀴즈

    • 변수를 잘 활용해야 하는 문제입니다.

    • OX를 문자열로 받고 순회하면서 O가 등장할 때마다 카운트를 해줍니다.

      #include <stdio.h>
      #include <string.h>
      int main()
      {
        int t;
        char s[81];
        scanf("%d", &t);
        while(t--)
        {
            int cnt = 0, ans = 0;
            scanf("%s", s);
            int len = strlen(s);
            for (int j = 0; j < len; j++)
            {
                if (s[j] == 'O')
                {
                    cnt += 1;
                    ans += cnt;
                }
                else cnt = 0;
            }
            printf("%d\n", ans);
        }
      }
  • 단어 공부

    • 대소문자 구분 없이 알파벳의 개수를 세고 최댓값과 그 위치를 찾아야 하는 문제입니다. 조금 복잡할 수 있습니다.

      #include<stdio.h>
      #include<string.h>
      
      int main()
      {
        char s[1000001];
        scanf("%s", s);
      
        int len = strlen(s);
        for (int i = 0; i < len; i++)
        {
            if (s[i] >= 'A' && s[i] <= 'Z')
                s[i] = s[i] - 'A' + 'a';
        }
      
        int alpha[26] = { 0 };
        for (int i = 0; i < len; i++)
        {
            alpha[s[i] - 'a']++;
        }
      
        int max = 0, pos = 0;
        for (int i = 0; i < 26; i++)
        {
            if (max < alpha[i])
            {
                max = alpha[i];
                pos = i;
            }
        }
      
        int cnt = 0;
        for (int i = 0; i < 26; i++)
        {
            if (alpha[i] == max) cnt++;
        }
      
        if (cnt > 1) printf("?");
        else
        {
            printf("%c", pos + 'A');
        }
      }
  • !밀비 급일

    • 서식문자 "%"를 이용해서 한 줄을 전부 입력받습니다. 그다음 문자열을 거꾸로 순회하면서 출력해주면 됩니다. 또는 배열 뒤집기를 쓸 수도 있습니다.

    • getchar를 해주는 것을 잊지 말아야 합니다.

      #include <stdio.h>
      #include <string.h>
      
      int main()
      {
        char S[502];
        while (1)
        {
            scanf(" %[^\n]", S);
            if (S[0] == 'E'&&S[1] == 'N'&&S[2] == 'D') return 0;
            int len = strlen(S);
      
            for (int i = 0; i < len / 2; i++)
            {
                char temp = S[i];
                S[i] = S[len - i - 1];
                S[len - i - 1] = temp;
            }
            printf("%s\n", S);
        }
      }
      #include <stdio.h>
      #include <string.h>
      int main()
      {
        char s[502];
        while (1)
        {
            scanf(" %[^\n]", s);
            if (s[0] == 'E' && s[1] == 'N' && s[2] == 'D') return 0;
            int len = strlen(s);
      
            for (int i = len - 1; i >= 0; i--)
            {
                printf("%c", s[i]);
            }
            printf("\n");
        }
      }
  • 팰린드롬

    • 서식문자 "%"를 이용해서 한 줄을 전부 입력받습니다. 반복문을 통해 문자열의 앞과 뒤가 계속해서 일치하는지 검사하면 됩니다. 대소문자를 구분하지 않기 때문에 대문자는 소문자로 바꿔주거나 소문자를 대문자로 바꿔줍시다.

    • 주의할 점은 scanf("%d")를 쓸 때도 버퍼에 줄바꿈이 남기 때문에 getchar를 써줘야 합니다.

      #include <stdio.h>
      #include <string.h>
      int main()
      {
        int t;
        char s[101];
        scanf("%d", &t);
        getchar();
        while (t--)
        {
            scanf("%[^\n]", s);
            getchar();
            int len = strlen(s);
      
            for (int i = 0; i < len; i++)
            {
                if (s[i] >= 'A' && s[i] <= 'Z') s[i] = s[i] - 'A' + 'a';
            }
      
            bool flag = 1;
            for (int i = 0; i < len / 2; i++)
            {
                if (s[i] != s[len - i - 1])
                {
                    printf("No\n");
                    flag = 0;
                    break;
                }
            }
            if (flag) printf("Yes\n");
        }
      }

Last updated

Was this helpful?