자료구조와 알고리즘/문제풀이

[Baekjoon] 단계별로 풀어보기 : 1차원 배열

순정법사 2023.08.16

 

이번 알고리즘 문제 풀이는 C로 진행했습니다 

코드에 오탈자나 문제가 있으면 언제든지 댓글로 알려주세요!

 

 

 


 

 

 

A. 1차원 배열

 

1차원 배열 단계

배열을 활용하여 서로 다른 값의 개수를 찾는 문제

www.acmicpc.net

 

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. 알고리즘

  1. 바구니의 개수(n)와 공을 넣는 방법의 개수(m)를 입력
  2. 바구니의 상태를 저장할 배열(arr)를 선언하고, 모든 요소를 0으로 초기화
  3. m번 반복하여 공을 넣는 방법에 따라 배열(arr)에 값을 저장한다.
    a부터 b까지의 바구니에 c 번호의 공을 넣음
  4. 모든 바구니의 상태를 출력한다.
    1번 바구니부터 n번 바구니까지 순서대로 출력
  5. 프로그램을 종료

 

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. 알고리즘

  1. N과 M을 입력
  2. 바구니를 나타내는 baskets 배열을 생성, 초기 값은 바구니 번호와 같은 값으로 초기화
  3. M번 반복하면서 바구니 교환 과정을 수행
    i번째 반복에서 a와 b를 입력받아 a번 바구니와 b번 바구니에 들어있는 공을 교환
  4. 바구니에 들어있는 공의 번호를 출력

 

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. 알고리즘

  1. 시험 본 과목의 개수를 입력
  2. 개수가 유효한 범위인지 확인
  3. 각 시험 점수를 입력받으면서 최고점을 찾기
  4. 각 시험 점수를 최고점을 이용하여 새로운 점수로 변환, 변환된 점수를 총합에 더하기
  5. 변환된 점수의 총합을 시험 본 과목의 개수로 나누어 새로운 평균을 구하기
  6. 구한 새로운 평균을 소수점 아래 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; // 프로그램 종료
}