본문 바로가기

공부/자료 구조 및 알고리즘

문재 해결을 위한 기본적 접근 방법 - 배열(Array)

시작하기 앞서 따로 이야기 하지 않고 자료구조 및 알고리즘 개시된 개시물의 예제와 알고리즘은

Computational Thinking & 창의적 문제해결 방법론이라는 책을 참고했음을 알림니다.

 

최적화 문제(Optimization problem): 가능한 여러 가지 해들로부터 최적의 해를 찾아 내는 문제

로서 대표적인 예로는 배낭 문제(knapsack problem)를 들 수 있다.

정보과학적 문제 해결 절차 및 문제 해결 방법

문제 이해 및 분석 → 정보 과학의 원리 적용 문제 해결 → 방법 설계-알고리즘 설계
문제 해결 방법 구현-알고리즘 구현 → 결과 검토

문제 해결 방법 구현

 

ex) 다음의 인사 자료를 토대로 영업부에서 가장 많은 연봉을 받는 사원의 사원번호, 이름, 연봉을 찾아라.

 

 

자료의 구조화

자료의 구조화: 정보 과학에서 자료의 집합을 문제 해결에 용이한 형태 및 기능을 갖춘 구조로 변환하는 과정

자료 구조화의 여러 방법

배열(Array)

컴퓨터에서 자료를 다룰 때 사용하는 가장 기본적인 자료 구조. 자료들을 배열 내에 일렬로 나열
하여 관리한다.

배열

*배열

  • 배열의 각 요소는 배열명에 원소 번호를 붙여서 명명
  • 첫 번째 원소는 score[0]과 같이 0부터 시작
    score 배열의 첫 번째 원소: score[0]
    score 배열의 두 번째 원소: score[1]
     ︙
    score 배열의 세 번째 원소: score[9]

*배열의 특징

  • 정보 과학에서 가장 기본이 되는 자료 구조이다.
  • 배열의 자료 저장 공간들은 위치 번호를 가진다.
  • 배열의 특정 공간을 가리킬 때는 배열 이름과 위치 번호를 조합하여 표현한다.
  • 할당 연산자 ':='를 사용하여 배열에 자료를 저장하거나 배열의 자료를 읽어 온다.
  • 2차원 이상의 구조를 가지는 배열을 다차원 배열이라고 한다.

*배열의 예

ex)배열에서 성적을 하나씩 꺼내서 평균을 계산하는 알고리즘의 예

     90 86 75 50 98 64

  -의사 코드로 배열을 표기하기

list = {90, 86, 75, 50, 98, 64}
       sum ← 0
       i ← 0

       while i ← 배열의 크기
          sum ← sum + list[i]
          i ← i + 1
       endwhile

       average ← (sum / 배열의 크기)

배열에서 성적을 하나씩 꺼내어 합계를 구하려 할 때, 배열의 크기가 크다면 반복 구조를 사용한다.

*배열의 초기화

  1. 배열을 먼저 선언하고 배열의 각 원소 값을 할당하는 방법

int a[3];     //배열의 선언
      a[0] = 10;   //배열의 초기화
      a[1] = 15;
      a[2] = 20;

  2. 배열을 선언하면서 초기화 하는 방법

int a[3] = {10,15, 20};   //배열을 선언함과 동시에 초기화

*1차원 배열의 예

  1. 배열을 초기화하고 원소 출력하기

#include <stdio.h>

int main(void)
{
    int i;
    int a[] = {5,10, 15};

    for(i = 0; i < 3; i+ +)
    {
       printf(“a[%d] = %d\n”, i, a[i]);
    }

    return 0;
}

결과

2. 배열 원소의 합과 평균 구하기

#include <stdio.h>

int main(void)
{
    int A[5] = {1, 2, 3, 4, 5};
    int i, sum = 0;
    double average;

    for(i = 0; i < 5; i+ +)
        sum += A[i];

    average = (double)sum / i;

    printf(“배열 A 원소의 합은 %d다.\n”, sum);
    printf(“배열 A 원소의 평균은 %4.2lf이다.\n”, average);

    return 0;
}

결과

*2차원 배열

  행과 열로 표현된 행렬과 비슷하다.

    int a[2][4];

 

*2차원 배열 선언

*2차원 배열의 예

  1. 2차원 배열을 초기화하는 방법

     -배열을 선언한 후 배열의 각 원소 값을 할당하는 방법

     -선언과 동시에 초기화하는 방법

int a [2][3] = {{10, 20, 30}, {40, 50, 60}};
int a [2][3] = {10, 20, 30, 40, 50, 60};

 

   -중괄호( { } )로 배열의 원소를 행 단위로 묶어 초기화 하거나 전체 원소를 묶어 초기화

   -2차원 배열은 선언할 때 행의 개수 생략 가능(열의 개수 생략하면 오류 발생)

   -올바른 예: int a [] [3] = {10, 20, 30, 40, 50, 60};
   -
잘못된 예1: int a [2] [] = {10, 20, 30, 40, 50, 60};
   -
잘못된 예2: int a [] [] = {10, 20, 30, 40, 50, 60};
   -
잘못된 예3: int a [] [3];
   -
올바른 예 int a [] [3] = {10, 20, 30, 40};

 

  2. 2차원 배열의 C코드 예제

//2차원 배열의 초기화//
#include <stdio.h>

int main(void)
{
    int i, j;
    int a[2][3] = {{15, 20}, {25, 30}};

    for(i = 0; i < 2; i+ +)
    {
       for(j = 0; j < 3; j+ +)
       {
          printf(“a[%d][%d] = %d\n”, i, j, [i][j]);
       }
    }

    return 0;
}

결과

//2차원 배열의 합 구하기//
#include <stdio.h>

int main(void)
{
    int i, j, sum = 0;
    int a[2][2] = {5, 20, 12, 7};

    for(i = 0; i < 2; i+ +)
    {
       for(j = 0; j < 2; j+ +)
       {
          sum += a[i][j];
       }
    }

    printf(“2차원 배열 a의 합은 %d다.\n”, sum);

    return 0;
}

결과

//국어, 영어, 수학의 평균 구하기//
#include <stdio.h>

int main(void)
{
    int i, j, sum = 0;
    int a[][3] = {{90, 80, 90}, //영희의 국어, 영어, 수학 점수
                  {70, 100, 100}, //철수의 국어, 영어, 수학 점수
                  {80, 90, 90}}; //미나의 국어, 영어, 수학 점수

    double aveClass[3];

    for(j = 0; j < 3; j+ +)
    {
       for(i = 0; i < 3; i+ +)
       {
          sum += a[i][j];
       }

       aveClass[j] = (double)sum / i;

       if(j == 0)
           printf(“국어 평균은 %.2lf이다.\n”, aveClass[j]);
       elseif(j == 1)
           printf(“영어 평균은 %.2lf이다.\n”, aveClass[j]);
       elseif(j == 2)
           printf(“수학 평균은 %.2lf이다.\n”, aveClass[j]);

       //다음 과목의 평균을 구하기 위해 sum을 초기화한다.
       sum = 0;
    }

    return 0;

결과