15 - Array 2
<학습하기>
2차원 배열
기존의 1차원 배열 (변수들이 일렬로 늘어서 있는 배열)과는 달리
변수들이 바둑판과 같이 2차원 평면에 늘어서 있는 배열을 말한다.
형식
int arr [행 개수] [열 개수]
주의 : int arr [행 개수, 열 개수] 가 아니다.
세로 [행 개수]만큼, 가로 [열 개수] 만큼의 [행 개수*열 개수]개의 변수를 포함하는 arr이 만들어진다.
첨자
1차원 배열에서는 '배열의 몇 번째 변수'로서 모든 변수에 접근할 수 있었으나,
2차원 배열에서는 두개의 첨자가 필요하다.
형식
int var = [행 번호][열 번호];
주의 : arr [행 번호, 열 번호]가 아님.
2차원배열의 초기화
1차원 배열과 마찬가지로 차원 배열 역시 초기화가 가능하다.
1. 행과 열을 나눠서 초기화 시키는 방법.
int arr [3][4] =
{
{1, 2, 3, 4},
{5, 6, 7, 8}
{9, 10, 11, 12}
};
arr의 첫째 행 (arr[0])에 {1, 2, 3, 4}를,
둘째 행 (arr[1])에 {5, 6, 7, 8}을 초기화 시키는 방식.
2.행과 열 구분 없이 처음부터 끝까지 초기화 시키는 방식.
int arr [3][4] =
{
1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12
};
arr의 행번호가 고정되어 있을 경우,
arr[1][0]
arr[1][1]
arr[1][2]
와 같이 각 변수에 접근할 수 있다.
여기서 arr[1]을 분리한다면
(arr[1])[0]
(arr[1])[1]
(arr[1])[2]
와 같이 arr[1] 자체를 하나의 1차원 배열로 간주할 수 있다.
즉, arr[행 번호]가 1차원 배열이 될 수 있다.
매출이 가장 높은 푸목 구하는 알고리즘.
알고리즘1
0번 품목이 가장 높다고 가정한다.
1번 품목과 비교해서, 1번 품목이 더 높다면,
1번 품목이 가장 높다고 가정한다.
2번 품목과 비교해서, 2번 품목이 더 높다면,
2번 품목이 가장 높다고 가정한다.
:
:
:
9번 품목과 비교해서 9번 품목이 더 높다면,
9번품목이 가장 높다고 가정한다.
알고리즘2 - maxSalesGoods에 저장.
maxSalesGoods에 0번 대입.
1번품목과 비교해서 maxSalesGoods보다 1번품목이 더 높다면
maxSalesGoods에 1번 대입.
:
:
9번 품목과 비교해서 maxSalesGoods보다 9번 품목이 더 높다면
maxSalesGoods에 9번 대입.
알고리즘3 - 반복문 사용
maxSalesGoods에 0번 대입
goodsID를 1부터 9까지 반복.
goodsID번 품목과 비교해서 maxSalesGoods보다 goodsID품목이 더 높다면
maxSalesGoods에 goodsID번 대입.
알고리즘4 - 코드화
maxSalesGoods = 0;
for(goodsID = 1; goodsID < 9; ++goodsID;)
~~
<실습하기>
#include <stdio.h>
// 여기 코드로 분류된 10개품목에 대해 일주일간의 판매데이터가 있다.
// 이것을 가지고 매출액이 가장 높은 품목과 매출액이 가장 높은 날을 찾아서 출력하라.
int DailySales(int data[10][7],int day);
int GoodsSales(int data[7]);
main()
{
int sales[10][7] =
{
{135,865,845,213,586,892,421}, // 0번 물품에 대한 일주일간 판매량.
{568,423,548,369,554,287,989}, // 1번 물품에 대한 일주일간 판매량.
{893,248,657,982,147,892,351}, //:
{789,584,875,632,135,248,365}, //:
{751,223,366,887,571,542,242},
{356,275,689,572,138,128,302},
{510,233,581,589,587,101,489},
{531,112,548,995,890,231,105},
{954,102,570,496,889,887,158},
{632,151,234,812,239,789,246},
//^ ^
//| | 둘째날 모든 물품의 판매량.
//| 첫째날 모든 물품의 판매량.
};
/*
0번 물품의 첫째날 판매량 : sales[행번호][열번호] => sales[0][0]
0번 물품의 둘째날 판매량 : sales[행번호][열번호] => salse[0][1]
1번 물품의 셋째날 판매량 : sales[행번호][열번호] => salse[1][2]
정리하자면, goodsID번 물품의 day날 판매량 : salse[goodsID][day -1]
*/
/*
//0번 물품의 일주일간 판매량
int total = 0;
int day;
for(day = 1; day<=7; ++day) // day가 1,2,3,4,5,6,7일 동안 반복.
total += sales[0][day-1];
printf("0번 물품의 일주일간 판매액 : %d\n", total);
//1번 물품의 일주일간 판매량
for(day = 1; day<=7; ++day) // day가 1,2,3,4,5,6,7일 동안 반복.
total += sales[1][day-1];
printf("1번 물품의 일주일간 판매액 : %d\n", total);
//결국 똑같은 것 반복 >> 반복문을 쓰자!
*/
//각 물품의 판매량
int goodsID;
int day;
for(goodsID = 0; goodsID < 10; ++goodsID) //물품을 반복
{
//goodsID번 물품의 일주일간 판매량
int total = 0;
int day;
for(day = 1; day<=7; ++day) // day가 1,2,3,4,5,6,7일 동안 반복.
total += sales[goodsID][day-1];
printf("%d번 물품의 일주일간 판매액 : %d\n", goodsID, total);
}
//각 날짜의 판매량
for(day = 1; day<= 7; ++day)// 날짜를 반복
{
int total = 0;
int goodsID;
for(goodsID = 0; goodsID < 10; ++goodsID) // 각 물품에 대해 반복
total += sales[goodsID][day-1];
printf("%d날 전체 판매액 : %d\n", day, total);
}
//각 전체 판매액 함수화하기.
//각 날짜의 전체 물품 판매량
for(day = 1; day < 7; ++day)
{
int total= DailySales(sales, day); // 전체 데이터와 날짜를 받아 그날의 전체 판매액 계산.
//sales는 배열 이름이므로 배열이 시작되는 위치(주소)를 전달.
printf("%d날 전체 판매액 : %d\n", day, total);
}
//각 물품의 일주일간 판매량
for(goodsID = 0; goodsID <10; ++goodsID)
{
int total = GoodsSales(sales[goodsID]);
//sales[goodsID]자체가 하나의 1차원 배열이나 마찬가지이다.
//int sales[10][7]로 선언되어 있으므로
//sales[goodsID]는 7개짜리 1차원 배열이 된다.
printf("%d번 물품의 일주일간 판매액 : %d\n", goodsID, total);
/*
(sales[0])[0]
(sales[0])[1]
(sales[0])[2]
>> 1차원 배열로 생각할 수 있다!
*/
}
{
int maxSalesGoods;
int goodsID;
puts("매출이 가장 높은 품목 찾기");
maxSalesGoods = 0; //0번 품목이 가장 높은 판매액이라 가정.
for(goodsID = 1; goodsID < 10; ++goodsID) //1부터 9까지 반복
{
int maxSales = GoodsSales(sales[maxSalesGoods]);// maxSalesGoods의 판매량
int goodsSales = GoodsSales(sales[goodsID]); //goodsID의 판매량
if(maxSales < goodsSales)// maxSalesGoods보다 goodsID번 품목의 판매량이 더 높다면
maxSalesGoods = goodsID;
}
printf("최대 판매액의 물품 ID : &d\n", maxSalesGoods);
}
{
int maxSalesDay; // 매출이 가장 높은 날을 저장할 변수
int day;
puts("매출이 가장 높은 날 찾기.");
maxSalesDay = 1; // 첫째날이 가장 매출이 많은 날이라고 가정
for(day = 2; day<=7; ++day)
{
int maxSales = DailySales(sales, maxSalesDay);
int daySales = DailySales(sales, day);
if(maxSales < daySales) // 최고 판매일로 가정한 날짜보다 day날 매출이 더 많았다면
maxSalesDay = day; //day가 최고판매일이 될 가능성이 있음.
}
printf("최대 판매일 : %d째 날\n", maxSalesDay);
}
}
//함수 만들기 : 반환형식 함수이름 (전달인수)
int DailySales(int data[10][7],int day)
//day날짜의 전체 판매액
{
int total = 0;
int goodsID;
for(goodsID = 0; goodsID <10; ++goodsID)
total += data[goodsID][day -1];
return total;
}
int GoodsSales(int data[7])
{
int total = 0;
int day;
for(day = 1; day <7; ++day)
total += data[day -1];
return total;
}
댓글
댓글 쓰기