1. (2N+1)×(2N+1) 크기의 다이아몬드 패턴 행렬 생성
입력된 정수 N을 기반으로, 총 2N+1 행과 열로 구성된 행렬을 출력한다. 각 영역은 다음과 같은 규칙에 따라 값이 할당된다:
- 주 대각선 및 부 대각선: 값 1
- 상부 삼각형 영역 (주 대각선 위): 값 2
- 하부 삼각형 영역 (주 대각선 아래): 값 3
- 좌측 삼각형 영역 (부 대각선 왼쪽): 값 4
- 우측 삼각형 영역 (부 대각선 오른쪽): 값 5
행렬의 각 위치는 주 대각선과 부 대각선을 기준으로 판단되며, 조건 분기를 통해 적절한 값을 출력한다.
#include <bits/stdc++.h>
using namespace std;
void outputMatrix(int size) {
for (int row = 0; row < size; ++row) {
for (int col = 0; col < size; ++col) {
if (col > 0) cout << " ";
if (row == col || row + col == size - 1) {
cout << 1;
} else if (col > row) {
if (row + col < size - 1) {
cout << 2;
} else {
cout << 5;
}
} else {
if (row + col > size - 1) {
cout << 3;
} else {
cout << 4;
}
}
}
cout << endl;
}
}
int main() {
int n;
while (cin >> n) {
outputMatrix(2 * n + 1);
}
return 0;
}
2. 4명에게 순차적으로 카드 분배하기
모든 가능한 카드(4가지 무늬 × 13개 숫자)를 순서대로 나누어 4명의 플레이어에게 배분한다. 무늬는 c(클럽), d(다이아몬드), h(하트), s(스페이드)로 표시되며, 각 카드는 무늬 숫자 형식으로 출력된다.
카드는 순차적으로 1→2→3→4→1…의 순서로 배분되며, 각 플레이어는 13장의 카드를 보유한다. 입력으로 플레이어 번호가 주어지면 해당 플레이어의 모든 카드를 출력한다.
#include <bits/stdc++.h>
using namespace std;
int main() {
int hands[4][13][2]; // [플레이어][카드 인덱스][0:무늬, 1:숫자]
int cardIndex = 0;
char suits[] = {'c', 'd', 'h', 's'};
for (int suit = 0; suit < 4; ++suit) {
for (int rank = 0; rank < 13; ++rank) {
int player = cardIndex % 4;
hands[player][cardIndex / 4][0] = suits[suit];
hands[player][cardIndex / 4][1] = rank;
cardIndex++;
}
}
int playerNum;
while (cin >> playerNum) {
for (int i = 0; i < 13; ++i) {
printf("%c %d", hands[playerNum - 1][i][0], hands[playerNum - 1][i][1]);
if (i < 12) cout << " ";
}
cout << endl;
}
return 0;
}
3. 숫자 피라미드에서 최대 경로 합 계산
피라미드의 각 줄에는 하나씩 더 많은 숫자가 존재하며, 시작점에서 끝줄까지 내려오면서 매번 아래 또는 아래-오른쪽으로 이동할 수 있다. 이때, 경로 상의 숫자 합이 가장 큰 값을 찾는 문제이다.
동적 프로그래밍을 사용하여, 각 위치까지 도달하는 최대 합을 저장하고, 하단에서부터 상단으로 갱신한다.
#include <bits/stdc++.h>
using namespace std;
int main() {
static int pyramid[1000][1000];
static int dp[1000][1000];
int rows;
cin >> rows;
for (int i = 0; i < rows; ++i) {
for (int j = 0; j <= i; ++j) {
cin >> pyramid[i][j];
}
}
dp[0][0] = pyramid[0][0];
for (int i = 1; i < rows; ++i) {
for (int j = 0; j <= i; ++j) {
if (j == 0) {
dp[i][j] = dp[i-1][j] + pyramid[i][j];
} else {
dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + pyramid[i][j];
}
}
}
int maxSum = 0;
for (int j = 0; j < rows; ++j) {
maxSum = max(maxSum, dp[rows-1][j]);
}
cout << maxSum << endl;
return 0;
}
4. IoT 아키텍처와 응용 분야 개요
IoT(IoT)는 센서 장치들이 모바일 네트워크, 인터넷, 그리고 클라우드 처리 시스템을 통해 다양한 애플리케이션과 연결되는 구조이다. 중간 계층에는 신호 처리 클라우드가 위치하며, 정보의 의미는 전통적인 문법이나 결정론적 모델이 아닌, 서비스 지향 아키텍처(SOA)에 의해 관리될 수 있다.
센서는 원시 데이터를 수집하고, 컴퓨팅 및 스토리지 클라우드, 그리드 기반 처리 시스템을 통해 데이터를 정보 및 지식으로 변환한다. 이러한 정보는 스마트 애플리케이션을 위한 의사결정 시스템에 활용된다. 중간 계층은 세미틱 웹 또는 그리드 네트워크로도 해석될 수 있으며, 일부 서비스나 컴포넌트는 자기 참조 형태로 설계될 수 있다.
주요 응용 분야
- 유통 및 물류: RFID 기술을 통한 재고 정밀 관리, 실시간 손실 감시, 자동 체크아웃 시스템 구현. 특히 온도 민감 제품(식품, 의약품)의 냉장 유통 흐름 모니터링에 필수적.
- 환경 보호: 오염 감지, 기상 예측, 자연재해 예방 및 복구 지원.
- 사회적 편의성: 정부 서비스 자동화, 법 집행 효율성 향상, 가정 내 건강 관리 시스템 발전.