이번 알고리즘 문제 풀이는 C로 진행했습니다
코드에 오탈자나 문제가 있으면 언제든지 댓글로 알려주세요!
A. 1차원 배열
1. 개수 세기
a. 문제지 : 10807
b. 정답
📚 풀이
#include <iostream>
int main() {
int N;
scanf("%d", &N); // 정수의 개수
int arr[N];
for (int i = 0; i < N; ++i) {
scanf("%d", &arr[i]); // 정수 입력
}
int v;
scanf("%d", &v); // 찾으려는 정수
int count = 0;
for (int i = 0; i < N; ++i) {
if (arr[i] == v) {
count++;
}
}
printf("%d\n", count); // 결과 출력
return 0;
}
2. X보다 작은 수
a. 문제지 : 10871
b. 정답
📚 풀이
#include <cstdio>
int main() {
int N, X;
scanf("%d %d", &N, &X);
for (int i = 0; i < N; i++) {
int num;
scanf("%d", &num); // 수열 입력
if (num < X) {
printf("%d ", num); // X보다 작은 수 출력
}
}
return 0;
}
3. 최소, 최대
a. 문제지 : 10818
b. 정답
📚 풀이
#include <stdio.h>
int main() {
int N, A, B = 0, S = 0; // N: 입력 받을 숫자의 개수, A: 입력 받은 숫자, B: 최댓값, S: 최솟값
scanf("%d", &N); // 숫자의 개수 N 입력 받기
for (int i = 0; i < N; i++) { // N번 반복하여 숫자 입력 받기
scanf("%d", &A); // 숫자 입력 받기
if (i == 0) { // 첫 번째 입력인 경우
B = A; // B에 A 대입 (첫 번째 숫자가 최댓값이자 최솟값)
S = A; // S에 A 대입 (첫 번째 숫자가 최댓값이자 최솟값)
} else {
if (B < A) { // 현재까지의 최댓값보다 A가 더 큰 경우
B = A; // B에 A 대입 (최댓값 갱신)
}
if (S > A) { // 현재까지의 최솟값보다 A가 더 작은 경우
S = A; // S에 A 대입 (최솟값 갱신)
}
}
}
printf("%d %d", S, B); // 최솟값과 최댓값 출력
return 0; // 프로그램 종료
}
4. 최댓값
a. 문제지 : 2562
b. 정답
📚 풀이
#include <stdio.h>
int main() {
int N[9], max = 0, num = 0; // 변수 초기화 뒤에 세미콜론을 추가해주어야 합니다.
for (int i = 0; i < 9; i++) {
scanf("%d", &N[i]);
if (N[i] > max) {
max = N[i];
num = i + 1;
}
}
printf("%d\n", max);
printf("%d\n", num);
return 0;
}
5. 공 넣기
a. 문제지 : 10810
b. 알고리즘
- 바구니의 개수(n)와 공을 넣는 방법의 개수(m)를 입력
- 바구니의 상태를 저장할 배열(arr)를 선언하고, 모든 요소를 0으로 초기화
- m번 반복하여 공을 넣는 방법에 따라 배열(arr)에 값을 저장한다.
a부터 b까지의 바구니에 c 번호의 공을 넣음 - 모든 바구니의 상태를 출력한다.
1번 바구니부터 n번 바구니까지 순서대로 출력 - 프로그램을 종료
c. 정답
📚 풀이
#include <stdio.h>
int main() {
int n, m; // 바구니의 개수와 공을 넣는 방법의 개수를 저장할 변수
int arr[101] = { 0, }; // 바구니의 상태를 저장하는 배열 선언 및 초기화
int a, b, c; // 공을 넣는 방법에 필요한 변수들
scanf("%d %d", &n, &m); // 바구니 개수 n과 공을 넣는 방법의 개수 m을 입력 받음
// m번 반복하여 공을 넣는 방법에 따라 배열 arr에 값을 저장
for (int i = 0; i < m; i++) {
scanf("%d %d %d", &a, &b, &c); // i번째 방법에 대한 정보 입력 받음
// a부터 b까지의 바구니에 c 번호의 공을 넣음
for (int k = a; k <= b; k++) {
arr[k] = c;
}
}
// 각 바구니의 상태를 출력
for (int i = 1; i <= n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
6. 공 바꾸기
a. 문제지 : 10813
b. 알고리즘
- N과 M을 입력
- 바구니를 나타내는 baskets 배열을 생성, 초기 값은 바구니 번호와 같은 값으로 초기화
- M번 반복하면서 바구니 교환 과정을 수행
i번째 반복에서 a와 b를 입력받아 a번 바구니와 b번 바구니에 들어있는 공을 교환 - 바구니에 들어있는 공의 번호를 출력
c. 정답
📚 풀이
#include <stdio.h>
int main() {
int N, M;
scanf("%d %d", &N, &M);
int baskets[100]; // 바구니의 상태를 저장하는 배열
for (int i = 0; i < N; i++) {
baskets[i] = i + 1; // 초기값은 바구니 번호와 동일
}
// M번 반복하면서 바구니 교환 과정 수행
for (int i = 0; i < M; i++) {
int a, b;
scanf("%d %d", &a, &b);
// a번 바구니와 b번 바구니에 들어있는 공 교환
int temp = baskets[a - 1];
baskets[a - 1] = baskets[b - 1];
baskets[b - 1] = temp;
}
// 바구니에 들어있는 공의 번호 출력
for (int i = 0; i < N; i++) {
printf("%d ", baskets[i]);
}
return 0;
}
7. 과제 안 내신 분?
a. 문제지 : 5597
b. 정답
📚 풀이
#include <stdio.h>
int main() {
int submitted[31] = {0}; // 제출한 학생 출석번호를 표시할 배열
int n;
// 제출한 학생 출석번호 표시
for (int i = 0; i < 28; i++) {
scanf("%d", &n);
submitted[n] = 1;
}
// 제출하지 않은 학생 출석번호 출력
for (int i = 1; i <= 30; i++) { //번호 순서대로 체크하기 때문에 따로 조건 필요없음
if (submitted[i] == 0) {
printf("%d\n", i);
}
}
return 0;
}
8. 나머지
a. 문제지 : 3052
b. 정답
📚 풀이
#include <stdio.h>
int main() {
int arr[42] = {0}; // 0으로 초기화된 크기 42의 배열 선언
int count = 0; // 서로 다른 나머지의 개수를 저장할 변수
// 10개의 숫자 입력 받아서 배열에 나머지 1로 표시
for (int i = 0; i < 10; i++) {
int num;
scanf("%d", &num); // 숫자 입력 받음
num %= 42; // 42로 나눈 나머지 계산
arr[num] = 1; // 나머지에 해당하는 인덱스를 1로 설정하여 제출한 학생 표시
}
// 배열에서 값이 1인 인덱스의 개수 세기
for (int i = 0; i < 42; i++) {
if (arr[i] == 1) {
count++; // 값이 1이면 서로 다른 나머지의 개수 증가
}
}
printf("%d\n", count); // 서로 다른 나머지의 개수 출력
return 0;
}
9. 바구니 뒤집기
a. 문제지 : 10811
b. 알고리즘
1) N과 M을 입력받음(N은 바구니의 개수, M은 바구니 순서 변경 횟수)
2) 크기가 N인 배열 arr을 선언하고, 각 바구니의 순서를 초기화 (1부터 N까지 순서로)
3) M번 반복하여 바구니의 순서를 변경
- left와 right를 입력받아 역순으로 바꿀 범위를 지정
- reverse 함수를 호출하여 배열 arr의 해당 범위를 역순으로 만들고 left와 right를 1씩 감소시켜서 배열의 인덱스로 변환하여 사용
4) 순서를 역순으로 바꾼 후의 arr 배열을 순서대로 공백으로 구분하여 출력
c. 정답
📚 풀이
#include <stdio.h>
// 배열의 일부분을 역순으로 만드는 함수
void reverse(int arr[], int start, int end) {
while (start < end) {
int temp = arr[start]; // 현재 바구니의 순서를 임시로 저장
arr[start] = arr[end]; // 마지막 바구니의 순서를 현재 바구니로 이동
arr[end] = temp; // 임시로 저장한 순서를 마지막 바구니로 이동
start++; // 시작 바구니 인덱스 증가
end--; // 마지막 바구니 인덱스 감소
}
}
int main() {
int N, M;
scanf("%d %d", &N, &M); // 바구니 개수 N과 바구니 순서 변경 횟수 M 입력 받기
int arr[N];
for (int i = 0; i < N; i++) {
arr[i] = i + 1; // 각 바구니의 순서를 초기화 (1부터 N까지)
}
for (int i = 0; i < M; i++) {
int left, right;
scanf("%d %d", &left, &right); // 역순을 만들 범위 입력 받기
reverse(arr, left - 1, right - 1); // 배열의 인덱스에 맞춰 역순 범위 설정
}
for (int i = 0; i < N; i++) {
printf("%d ", arr[i]); // 역순으로 만든 결과 출력
}
return 0;
}
10. 평균
a. 문제지 : 1546
b. 알고리즘
- 시험 본 과목의 개수를 입력
- 개수가 유효한 범위인지 확인
- 각 시험 점수를 입력받으면서 최고점을 찾기
- 각 시험 점수를 최고점을 이용하여 새로운 점수로 변환, 변환된 점수를 총합에 더하기
- 변환된 점수의 총합을 시험 본 과목의 개수로 나누어 새로운 평균을 구하기
- 구한 새로운 평균을 소수점 아래 6자리까지 출력
c. 정답
📚 풀이
#include <stdio.h>
int main() {
int num; // 시험 본 과목 개수
scanf("%d", &num);
// num이 유효한 범위인지 확인
if (num < 1 || num > 1000) {
return 1; // 유효하지 않은 경우 프로그램 종료
}
int scoreArr[num]; // 본 시험 점수를 저장할 배열
int bScore = 0; // 최고점 초기화
// 시험 점수 입력받기, 최고점 찾기
for (int i = 0; i < num; i++) {
scanf("%d", &scoreArr[i]);
// 최고점 갱신
if (scoreArr[i] > bScore) {
bScore = scoreArr[i];
}
}
double totalS = 0; // 새 총점
// 모든 시험 점수를 새로운 평균을 계산하기 위해 반복
for (int i = 0; i < num; i++) {
// 점수의 총합 계산
totalS += (double)scoreArr[i] / bScore * 100;
}
// 새로운 평균 계산 후 출력
printf("%.6lf\n", totalS / num); // 소수점 아래 6자리까지 출력
return 0; // 프로그램 종료
}
'자료구조와 알고리즘 > 문제풀이' 카테고리의 다른 글
[Baekjoon] 단계별로 풀어보기 : 심화 1 (0) | 2023.08.24 |
---|---|
[Baekjoon] 단계별로 풀어보기 : 문자열 (0) | 2023.08.17 |
[Baekjoon] 단계별로 풀어보기 : 반복문 (0) | 2023.08.16 |
[Baekjoon] 단계별로 풀어보기 : 조건문 (0) | 2023.08.16 |
[Baekjoon] 단계별로 풀어보기 : 입출력과 사칙연산 (0) | 2023.08.10 |