[C]코드업_1093 : [기초-1차원배열] 이상한 출석 번호 부르기1

Alal11·2022년 7월 1일
0
post-thumbnail

출처

https://www.codeup.kr/problem.php?id=1093


문제

정보 선생님은 수업을 시작하기 전에 이상한 출석을 부른다.

선생님은 출석부를 보고 번호를 부르는데,
학생들의 얼굴과 이름을 빨리 익히기 위해 번호를 무작위(랜덤)으로 부른다.

그리고 얼굴과 이름이 잘 기억되지 않는 학생들은 번호를 여러 번 불러
이름과 얼굴을 빨리 익히려고 하는 것이다.

출석 번호를 n번 무작위로 불렀을 때, 각 번호(1 ~ 23)가 불린 횟수를 각각 출력해보자.

참고
각 번호가 불린 횟수를 기록하고 출력하기 위해 변수 23개를 선언할 수도 있다.
하지만 C언어에서는 같은 이름에 번호를 붙여 사용하는 배열(array)을 사용할 수 있다.
이는 마치 아파트의 동 호수(예를 들어 a동 101호)와 같이 번호를 붙여 집을 구분하는 것과
비슷하다.

예를 들어 a동 101호를 다르게 표현하면 a[101] 과 같은 표현이 가능한 것이다.
이렇게 번호를 붙여 데이터를 저장할 수 있는 변수인 배열을 사용하기 위해서는
변수처럼, 사용하기 전에 선언해주어야 하는데 아래와 같은 방법으로 가능하다.

<예시>

int a[100]; //a[0] ~ a[99] 까지 정수를 저장할 수 있는 배열을 만들어라.
for(i=0; i<100; i++)
{
scanf("%d", &a[i]); // 각각의 방에 순서대로 반복하면서 값을 입력해라.
}

배열을 사용하기 전에 배열에 들어있는 값을 초기화시키는 것이 좋은데,
다음과 같은 여러 가지 방법이 있다.

int a[24]={}; //0번부터 23번까지 모두 0으로 초기화된다.
int a[24]={1,2,3}; //1,2,3 이 순서대로 들어가고 나머지는 모두 0으로 초기화된다.
int a[3]={1,2,3}; //1,2,3 이 순서대로 저장된다.
int a[3]={1,2,3,4}; //방을 3개 만들고 값을 4개를 집어넣어라? 오류 발생!

<문제 해결을 위한 참고 코드>

int n, i, t;
int a[24]={};
scanf("%d", &n); //개수 입력받기
for(i=1; i<=n; i++) //개수만큼 입력받기
{
scanf("%d", &t); //읽어서
a[t]=a[t]+1; //들어있던 값에 1만큼 더해 다시 저장. a[t]+=1 과 같다.
}
for(i=1; i<=23; i++)
{
printf("%d ", a[i]); //1~23 번 배열에 저장되어있는 값 출력하기
}


입력

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


출력

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


➡️문제 분석

1번 부터 23번 까지 출석 번호가 불린 횟수를 세는 프로그램.

<배열의 기본 개념>

  • 변수 이름 뒤에 [ ](대괄호)를 붙인 뒤 크기를 설정해준다. 그리고 배열을 선언 하면서 값을 초기화 할 때는 { }(중괄호)를 사용한다. ex) 자료형 배열이름[크기] = {값, 값, 값};
  • int Arr[10]은 크기가 10인 int 형 배열을 선언한다는 뜻이다.
  • 배열에 값이 저장된 공간을 '요소(element)'라고 한다. 배열에서 각 요소에 접근하려면 배열 뒤에 [ ]를 사용하며 [ ] 안에 각 요소의 '인덱스(index)'를 지정해주면 된다.
Arr\[0];	// 첫 번째 요소, 인덱스 0
Arr\[3];	// 네 번째 요소, 인덱스 3
Arr\[9];	// 열 번째 요소, 인덱스 9

주의> 배열의 인덱스는 항상 0부터 시작한다.

  • 배열을 선언 할 때[ ]는 "이 변수가 배열이고 크기는 얼마다"라고 알려주는 역할이고, 배열을 사용 할 때[ ]는 "배열의 요소에 접근하겠다"는 뜻으로 생각하면 쉽다.

➡️코드(⭕)

#include <stdio.h>

int main() {

    int arr[24] = { 0, };       // 배열 모두 0으로 초기화
    int num1, num2;
    
    scanf_s("%d", &num1);

    for (int i = 1; i <= num1; i++) {
        scanf_s("%d", &num2);       // 입력받은 번호는 해당 배열위 위치 값
        arr[num2] += 1;     // 해당 위치 값에 1만큼 더해 불린 횟수 증가
    }

    for (int j = 1; j < 24; j++) {
        printf("%d ", arr[j]);      // 1~23 번 배열에 저장되어 있는 값(=불린 횟수) 출력 
    }
    return 0;
}

<코드 분석>

  1. 크기가 24인 int 형 배열을 선언하여 배열의 요소를 모두 0으로 초기화 하였다.
  1. 출석 번호를 부른 횟수인 num1을 입력받고, 첫번째 for문으로 넘어간다.
  1. 1~23번 까지의 번호 중에 무작위로 불린 번호를 입력받는다. (예를 들어 4 5 5 6 5 이면 4번이 1번, 5번이 3번, 6번이 1번 불린 것이다.)
  1. 만약, 2번이 불렸다면 arr[2]가 선택되고, arr[2]+=1;을 해주어 arr[2]의 요소 값을 1만큼 더해준다.
  1. 위 과정을 반복한 다음 두번째 for문으로 와서 arr[1] 부터 arr[23] 까지 각각 저장되어 있는 값, 즉 불린 횟수를 출력한다.

➡️end

배열이 아직 익숙하지 않아서 기본 개념부터 공부한 다음 문제를 풀어보았더니 어느정도 감이 오기 시작한다. 배열 문제를 혼자 풀 수 있도록 문제를 더 풀어보면서 많이 연습해야겠다.

0개의 댓글