상세 컨텐츠

본문 제목

[CodeUp] C언어 기초 100제 풀이 (1093번 ~ 1096번)

C언어

by idea8590 2026. 2. 4. 22:35

본문

반응형

1093 : [기초-1차원배열] 이상한 출석 번호 부르기 1

문제 설명 정보 선생님은 수업을 시작하기 전에 이상한 출석을 부른다. 선생님은 출석부상에 있는 학생들의 번호를 무작위(랜덤)로 부르는데, 각 번호(1 ~ 23)가 불린 횟수를 각각 출력해보자.

(참고: 학생 번호는 1번부터 23번까지 있고, 선생님은 같은 번호를 여러 번 부를 수 있다.)

입력 첫 번째 줄에 출석 번호를 부른 횟수 n이 입력된다. (1 <= n <= 10000) 두 번째 줄에 무작위로 부른 n개의 번호(1 ~ 23)가 공백을 두고 순서대로 입력된다.

출력 1번부터 23번까지 각 번호가 불린 횟수를 순서대로 공백으로 구분하여 한 줄로 출력한다.

소스 코드

C
 
#include <stdio.h>

int main() {
    int n, i, t;
    int a[24] = {0}; // 1번~23번 인덱스를 편하게 쓰기 위해 크기를 24로 잡고 0으로 초기화

    scanf("%d", &n); // 부른 횟수 입력

    for(i = 1; i <= n; i++) {
        scanf("%d", &t); // 부른 번호를 입력받음
        a[t] = a[t] + 1; // 해당 번호(t)의 카운트를 1 증가
    }

    for(i = 1; i <= 23; i++) {
        printf("%d ", a[i]); // 1번부터 23번까지 불린 횟수 출력
    }

    return 0;
}

예시 입력 / 출력

[입력]
10
1 3 2 2 5 6 7 4 5 9

[출력]
1 2 1 1 2 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0

문제 해설 '빈도수 세기' 문제입니다.

  • 입력받은 번호 자체를 **배열의 인덱스(주소)**로 사용하는 것이 핵심입니다.
  • scanf("%d", &t)로 번호 t를 입력받으면, a[t] 값을 증가시켜서 그 번호가 몇 번 나왔는지 기록합니다.

1094 : [기초-1차원배열] 이상한 출석 번호 부르기 2

문제 설명 정보 선생님은 수업을 시작하기 전에 이상한 출석을 부른다. 학생들의 얼굴과 이름을 빨리 익히기 위해 번호를 무작위(랜덤)로 부르는데, 영일이는 선생님이 부른 번호들을 기억하고 있다가 거꾸로 불러보는 것을 해보고 싶어졌다.

출석 번호를 n번 무작위로 불렀을 때, 부른 번호를 거꾸로 출력해 보자.

입력 첫 번째 줄에 번호를 부른 횟수 n이 입력된다. (1 <= n <= 10000) 두 번째 줄에 n개의 랜덤 번호(1 ~ 23)가 공백을 두고 순서대로 입력된다.

출력 출석을 부른 번호 순서를 바꾸어 공백을 두고 출력한다.

소스 코드

C
 
#include <stdio.h>

int main() {
    int n, i;
    int k[10000]; // 번호를 최대 10000개까지 부를 수 있으므로 넉넉하게 선언

    scanf("%d", &n); // 횟수 입력

    // 1. 번호 순서대로 배열에 저장
    for(i = 1; i <= n; i++) {
        scanf("%d", &k[i]);
    }

    // 2. 뒤에서부터 거꾸로 출력
    for(i = n; i >= 1; i--) { // i를 n부터 1까지 줄여나감
        printf("%d ", k[i]);
    }

    return 0;
}

예시 입력 / 출력

[입력]
10
10 4 2 3 6 6 7 9 8 5

[출력]
5 8 9 7 6 6 3 2 4 10

문제 해설 '배열의 역순 출력' 문제입니다.

  • 데이터를 입력받는 즉시 출력하는 것이 아니라, 일단 배열에 모두 저장해야 합니다.
  • 저장이 끝난 후, 반복문의 인덱스 i를 n(마지막)에서 시작하여 1(처음)까지 감소시키며(i--) 출력합니다.

1095 : [기초-1차원배열] 이상한 출석 번호 부르기 3

문제 설명 정보 선생님은 오늘도 이상한 출석을 부른다. 영일이는 오늘도 다른 생각을 하다가 선생님이 부른 번호 중 가장 빠른 번호가 무엇이었는지 깨닫지 못했다.

출석 번호를 n번 무작위로 불렀을 때, 가장 빠른 번호를 출력해 보자.

입력 첫 번째 줄에 번호를 부른 횟수 n이 입력된다. (1 <= n <= 10000) 두 번째 줄에 n개의 랜덤 번호(1 ~ 23)가 공백을 두고 순서대로 입력된다.

출력 가장 빠른 번호를 출력한다.

소스 코드

C
 
#include <stdio.h>

int main() {
    int n, i, t;
    int min = 24; // 가장 빠른 번호(최솟값)를 찾기 위해, 나올 수 없는 큰 수로 초기화

    scanf("%d", &n);

    for(i = 1; i <= n; i++) {
        scanf("%d", &t);
        
        // 입력받은 번호(t)가 현재 알고 있는 최솟값(min)보다 작으면 갱신
        if(t < min) {
            min = t;
        }
    }

    printf("%d", min);

    return 0;
}

예시 입력 / 출력

[입력]
10
10 4 2 3 6 6 7 9 8 5

[출력]
2

문제 해설 '최솟값(Minimum Value) 찾기' 문제입니다.

  • min 변수를 처음에 아주 큰 값(여기선 24)으로 설정해 둡니다.
  • 새로운 번호가 들어올 때마다 min과 비교하여, 더 작은 숫자가 나타나면 그 숫자를 min에 저장합니다.
  • 반복문이 끝나면 min에는 가장 작은 숫자만 남게 됩니다.

1096 : [기초-2차원배열] 바둑판에 흰 돌 놓기

문제 설명 기숙사 생활을 하는 학교에서 어떤 금요일(전원 귀가일)에는 모두 집으로 귀가를 한다. 오랜만에 집에 간 영일이는 아버지와 함께 두던 바둑을 다시 두고 싶어졌다. 하지만 바둑판은 19줄 * 19줄이고, 바둑알은 너무 많아 챙기기가 귀찮았다.

낯선 바둑판을 준비해 둔 아버지는, 바둑판(19 * 19)에 n개의 흰 돌을 놓는다고 할 때, n개의 흰 돌이 놓인 오목판의 상태를 출력하는 프로그램을 작성해보자.

(참고: 바둑판은 가로, 세로 19줄로 되어 있다. 좌표는 (1, 1)부터 (19, 19)까지이다.)

입력 바둑판에 올려 놓을 흰 돌의 개수(n)가 첫 줄에 입력된다. 둘째 줄 부터 n+1 번째 줄까지 힌 돌을 놓을 좌표(x, y)가 n줄 입력된다. (n은 10이하의 자연수, x, y 좌표는 1 ~ 19 사이의 정수)

출력 흰 돌이 올려진 바둑판의 상황을 출력한다. 흰 돌이 있는 곳은 1, 없는 곳은 0으로 출력하고, 각 줄의 숫자는 공백으로 띄워 출력한다.

소스 코드

C
 
#include <stdio.h>

int main() {
    int n, i, j, x, y;
    int board[20][20] = {0}; // 1~19 인덱스를 쓰기 위해 20x20 크기로 선언 (0으로 초기화)

    scanf("%d", &n); // 놓을 돌의 개수

    // 1. 돌 놓기 (입력받은 좌표를 1로 변경)
    for(i = 1; i <= n; i++) {
        scanf("%d %d", &x, &y);
        board[x][y] = 1; 
    }

    // 2. 바둑판 전체 출력 (19x19)
    for(i = 1; i <= 19; i++) {       // 행 반복
        for(j = 1; j <= 19; j++) {   // 열 반복
            printf("%d ", board[i][j]);
        }
        printf("\n"); // 한 줄 출력이 끝나면 줄바꿈
    }

    return 0;
}

예시 입력 / 출력

[입력]
5
1 1
2 2
3 3
4 4
5 5

[출력] (실제로는 19줄이 출력됨)
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
... (이하 생략)

문제 해설 **'2차원 배열'**을 활용하는 문제입니다.

  • board[20][20]으로 선언하여 19x19 격자를 만듭니다.
  • 입력받은 좌표 (x, y)에 해당하는 배열의 위치 board[x][y]에 1을 저장합니다.
  • 출력할 때는 이중 반복문(Double Loop)을 사용하여 i는 1~19(세로줄), j는 1~19(가로줄)를 순회하며 바둑판의 상태를 출력합니다.
반응형

관련글 더보기