천천히 빛나는

백준 단계 7 : 2차원 배열 (C++) 본문

C++/BAEKJOON (C++)

백준 단계 7 : 2차원 배열 (C++)

까만콩 •ᴥ• 2023. 9. 3. 03:04

문제 풀이 전, 2차원 배열 동적할당 방법을 소개하도록 하겠다. 행이 n, 열이 m인 2차원 배열이다.

int n, m;
cin >> n >> m;
int** arr = new int* [n];
for (int i = 0; i < m; i++)
{
	arr[i] = new int[m];
}

 

자바에서 소개했던 2차원 배열 모습인데 이렇게 생각하면 된다.

 

 

 

2738. N*M크기의 두 행렬 A와 B가 주어졌을 때, 두 행렬을 더하는 프로그램을 작성하시오.

#include <iostream>
#include <map>
using namespace std;
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n, m;
	int arr1[101][101] = {0};
	int arr2[101][101] = {0};
	cin >> n >> m;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cin >> arr1[i][j];
		}
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cin >> arr2[i][j];
		}
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cout << arr1[i][j] + arr2[i][j] << " ";
		}
		cout << "\n";
	}
	return 0;
}

2차원 배열 챕터라서 2차원 배열로 만들긴 했으나 1차원 배열로도 구현가능하다.

#include <iostream>
#include <map>
using namespace std;
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n, m;
	cin >> n >> m;
	int arr1[10001] = { 0 };
	int arr2[10001] = { 0 };
	for (int i = 0; i < n * m; i++)
	{
		cin >> arr1[i];
	}
	for (int i = 0; i < n * m; i++)
	{
		cin >> arr2[i];
	}
	for (int i = 0; i < n * m; i++)
	{
		cout << arr1[i] + arr2[i] << " ";
		if ((i + 1) % m == 0) {
			cout << "\n";
		}
	}
	return 0;
}

1차원 배열로 구현한 코드이다.

 

https://katteniiki.tistory.com/32

 

[백준][C++] 2738 행렬 덧셈

https://www.acmicpc.net/problem/2738 2738번: 행렬 덧셈 첫째 줄에 행렬의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다. 이어서 N개의 줄에 행렬 B의 원소 M개가

katteniiki.tistory.com

위 티스토리에는 동적할당을 이용하여 구현한 코드가 자세히 설명되어있다.

 

 

 

2566. <그림 1>과 같이 9×9 격자판에 쓰여진 81개의 자연수 또는 0이 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 행 몇 열에 위치한 수인지 구하는 프로그램을 작성하시오.

#include <iostream>
using namespace std;
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int arr[9][9];
	int max = -1;
	int n, m;
	for (int i = 0; i < 9; i++)
	{
		for (int j = 0; j < 9; j++)
		{
			cin >> arr[i][j];
			if (max < arr[i][j]) {
				max = arr[i][j];
				n = i+1;
				m = j+1;
			}
		}
	}
	cout << max << "\n" << n << " " << m;
	return 0;
}

간단한 코드이다. 

 

 

 

10798. 아직 글을 모르는 영석이가 벽에 걸린 칠판에 자석이 붙어있는 글자들을 붙이는 장난감을 가지고 놀고 있다. 이 장난감에 있는 글자들은 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’이다. 영석이는 칠판에 글자들을 수평으로 일렬로 붙여서 단어를 만든다. 다시 그 아래쪽에 글자들을 붙여서 또 다른 단어를 만든다. 이런 식으로 다섯 개의 단어를 만든다. 아래 그림 1은 영석이가 칠판에 붙여 만든 단어들의 예이다. 

#include <iostream>
using namespace std;
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	string word[5];
	for (int i = 0; i < 5; i++)
	{
		cin >> word[i];
	}
	for (int j = 0; j < 15; j++)
	{
		for (int i = 0; i < 5; i++)
		{
			if (word[i].length() <= j)
			{
				continue;
			}
			cout << word[i][j];
		}
	}
	return 0;
}

세로로 읽기 위해서 string 배열을 만들고 각 단어의 문자 하나 하나에 접근하는 방식이다.

 

 

 

2563. 가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.

#include <iostream>
using namespace std;
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int num, x, y;
	cin >> num;
	bool paper[100][100] = { 0 };
	int count = 0;
	while (num--) {
		cin >> x >> y;
		for (int i = x; i < x+10; i++)
		{
			for (int j = y; j < y+10; j++)
			{
				if (!paper[i][j])
				{
					count++;
					paper[i][j] = 1;
				}	
			}
		}
	}

	cout << count;
	return 0;
}

도화지가 붙은 부분은 true로 설정해서 새롭게 붙은 부분을 하나씩 추가하여 계산하였다.