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강 문제
수 뒤집기
수를 뒤집는 테크닉과 변수를 활용하는 조금 복잡한 문제입니다. 함수를 활용하면 더 편하게 풀 수 있습니다.
변수의 이름을 헷갈리게 지으면 안되고 초기화를 꼭 잘 해줘야 합니다.
함수 활용
이진수
10진수를 2진수로 변환하는 과정을 이해하면 풀기 쉽습니다.
A+B-3
단순 반복문 문제입니다.
짝수를 찾아라
중첩 반복문 + 변수 활용
별 찍기 - 2
별도 찍고 공백도 찍어야 합니다.
별찍기 - 5
별을 찍기 위해 반복을 몇 번 해야하는지 잘 생각해야 합니다.
숫자의 개수
%연산자를 이용해 숫자를 한자리씩 다룰 수 있습니다.
배열을 활용해 연속된 정보를 저장합니다.
음계
배열의 오름차순, 내림차순을 검사하는 테크닉이 필요합니다.
피보나치 수 5
배열을 이용해서 피보나치의 값을 저장하고 이전에 저장한 값을 활용하여 나머지 값을 계산합니다.
수 정렬하기
배열을 정렬하는 여러 방법이 있습니다.
버블소트를 이용해 문제를 풀 수 있습니다. 버블소트는 모든 수를 서로 비교해서 정렬하는 방법입니다.
열 개씩 끊어 출력하기
문자열을 받고 문자열을 순회하면서 한문자씩 출력하고 10개를 출력했을 때 줄바꿈을 출력합니다.
strlen() 함수는 문자열의 길이만큼 시간이 걸리기 때문에 반복문 내부에 넣으면 안됩니다.
문자열 반복
문자열을 받고 문자열을 순회하면서 한 문자를 반복문을 통해 여러번 출력합니다.
그대로 출력하기
서식문자 "%"를 이용해서 한 줄을 전부 입력받습니다.
"%"는 줄바꿈을 입력받지 않기 때문에 버퍼에 줄바꿈을 남김니다. 따라서 getchar()를 통해 줄바꿈을 버퍼에서 입력받아서 없애줘야 합니다.
알파벳 찾기
문자열을 입력받고 순회하면서 처음 나온 알파벳의 위치를 배열에 저장합니다.
IBM 빼기 1
문자열을 입력받고 순회하면서 문자에 1을 더한 뒤 출력합니다. 만약 문자가 Z라면 A로 출력합니다
OX퀴즈
변수를 잘 활용해야 하는 문제입니다.
OX를 문자열로 받고 순회하면서 O가 등장할 때마다 카운트를 해줍니다.
단어 공부
대소문자 구분 없이 알파벳의 개수를 세고 최댓값과 그 위치를 찾아야 하는 문제입니다. 조금 복잡할 수 있습니다.
!밀비 급일
서식문자 "%"를 이용해서 한 줄을 전부 입력받습니다. 그다음 문자열을 거꾸로 순회하면서 출력해주면 됩니다. 또는 배열 뒤집기를 쓸 수도 있습니다.
getchar를 해주는 것을 잊지 말아야 합니다.
팰린드롬
서식문자 "%"를 이용해서 한 줄을 전부 입력받습니다. 반복문을 통해 문자열의 앞과 뒤가 계속해서 일치하는지 검사하면 됩니다. 대소문자를 구분하지 않기 때문에 대문자는 소문자로 바꿔주거나 소문자를 대문자로 바꿔줍시다.
주의할 점은 scanf("%d")를 쓸 때도 버퍼에 줄바꿈이 남기 때문에 getchar를 써줘야 합니다.
Last updated
Was this helpful?