백준#
2884, 25304, 1152, 10988, 2738, 10807, 10818, 10810, 5597
2884 ↗#
상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다.
상근이는 모든 방법을 동원해보았지만, 조금만 더 자려는 마음은 그 어떤 것도 없앨 수가 없었다.
이런 상근이를 불쌍하게 보던 창영이는 자신이 사용하는 방법을 추천해 주었다.
바로 45분 일찍 알람 설정하기이다.
이 방법은 단순하다. 원래 설정되어 있는 알람을 45분 앞서는 시간으로 바꾸는 것이다. 어차피 알람 소리를 들으면, 알람을 끄고 조금 더 잘 것이기 때문이다. 이 방법을 사용하면, 매일 아침 더 잤다는 기분을 느낄 수 있고, 학교도 지각하지 않게 된다.
현재 상근이가 설정한 알람 시각이 주어졌을 때, 창영이의 방법을 사용한다면, 이를 언제로 고쳐야 하는지 구하는 프로그램을 작성하시오.
#include <stdio.h>
int main() {
int h, m; // integer형으로 h(시간)과 m(분) 선언
scanf("%d %d", &h, &m); // 사용자로부터 시간과 분을 입력받음
m -= 45; // 분에서 45를 빼줌
if (m < 0) { // 만약 분이 음수가 되면
m += 60; // 분에 60을 더해서 음수를 양수로 바꿔줌
h -= 1; // 시간에서 1을 빼줌
}
if (h < 0) h += 24; // 만약 시간이 음수가 되면 24를 더해서 양수로 바꿔줌
printf("%d %d", h, m); // 최종적으로 계산된 시간과 분을 출력
}c시간과 분을 입력받아서 45분을 빼주면 되는 간단한 문제에요.
사용자로부터 시간과 분을 입력받고 분에서 45분을 빼고 만약 분이 음수가 된다면 분에 60분을 더해주고 시간에서 1시간을 빼와요.
만약 시간이 음수가 된다면 시간에 24시간을 더해주는 방식의 프로그램이에요.

25304 ↗#
준원이는 저번 주에 살면서 처음으로 코스트코를 가 봤다. 정말 멋졌다. 그런데, 몇 개 담지도 않았는데 수상하게 높은 금액이 나오는 것이다! 준원이는 영수증을 보면서 정확하게 계산된 것이 맞는지 확인해보려 한다.
영수증에 적힌,
- 구매한 각 물건의 가격과 개수
- 구매한 물건들의 총 금액
을 보고, 구매한 물건의 가격과 개수로 계산한 총 금액이 영수증에 적힌 총 금액과 일치하는지 검사해보자.
#include <stdio.h>
int main() {
int total, count; // integer형으로 total(총 금액)과 count(구매한 물건의 종류 수) 선언
scanf("%d", &total); // 사용자로부터 총 금액을 입력받음
scanf("%d", &count); // 사용자로부터 구매한 물건의 종류 수를 입력받음
int sum = 0; // sum이라는 변수를 0으로 초기화
for (int i = 0; i < count; i++) { // count만큼 반복
int price, eachcountidonthaveideathisvariablename; // integer형으로 price(물건의 가격)과 eachcountidonthaveideathisvariablename(물건의 개수) 선언
scanf("%d %d", &price, &eachcountidonthaveideathisvariablename); // 사용자로부터 물건의 가격과 개수를 입력받음
sum += price * eachcountidonthaveideathisvariablename; // sum에 물건의 가격과 개수를 곱한 값을 더해줌
}
if (sum == total) { // 만약 sum이 total과 같다면
printf("Yes"); // "Yes"를 출력
} else printf("No"); // 그렇지 않다면 "No"를 출력
}c총 금액과 구매한 물건의 종류 수를 입력받고 각 물건의 가격과 개수를 입력받아서 총 금액을 계산하는 프로그램이에요.
각 물건의 가격과 개수를 곱해서 sum에 더해주고 최종적으로 sum이 total과 같은지 비교해서 “Yes” 또는 “No”를 출력하는 방식이에요.

1152 ↗#
영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.
#include <stdio.h>
int main() {
char text[1000001]; // 문자열을 저장할 배열 선언 1000000자까지 입력받을 수 있도록 크기를 설정
int count = 0; // 단어의 개수를 세기 위한 변수 count를 0으로 초기화
while(scanf("%s", text) == 1) { // 문자열을 입력받는 동안 반복
count++; // 단어가 하나씩 입력될 때마다 count를 1 증가시킴
}
printf("%d", count); // 최종적으로 단어의 개수를 출력
}c문자열을 입력받아서 단어의 개수를 세는 프로그램이에요.
scanf(“%s”, text)를 사용해서 문자열을 입력받는데, scanf는 공백을 기준으로 문자열을 읽기 때문에 단어 단위로 입력받게 돼요.
입력받은 단어가 있을 때마다 count를 1씩 증가시키고 최종적으로 count를 출력하는 방식이에요.

10988 ↗#
알파벳 소문자로만 이루어진 단어가 주어진다. 이때, 이 단어가 팰린드롬인지 아닌지 확인하는 프로그램을 작성하시오.
팰린드롬이란 앞으로 읽을 때와 거꾸로 읽을 때 똑같은 단어를 말한다.
level, noon은 팰린드롬이고, baekjoon, online, judge는 팰린드롬이 아니다.
#include <stdio.h>
int main() {
char text[1001]; // 문자열을 저장할 배열 선언 1000자까지 입력받을 수 있도록 크기를 설정
scanf("%s", text); // 사용자로부터 문자열을 입력받음
int length = 0; // 문자열의 길이를 저장할 변수 length를 0으로 초기화
while (text[length] != '\0') { // 문자열의 끝까지 반복
length++; // 문자열의 길이를 1 증가시킴
}
int wow = 1; // 팰린드롬 여부를 저장할 변수 wow를 1로 초기화 (1은 팰린드롬, 0은 팰린드롬이 아님)
for (int i = 0; i < length / 2; i++) { // 문자열의 절반까지만 반복
if (text[i] != text[length - i - 1]) { // 만약 현재 문자와 대칭되는 문자가 다르다면
printf("0"); // 팰린드롬이 아니라면 0을 출력
return 0;
}
}
printf("1"); // 팰린드롬이라면 1을 출력
}c문자열을 입력받아서 팰린드롬인지 확인하는 프로그램이에요.
문자열의 길이를 계산하고 문자열의 절반까지만 반복하면서 현재 문자와 대칭되는 문자가 같은지 비교해요.
만약 다르다면 0을 출력하고 프로그램을 종료해서 팰린드롬이 아님을 표시하고 모든 문자가 같다면 1을 출력해서 팰린드롬임을 표시하는 방식이에요.

2738 ↗#
N*M크기의 두 행렬 A와 B가 주어졌을 때, 두 행렬을 더하는 프로그램을 작성하시오.
#include <stdio.h>
int main() {
int N, M; // 행렬의 크기를 저장할 변수 N과 M 선언
scanf("%d %d", &N, &M); // 사용자로부터 행렬의 크기를 입력받음
int A[N][M], B[N][M], C[N][M]; // 행렬 A, B, C를 선언 (C는 A와 B의 합을 저장할 행렬)
for (int i = 0; i < N; i++) { // 행렬 A를 입력받음
for (int j = 0; j < M; j++) {
scanf("%d", &A[i][j]);
}
}
for (int i = 0; i < N; i++) { // 행렬 B를 입력받음
for (int j = 0; j < M; j++) {
scanf("%d", &B[i][j]);
}
}
for (int i = 0; i < N; i++) { // 행렬 A와 B를 더해서 행렬 C에 저장
for (int j = 0; j < M; j++) {
C[i][j] = A[i][j] + B[i][j];
printf("%d ", C[i][j]); // 행렬 C의 값을 출력
}
}
}c행렬의 크기를 입력받고 두 행렬 A와 B를 입력받아서 A와 B를 더한 결과를 행렬 C에 저장하는 프로그램이에요.
각 행렬의 값를 입력받고 A와 B의 각 값를 더해서 C에 저장한 후 C의 값를 출력하는 방식이에요.

10807 ↗#
총 N개의 정수가 주어졌을 때, 정수 v가 몇 개인지 구하는 프로그램을 작성하시오.
#include <stdio.h>
int main() {
int N; // 정수의 개수를 저장할 변수 N 선언
scanf("%d", &N); // 사용자로부터 정수의 개수를 입력받음
int arr[N]; // 정수들을 저장할 배열 arr 선언
for (int i; i < N; i++) { // N개의 정수를 입력받아서 배열 arr에 저장
scanf("%d", &arr[i]); // 사용자로부터 정수를 입력받음
}
int v; // 찾고자 하는 정수를 저장할 변수 v 선언
scanf("%d", &v); // 사용자로부터 찾고자 하는 정수를 입력받음
int count = 0; // v와 같은 정수의 개수를 세기 위한 변수 count를 0으로 초기화
for (int i = 0; i < N; i++) { // 배열 arr을 순회하면서 v와 같은 정수가 몇 개인지 세는 반복문
if (arr[i] == v) count++; // 만약 현재 값이 v와 같다면 count를 1 증가시킴
}
printf("%d", count); // 최종적으로 v와 같은 정수의 개수를 출력
}c입력받을 정수의 갯수를 N에 입력받고 N개의 정수를 배열에 입력받아요.
그리고 찾고자 하는 정수 v를 입력받아서 배열을 순회하면서 v와 같은 정수가 몇 개인지 count하는 프로그램이에요.
배열의 각 값를 v와 비교해서 같다면 count를 1 증가시키고 최종적으로 count를 출력하는 방식이에요.

10818 ↗#
N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.
#include <stdio.h>
int main() {
int N; // 정수의 개수를 저장할 변수 N 선언
scanf("%d", &N); // 사용자로부터 정수의 개수를 입력받음
int arr[N]; // 정수들을 저장할 배열 arr 선언
for (int i; i < N; i++) { // N개의 정수를 입력받아서 배열 arr에 저장
scanf("%d", &arr[i]);
}
int min = arr[0], max = arr[0]; // 배열의 첫 번째 값를 min과 max로 초기화
for (int i = 1; i < N; i++) { // 배열의 나머지 값를 순회하면서 최솟값과 최댓값을 찾는 반복문
if (arr[i] < min) min = arr[i]; // 만약 현재 값이 min보다 작다면 min을 현재 값로 업데이트
if (arr[i] > max) max = arr[i]; // 만약 현재 값이 max보다 크다면 max를 현재 값로 업데이트
}
printf("%d %d", min, max); // 최종적으로 min과 max를 출력
}cN개의 정수를 입력받아서 배열에 저장하고 배열을 순회하면서 최솟값과 최댓값을 찾는 프로그램이에요.
배열의 첫 번째 값를 min과 max로 초기화하고 배열의 나머지 값를 순회하면서 현재 값이 min보다 작다면 min을 현재 값로 업데이트하고 현재 값이 max보다 크다면 max를 현재 값로 업데이트하는 방식이에요.
최종적으로 min과 max를 출력하는 방식이에요.

10810 ↗#
도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 또, 1번부터 N번까지 번호가 적혀있는 공을 매우 많이 가지고 있다. 가장 처음 바구니에는 공이 들어있지 않으며, 바구니에는 공을 1개만 넣을 수 있다.
도현이는 앞으로 M번 공을 넣으려고 한다. 도현이는 한 번 공을 넣을 때, 공을 넣을 바구니 범위를 정하고, 정한 바구니에 모두 같은 번호가 적혀있는 공을 넣는다. 만약, 바구니에 공이 이미 있는 경우에는 들어있는 공을 빼고, 새로 공을 넣는다. 공을 넣을 바구니는 연속되어 있어야 한다.
공을 어떻게 넣을지가 주어졌을 때, M번 공을 넣은 이후에 각 바구니에 어떤 공이 들어 있는지 구하는 프로그램을 작성하시오.
#include <stdio.h>
int main() {
int N, M; // 바구니의 개수 N과 공을 넣는 횟수 M을 저장할 변수 N과 M 선언
scanf("%d %d", &N, &M); // 사용자로부터 바구니의 개수와 공을 넣는 횟수를 입력받음
int baskets[M][3]; // 공을 넣는 작업을 저장할 2차원 배열 baskets 선언 M행 3열 (각 행은 공을 넣는 작업을 나타냄, 열은 시작 바구니 번호, 끝 바구니 번호, 공의 번호를 저장)
for (int i = 0; i < M; i++) { // M번의 공을 넣는 작업을 입력받아서 배열 baskets에 저장하는 반복문
scanf("%d %d %d", &baskets[i][0], &baskets[i][1], &baskets[i][2]); // 사용자로부터 공을 넣는 작업의 시작 바구니 번호, 끝 바구니 번호, 공의 번호를 입력받아서 배열 baskets에 저장
}
int counts[N]; // 각 바구니에 어떤 공이 들어있는지 저장할 배열 counts 선언 N개의 바구니에 대한 정보를 저장하기 위해 크기를 N으로 설정
for (int i = 0; i < N; i++) { // counts 배열을 0으로 초기화하는 반복문
counts[i] = 0; // 각 바구니에 공이 들어있지 않음을 나타내기 위해 0으로 초기화
}
for (int i = 0; i < M; i++) { // M번의 공을 넣는 작업을 순회하면서 각 작업에서 지정된 범위의 바구니에 해당하는 공의 번호를 counts 배열에 저장하는 반복문
for (int j = baskets[i][0] - 1; j < baskets[i][1]; j++) { // 현재 작업에서 지정된 범위의 바구니를 순회하는 반복문 (baskets[i][0] - 1부터 baskets[i][1]까지)
counts[j] = baskets[i][2]; // 현재 작업에서 지정된 범위의 바구니에 해당하는 공의 번호를 counts 배열에 저장 (baskets[i][2]는 공의 번호)
}
}
for (int i = 0; i < N; i++) { // 최종적으로 counts 배열을 출력하는 반복문
printf("%d ", counts[i]); // 각 바구니에 어떤 공이 들어있는지 출력 (counts[i]는 i번째 바구니에 들어있는 공의 번호)
}
}cN개의 바구니와 M번의 공을 넣는 작업을 입력받아서 각 바구니에 어떤 공이 들어있는지 출력하는 프로그램이에요.
M번의 공을 넣는 작업을 2차원 배열에 저장하고 각 바구니에 어떤 공이 들어있는지 저장할 counts 배열을 초기화한 후 M번의 작업을 순회하면서 각 작업에서 지정된 범위의 바구니에 해당하는 공의 번호를 counts 배열에 저장하는 방식이에요.
최종적으로 counts 배열을 출력하는 방식이에요.

5597 ↗#
X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다.
교수님이 내준 특별과제를 28명이 제출했는데, 그 중에서 제출 안 한 학생 2명의 출석번호를 구하는 프로그램을 작성하시오.
#include <stdio.h>
int main() {
int submitted[30] = {0}; // 제출한 학생을 표시할 배열
for (int i = 0; i < 28; i++) {
int num;
scanf("%d", &num);
submitted[num - 1] = 1; // 제출한 학생 표시
}
for (int i = 0; i < 30; i++) {
if (!submitted[i]) {
printf("%d\n", i + 1); // 제출하지 않은 학생 출력
}
}
return 0;
}csubmitted 배열을 사용해서 제출한 학생을 표시하는 프로그램이에요.
28명의 학생이 제출한 출석번호를 입력받아서 submitted 배열의 해당 인덱스를 1로 설정하고 submitted 배열을 순회하면서 0인 인덱스의 출석번호를 출력하는 방식이에요.

Codeup#
1402, 1405 , 1409 , 1024 , 1460 , 1805 , 4012
Codeup 문제들은 풀이과정이 제공되지 않습니다.
1402 ↗#
#include <stdio.h>
int main() {
int count;
scanf("%d", &count);
int arr[count];
for (int i = 0; i < count; i++) {
scanf("%d", &arr[i]);
}
for (int i = count - 1; i >= 0; i--) {
printf("%d ", arr[i]);
}
}c
1405 ↗#
#include <stdio.h>
int main() {
int count;
scanf("%d", &count);
int arr[count];
for (int i = 0; i < count; i++) {
scanf("%d", &arr[i]);
}
for (int i = 0; i < count; i++) {
for (int j = 0; j < count; j++) {
printf("%d ", arr[(i+j)%count]);
}
printf("\n");
}
}c생각이 잘 안나서 과거에 풀었던 Python 코드를 변환했습니다.
ns = list(map(int, input().split()))
n = len(ns)
for i in range(n):
print(*[ns[(i + j) % n] for j in range(n)])py
1409 ↗#
#include <stdio.h>
int main() {
int arr[10];
for (int i = 0; i < 10; i++) {
scanf("%d", &arr[i]);
}
int find;
scanf("%d", &find);
printf("%d", arr[find-1]);
}c
1024 ↗#
#include <stdio.h>
int main() {
char text[21];
scanf("%s", text);
for (int i = 0; text[i] != '\0'; i++) {
printf("'%c'\n", text[i]);
}
return 0;
}c
1460 ↗#
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
// 이걸 왜 2차원 배열 문제지
int arr[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
arr[i][j] = i * n + j + 1;
printf("%d ", arr[i][j]);
}
printf("\n");
}
}c
1805 ↗#
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
int arr[n][2];
for (int i = 0; i < n; i++) {
scanf("%d %d", &arr[i][0], &arr[i][1]);
}
for (int i = 0; i < n; i++) {
int min_index = i;
for (int j = i + 1; j < n; j++) if (arr[j][0] < arr[min_index][0]) min_index = j;
int t[2] = {arr[i][0], arr[i][1]};
arr[i][0] = arr[min_index][0];
arr[i][1] = arr[min_index][1];
arr[min_index][0] = t[0];
arr[min_index][1] = t[1];
printf("%d %d\n", arr[i][0], arr[i][1]);
}
}c
4012 ↗#
#include <stdio.h>
int main() {
int count;
scanf("%d", &count);
int students[count];
for (int i = 0; i < count; i++) {
scanf("%d", &students[i]);
}
int rank;
for (int i = 0; i < count; i++) {
rank = 1;
for (int j = 0; j < count; j++) {
if (students[i] < students[j]) rank++;
}
printf("%d ", rank);
}
}c