7.31.2019

#include <stdio.h>
#include <iostream>

using namespace std;

int main() {

//Please Enter Your Code Here
int t, m, n, array[16][11];
int number[100];
int num, cnt = 0, hm = 0;

cin >> t;
for (int u = 1; u <= t; u++) {
cin >> m >> n;

for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
cin >> array[i][j];
}
}
num = 0;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (array[i][j] == 1) {
array[i][j] = 5;
if (array[i][j + 1] == 0) array[i][j + 1] = 5;
if (array[i][j - 1] == 0) array[i][j - 1] = 5;
if (array[i - 1][j] == 0) array[i - 1][j] = 5;
if (array[i + 1][j] == 0) array[i + 1][j] = 5;
cnt++;
}
else if (array[i][j] == 2) {
array[i][j] = 6;
if (array[i + 1][j + 1] == 0) array[i + 1][j + 1] = 6;
if (array[i + 1][j - 1] == 0) array[i + 1][j - 1] = 6;
if (array[i - 1][j + 1] == 0) array[i - 1][j + 1] = 6;
if (array[i - 1][j - 1] == 0) array[i - 1][j - 1] = 6;
cnt++;
}
else if (array[i][j] == 3) {
array[i][j] = 7;
if (array[i - 2][j - 2] == 0) array[i - 2][j - 2] = 7;
if (array[i - 2][j] == 0) array[i - 2][j] = 7;
if (array[i - 2][j + 2] == 0) array[i - 2][j + 2] = 7;
if (array[i][j - 2] == 0) array[i][j - 2] = 7;
if (array[i][j + 2] == 0) array[i][j + 2] = 7;
if (array[i + 2][j - 2] == 0) array[i + 2][j - 2] = 7;
if (array[i + 2][j] == 0) array[i + 2][j] = 7;
if (array[i + 2][j + 2] == 0) array[i + 2][j + 2] = 7;
cnt++;
}if (cnt > 2) break;
}
}
for (int a = 1; a <= m; a++) {
for (int b = 1; b <= n; b++) {
if (array[a][b] >= 5) {
num++;
}
cout << array[a][b] << " ";
}cout << endl;
} number[u] = num;
}
for (int index = 1; index <= t; index++) {
cout << index << " " << number[index] << " " << hm << endl;
}
return 0;
}
시간제한 1초

문제


십자 숫자 카드는 아래와 같이 십자 모양으로 생긴 카드를 의미한다. 카드의 상하좌우에는 숫자가 적혀있으며, 이 십자 숫자 카드는 회전이 가능하다.
crossnumber
N개의 숫자 카드가 일렬로 나열되어 있다. 이제 이 카드들을 적절히 회전시킨 상태에 대하여 십자 카드의 인접한 숫자들에 주목하자. 이제 이 인접한 두 숫자에 대하여 "인접값" 을 아래와 같이 계산한다. 십자 카드의 왼쪽 끝과 오른쪽 끝의 숫자에 대해서는 "인접값"이 정의되어 있지 않다.
(1) 두 숫자가 모두 홀수이거나 모두 짝수일 경우, "인접값"은 0이다.
(2) 두 숫자가 하나는 홀수이고 하나는 짝수일 경우 "인접값"은 두 수의 곱이다.
N개의 숫자 카드에 대하여 "십자값"은 모든 "인접값"의 합이다. N개의 숫자 카드가 주어질 때, 숫자 카드들을 적절히 회전시켜 얻을 수 있는 "십자값"의 최댓값을 구하는 프로그램을 작성하시오.

입력


첫 번째 줄에 테스트 케이스의 개수 T가 주어진다. (1 ≤ T ≤ 10) 이후 각각의 테스트 케이스가 주어진다. 각 테스트케이스의 첫 번째 줄에는 십자 숫자 카드의 갯수 N이 주어진다. (1 ≤ N ≤ 10) 이후 N개의 줄에 대하여 카드의 정보가 주어진다. 첫 번째로 입력되는 카드의가 가장 왼쪽에 위치하며, 마지막으로 입력되는 카드가 가장 오른쪽에 위치한다. 각 줄은 4개의 숫자로 이루어져 있으며, 북쪽 숫자, 서쪽 숫자, 동쪽 숫자, 그리고 남쪽 숫자의 순서대로 주어진다. 모든 숫자들은 -100 이상 100이하의 정수이다.

출력


각 테스트케이스 별로 숫자 카드들을 적절히 회전시켜 얻을 수 있는 "십자값"의 최댓값을 출력한다. 각 줄의 첫 번째 숫자는 테스트케이스 번호이며, 두 번째 숫자는 "십자값"의 최댓값이다.

예제 입력

copy
2 3 1 -3 -2 5 2 -3 4 8 9 2 3 5 3 -100 2 4 -100 2 -3 4 8 9 2 3 5

예제 출력

copy
1 82 2 336
시간제한 1초

문제


N x N의 크기의 지도에 지뢰가 매설되어 있다. 지뢰는 1 x 1 크기를 차지하며, 아래와 같이 3가지 종류의 지뢰가 존재한다. 초기에는 지뢰가 매설되어 있기만 한 상태로 존재한다.
missile
각 지뢰에는 번호가 적혀 있으며, 각 지뢰는 위의 그림과 같이 폭발한다. 색칠된 부분은 지뢰 폭발의 영향을 받는 부분이며, 이 부분은 그 잔해로 인해 땅이 새까맣게 타버린다. 만약 색칠된 부분에 지뢰가 있을 경우, 그 지뢰 또한 폭발하게 된다. 이제 이 지도에 최대 2발의 미사일을 쏘려 한다. 한 개의 미사일은 1 x 1 크기의 칸 한 개를 정확하게 폭발시켜 새까맣게 태울 수 있으며, 만약 해당 칸에 지뢰가 있을 경우 그 지뢰는 폭발하게 된다. 최대 2발의 미사일을 쏘아 최대한 지도 위의 많은 칸을 새까맣게 태우고 싶다고 할 때, (1) 그 새까맣게 태울 수 있는 칸의 최댓값과 (2) 해당 최댓값을 얻을 수 있도록 미사일을 발사할 수 있는 서로 다른 모든 경우의 수를 출력하는 프로그램을 작성하시오.

입력


첫 번째 줄에 테스트 케이스의 개수 T가 주어진다. (1 ≤ T ≤ 10) 이후 각각의 테스트 케이스가 주어진다. 각 테스트케이스의 첫 번째 줄에는 지도의 세로 길이 N과 가로 길이 M이 주어진다. (1 ≤ N, M ≤ 15) 이후 N개의 줄에 대하여 지도의 정보가 주어진다. 각 줄은 M개의 숫자로 이루어져 있으며, 0은 지뢰 없음, 1은 1번 지뢰, 2는 2번 지뢰, 3은 3번 지뢰가 해당 칸에 존재함을 나타낸다.

출력


각 테스트케이스 별로 최대 2발의 미사일을 쏘아 새까맣게 태울 수 있는 칸의 갯수의 최댓값을 출력한다. 각 줄의 첫 번째 숫자는 테스트케이스의 번호이며, 두 번째 숫자는 칸의 갯수의 최댓값, 세 번째 숫자는 해당 최댓값을 얻을 수 있도록 미사일을 발사 할 수 있는 서로 다른 모든 경우의 수이다.

예제 입력

copy
3 3 3 0 0 3 0 1 0 0 0 0 5 5 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 7 7 2 0 0 1 0 0 0 0 0 0 1 0 3 0 0 0 0 0 0 0 0 0 0 0 2 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 2

예제 출력

copy
1 9 1 2 6 6 3 28 4

7.29.2019

시간제한 7초

문제


민건이는 원룸 청소하기 너무 귀찮아서 로봇청소기를 하나 구매했다. 로봇 청소기는 원룸 바닥을 돌아다니며, 열심히 바닥에 있는 먼지를 청소한다. 돈이 없는 민건이는 값싼 로봇 청소기를 구매하였다. 해당 로봇 청소기는 원룸 구조를 파악하여 똑똑하게 움직이는 것이 아닌 그냥 벽에 부딪히면 튕겨나온 방향으로 움직이는 무식한(?) 청소기이다. 벽이나 구조물을 만나기 전까지 계속해서 직진만 하며, 벽에 부딪히는 순간 방향을 틀어서 움직인다. 예를 들어, 벽이나 구조물에 부딪히면 다음과 같이 직각 혹은 반대 방향으로 움직인다.
robot_1[그림 1]
구조물은 회전이 가능하며, 현재 [그림 1]의 왼편에 나오는 구조물의 번호는 1번이다. 해당 구조물을 시계 방향으로 90° 회전시킬시 2번, 180° - 3번, 270° - 4번, 360° 는 구조물 1번과 동일하므로 1번이다. [그림 1]의 오른편에 나오는 구조물은 5번으로 붙혔다. 그림으로 표현하면 다음과 같다.
robot_2[그림 2]
무식한(?) 청소기답게 현재 높이보다 낮은 턱에 빠지면 더 이상 움직일 수 없어서 꺼내줘야한다. 낮은 턱의 경우 집 구조 상 어디든 존재하고 원룸 구조도에 “-1”로 표기한다. 또한 특이하게 다른 원룸과 달리 바닥에 5개의 워프 장치가 있는데, 워프 장치 한 쪽으로 갈 경우 다른 한 쪽으로 이동하게 된다.(그래서 바닥에 물건을 떨어뜨리면 찾기가 쉽지않다.) 이때 워프 장치를 통과한 후 진행방향은 워프 진입 직전의 진행 방향과 동일하다. 워프 장치는 번호는 6번부터 10번까지 존재하고, 원룸 구조도에 무조건 한 쌍으로 표기되어있다.
robot_3[그림 3]
robot_4[그림 4]
robot_5[그림 5]robot_6[그림 6]robot_7[그림 7]
[그림 4] 와 같은 원룸 구조도가 주어졌을 때, 로봇청소기의 이동 사례를 살펴보면 다음과 같다. [그림 5] 의 경우 시작지점으로 다시 돌아와서 이동이 종료되었고, [그림 6] 의 경우 낮은 턱에 빠져버려서 이동이 종료되었다. [그림 7] 의 경우 벽에 부딪혀 튕겨져나와, [그림 5] 와 동일하게 시작지점으로 돌아와서 이동이 종료되었다. [그림 5] 의 이동한 칸의 수는 6 이고, [그림 6] 의 이동한 칸의 수는 10 이다. [그림 7] 의 이동한 칸의 수는 4 이다. 시작 위치는 구조물, 워프 장치, 낮은 턱이 될 수 없다. 그 이외의 모든 공간에서는 시작할 수 있다.
원룸 구조는 N x N m2 이며, 로봇 청소기는 한 번에 한 칸씩 움직일 수 있다. 다시 말하면, 1m2 씩 움직일 수 있다. 로봇 청소기가 출발한 위치에 다시 돌아오면 작동을 멈춘다. 혹은 청소 진행 도중에 낮은 턱에 빠져버릴 경우 그대로 작동을 중지한다. 현재 민건이는 로봇청소기가 얼마나 열심히 일하는지 알고싶다. 원룸 구조도가 주어지고, 로봇 청소기가 임의의 위치에서 임의의 방향을 보고 이동을 시작하여, 끝나기까지 한 번이라도 지나간 칸의 수를 D 라고 하였을 때, D 의 최댓값을 구해보자!

입력


첫 번째 줄에 테스트 케이스의 개수 T(5 ≤ T ≤ 50) 가 주어진다. 각 테스트 케이스의 첫째 줄에 N(5 ≤ N ≤ 100) 이 주어지고, N 개의 줄에 걸쳐 N 개의 숫자가 공백을 통해 구분하여 입력된다. 각각의 입력되는 숫자는 -1 부터 10까지의 정수이다. 워프 장치는 최대 5쌍 존재한다. 낮은 턱은 최대 5개 존재할 수 있으며, 최소 1개 존재한다.

출력


각 테스트 케이스에 해당하는 결과값을 “#t result” 포맷으로 출력한다. (t는 1부터 T까지의 정수이다)

예제 입력

copy
3 5 0 4 0 0 0 0 0 3 6 0 0 2 0 0 5 0 0 -1 0 0 0 6 0 1 0 8 0 0 1 1 0 0 0 4 0 0 0 0 0 0 5 0 0 0 0 3 0 0 0 0 2 0 0 4 3 4 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 5 0 0 0 0 5 0 3 0 0 0 0 0 4 0 0 3 1 0 4 1 1 1 1 1 1 -1 1 1 -1 0 -1 1 1 -1 1

예제 출력

copy
#1 10 #2 11 #3 1

시간 제한 3초

문제


자신의 몸이 허약하다고 생각한 정택은 강해지기위해 운동을 하기 시작했다. 알고리즘 피트니스 센터의 센터장인 종민의 조언에 따라 “먹는 것 까지 운동이다.” 라는 철칙을 잘 따르고 있다. 전날 무리하게 운동한 여파로 늦잠을 자게되어, 오늘 먹을 단백질 도시락을 챙길 여유가 없었다. 어제 무리하게 운동한 것이 아까운 정택은 사무실 근처에 있는 편의점을 돌며 얻을 수 있는 최대의 단백질을 확보하려고 한다. 또한 같은 단백질 함양을 가진 제품은 동일한 제품이고, 같은 도시락을 여러 번 먹으면 질리기때문에 서로 다른 제품을 통해 단백질을 섭취하고자 한다. 양기가 가득하고자하는 정택은 편의점을 ‘+’ 모양으로 순회하려고 한다.
protein_1protein_2
위와 같이 편의점 정보가 존재한다고 했을 때, 각 칸에 해당하는 숫자는 해당 편의점에서 얻을 수 있는 단백질의 g 수 이다. 첫 번째 그림에서 얻을 수 있는 서로 다른 종류의 단백질 도시락 개수는 4개이며, 얻을 수 있는 단백질 g 수는 7+2+10+9 로 28 이다. 두 번째 그림에서 얻을 수 있는 서로 다른 종류의 단백질 도시락 개수는 5개이며, 얻을 수 있는 단백질 g 수는 1+3+4+9+10 로 27 이다.
순회 경로의 경우 만약 중앙을 기점으로 봤을 때, 상하좌우 경로의 길이를 서로 달리할 수 있다. 이때 경로의 길이 최솟값은 1로 고정한다. 즉, 하나의 편의점만 들를 수 없고, 직선 형태, 'ㄱ', 'ㄴ' 등의 모양으로 순회를 할 수 없다는 것이다. 예를 들면, 다음과 같이 다양하게 존재할 수 있다.
protein_3protein_3_4protein_4
protein_5protein_6
시작 지점에서 출발하여 다시 시작 지점으로 돌아온다고 했을 때, N * N 의 편의점 단백질 도시락 정보에서 가장 많은 종류의 단백질 도시락을 얻을 수 있는 경로를 찾고, 해당 경로에서 얻을 수 있는 단백질 함량의 합을 구해보자.
편의점 정보가 주어졌을 때, 답을 구하는 과정은 다음과 같다. (총 6가지가 존재하는 것은 아니며, 몇 가지 경우는 생략되었다.)
protein_7protein_8protein_9protein_10protein_11protein_12
마지막 그림에서 얻어지는 숫자의 합 1+2+3+5+6+7+8 인 32 가 정답이다.

입력


첫 번째 줄에 테스트 케이스의 개수 T(5 ≤ T ≤ 50) 가 주어진다. 각 테스트 케이스의 첫째 줄에 N(3 ≤ N ≤ 20) 이 주어지고, N 개의 줄에 걸쳐 N 개의 숫자가 공백을 통해 구분하여 입력된다. 각각의 입력되는 숫자는 1 부터 100 을 포함한 정수이다.

출력


각 테스트 케이스에 해당하는 결과값을 한 줄에 하나씩 “#t result” 포맷으로 출력한다. (t는 1부터 T까지의 정수이다)

예제 입력

copy
5 4 7 8 6 10 9 2 7 1 6 5 1 3 1 7 5 9 10 7 7 5 8 3 1 5 6 4 4 1 8 4 4 4 6 3 7 9 3 8 8 6 7 3 8 5 4 3 7 3 4 1 6 4 3 5 3 2 7 9 9 1 8 3 9 6 4 2 2 4 5 5 7 4 7 1 8 9 6 1 7 7 8 5 2 6 1 5 2 3 9 6 1 8 2 3 4 5 4 2 1 1 2 9 6 1 4 6 6 9 2 4 6 7 1 4 3 8 6 8 4 7 1 6 8 5 8 7 4 5 6 1 9 1 1 8 7 2 1 4 1 7 1 1 3 8 6 2 5 2 5 1 9 8 8 4 8 7 8 9 1 2 2 4 3 3 9 4 3 9 3 2 2 8 5 9 4 3 4 2 3 4 6 6 6 5 3 9 3 7 5 9 4 9 1 5 4 3 3 7 8 1 6 6 8 7 3 3 3 1 3 9 8 5 6 1 1 3 7 6 3 4 7 7 3 6 1 3 2 1 9 6 1 8 2 2 2 2

예제 출력

copy
#1 32 #2 45 #3 45 #4 39 #5 36

[C++] Number Pyramid-1




문제


N과 시작 숫자 S가 주어지면 숫자 피라미드를 만드는 프로그램을 작성하시오.
예를 들어, N이 5이고 S가 3 이라면, 그 숫자 피라미드는 다음과 같다.
copy
3 456 78921 3456789 123456789

Input


입력의 첫 번째 줄에 N과 시작 숫자 S가 주어진다. ( 1≤N≤100, 1 ≤S≤ 9)

Print


첫 번째 줄부터 숫자 피라미드를 출력한다. (각 줄에 존재하는 공백의 개수와 숫자의 개수를 정확하게 확인해주시바랍니다.)

Input Example

copy
5 3

Print Example

copy
3 456 78912 3456789 123456789


#include <iostream>

using namespace std;

int main() {
int layer, start;
cin >> layer >> start;

int arr[1010]; //layer*layer
for (int i = 1; i <= layer; i++) {
for (int j = 0; j < layer - i; j++) {
cout << " ";
}
for (int k = 1; k <= i * 2 - 1; k++) {
if (start > 9) start = 1;
arr[k] = start;
cout << arr[k];
start++;
}cout << endl;
}
}

[C++] 첫째 줄에 세 번째 최소값을 출력하고, 둘째 줄에 세 번째 최소값이 몇 번째 수인지를 출력하기

입력

첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 10,000,000 보다 작다.

출력


첫째 줄에 세 번째 최소값을 출력하고, 둘째 줄에 세 번째 최소값이 몇 번째 수인지를 출력한다.

예제 입력

copy
5 29 38 12 57 74 40 99 61

예제 출력

copy
12 4


#include <stdio.h>
#include <iostream>

using namespace std;

int main() {

//Please Enter Your Code Here
int temp = 0, cnt = 1;
int array[12], array2[12];
for (int i = 0; i < 9; i++) {
cin >> array[i];
}
for (int i = 0; i < 9; i++) {
array2[i] = array[i];
}

for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9 - i - 1; j++) {
if (array[j + 1] < array[j]) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}

cout << array[2] << endl;
for (int p = 0; p < 9; p++) {
if (array[2] == array2[p]) {
cout << cnt;
}
cnt++;
}

return 0;
}