/* 문제 : [11399] ATM
[input]
5
3 1 4 3 2
[output]
32
[설명]
줄을 서 있는 사람의 수 N과 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다.
총 5명이 있고, P1 = 3, P2 = 1, P3 = 4, P4 = 3, P5 = 2이 입력됬을 때
[1, 2, 3, 4, 5] 순서로 줄을 선다면, 3, 3+1, 3+1+4, 3+1+4+3, 3+1+4+3+2 = 총 39분
[2, 5, 1, 4, 3] 순서로 줄을 선다면, 1, 1+2, 1+2+3, 1+2+3+3, 1+2+3+3+4 = 총 32분이다.
이 때, 필요한 시간의 합의 최솟값을 구하는 프로그램을 작성해라.
*/
#include <iostream>
#include <list>
using namespace std;
int main()
{
list<int> numList;
int n, sum = 0;
// 줄은 선 사람 입력
cin >> n;
// 그 사람들의 각각 작업완료시간 입력
for (int i = 0, k; i < n; i++) {
cin >> k;
numList.push_back(k);
}
// 작업완료시간 오름차순 정렬
numList.sort();
for (int i = 0, k = 0; i < numList.size(); i++) {
list<int>::iterator iter = numList.begin();
while (iter != numList.end() && (k <= i)) {
sum += *iter;
iter++;
k++;
}
k = 0;
}
cout << sum;
return 0;
}
URL : https://codeup.kr/problemsetsol.php?psid=23
/*
문제 : 성실한 개미
[input]
1 1 1 1 1 1 1 1 1 1
1 0 0 1 0 0 0 0 0 1
1 0 0 1 1 1 0 0 0 1
1 0 0 0 0 0 0 1 0 1
1 0 0 0 0 0 0 1 0 1
1 0 0 0 0 1 0 0 0 1
1 0 0 0 0 1 2 0 0 1
1 0 0 0 0 1 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1
[output]
1 1 1 1 1 1 1 1 1 1
1 9 9 1 0 0 0 0 0 1
1 0 9 1 1 1 0 0 0 1
1 0 9 9 9 9 9 1 0 1
1 0 0 0 0 0 9 1 0 1
1 0 0 0 0 1 9 9 9 1
1 0 0 0 0 1 2 0 9 1
1 0 0 0 0 1 0 0 9 1
1 0 0 0 0 0 0 0 9 1
1 1 1 1 1 1 1 1 1 1
[설명]
10 * 10 크기의 미로 상자의 구조와 먹이의 위치가 입력되면
성실한 개미가 이동한 경로를 9로 표시해 출력한다.
개미집은 반드시 (2, 2)에서 시작된다.
개미는 먹이(2)를 찾았거나, 더 이상 움직일 수 없을 때까지 오른쪽 또는 아래쪽으로만 움직였다.
미로 상자의 구조가 0(갈 수 있는 곳), 1(벽 또는 장애물)로 주어지고,
먹이가 2로 표시되어 주어질 때, 똑똑한 개미의 이동 경로를 예상해보자.
단, 가장 아래의 가장 오른쪽에 도착한 경우나, 더 이상 움직일 수 없는 경우,
또는 먹이를 찾은 경우에는 그 곳에 머무른다고 가정한다.
미로의 테두리는 모두 벽으로 되어있다.
*/
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
int a[10][10], failCount = 0;
srand((unsigned int)time(NULL));
// 개미굴 입력
for (int i = 0; i < 10; i++) {
for (int k = 0; k < 10; k++) {
cin >> a[i][k];
}
}
int start_x = 1;
int start_y = 1;
a[start_x][start_y] = 9;
while (true)
{
// 오른쪽과 아래 둘 다 갈 수 있을 경우만 난수생성
if (!(a[start_x + 1][start_y] == 1) && !(a[start_x][start_y + 1] == 1)) {
if (rand() % 2 == 0) // 랜덤으로 0이 나오면 아래로
{
if (a[start_x][start_y + 1] == 2) { // 보물인 경우
cout << "보물을 찾았습니다." << endl;
break;
}
else {
a[start_x + 1][start_y] = 9;
start_x++;
}
}
else // 1이 나오면 오른쪽으로
{
if (a[start_x + 1][start_y] == 2) { // 보물인 경우
cout << "보물을 찾았습니다." << endl;
break;
}
else {
a[start_x][start_y + 1] = 9;
start_y++;
}
}
}
// 오른쪽만 갈 수 있으면 오른쪽으로 이동
else if (!(a[start_x + 1][start_y] == 1)) {
a[start_x + 1][start_y] = 9;
start_x++;
}
// 아래쪽만 갈 수 있으면 아래쪽으로 이동
else if (!(a[start_x][start_y + 1] == 1)) {
a[start_x][start_y + 1] = 9;
start_y++;
}
// 둘 다 갈 수 없으면
else {
cout << "더 이상 이동할 수 없습니다." << endl;
break;
}
}
// 개미굴 출력
for (int i = 0; i < 10; i++) {
for (int k = 0; k < 10; k++) {
cout << a[i][k] << " ";
}
cout << endl;
}
return 0;
}
URL : https://codeup.kr/problemsetsol.php?psid=23
/* 문제 : 설탕과자 뽑기
input : 5 5
3
2 0 1 1
3 1 2 3
4 1 2 5
output : 1 1 0 0 0
0 0 1 0 1
0 0 1 0 1
0 0 1 0 1
0 0 0 0 1
설명 : 세로(h), 가로(w)
막대의 개수(n)
각 막대의 길이(l), 방향(d), 좌표(x, y) 입력
1 <= w, h <= 100
1 <= n <= 10
d = (0 or 1)
1 <= x <= w
1 <= y <= h
단, 막대가 격자판을 벗어나는 경우는 입력되지 않는다.
*/
#include <iostream>
using namespace std;
int Condition_Check(int l, int d, int x, int y, int h, int w);
int main()
{
const int max_width = 101;
const int max_height = 101;
int a[max_width][max_height] = {0};
int h, w, n, l, d, x, y;
cin >> h >> w;
cin >> n;
if (!(w >= 1) || !(h <= 100) || !((n >= 1) && (n <= 10))) {
cout << "입력조건 불일치" << endl;
return -1;
}
for (int i = 0; i < n; i++) {
cin >> l >> d >> x >> y;
if (Condition_Check(l, d, x, y, h, w) == -1) {
cout << "입력조건 불일치" << endl;
return -1;
}
for (int k = 0; k < l; k++) {
if (d == 1)
a[x - 1 + k][y - 1] = 1;
else
a[x - 1][y - 1 + k] = 1;
}
}
// 결과 출력
for (int i = 0; i < h; i++) {
for (int k = 0; k < w; k++) {
cout << a[i][k] << " ";
}
cout << endl;
}
return 0;
}
int Condition_Check(int l, int d, int x, int y, int h, int w)
{
if (!((d == 0) || (d == 1)) ||
!((x >= 1) && (x <= w)) ||
!((y >= 1) && (y <= h)))
return -1;
else
return 0;
}
URL : https://codeup.kr/problemsetsol.php?psid=23
// 바둑알 십자 뒤집기
// input : 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
// 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
// 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
// 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
// 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
// 2
// 10 10
// 12 12
/* output : 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 */
/* 설명 : 바둑알이 깔려 있는 상황이 19×19 로 입력된다.
십자바꾸기 횟수(n)가 입력된다.
십자바꾸기 좌표가 횟수(n) 만큼 입력되고
십자 바꾸기 결과를 출력한다.
*/
#include <iostream>
using namespace std;
int main()
{
int badook[19][19] = { 0 };
int n, x, y;
// 바둑알이 깔려 있는 상황 입력받기
for (int i = 0; i < 19; i++) {
for (int k = 0; k < 19; k++) {
cin >> badook[i][k];
}
}
// 십자바꾸기 횟수 입력받기
cin >> n;
// 가로, 세로줄 흑백 변경
for (int s = 0; s < n; s++) {
cin >> x >> y;
for (int i = 0; i < 19; i++) {
badook[x - 1][i] == 0 ? badook[x - 1][i] = 1 : badook[x - 1][i] = 0;
badook[i][y - 1] == 0 ? badook[i][y - 1] = 1 : badook[i][y - 1] = 0;
}
}
// 십자 바꾸기 결과 출력
for (int i = 0; i < 19; i++) {
for (int k = 0; k < 19; k++) {
cout << badook[i][k] << " ";
}
cout << endl;
}
return 0;
}
URL : https://codeup.kr/problemsetsol.php?psid=23
// 바둑판에 흰돌 놓기
// input : 5
// 1 1
// 2 2
// 3 3
// 4 4
// 5 5
// output : 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 설명 :
#include <iostream>
using namespace std;
int main()
{
int badook[19][19] = { 0 };
int n;
cin >> n;
for (int s = 0, i, k; s < n; s++)
{
cin >> i >> k;
badook[i - 1][k - 1] = 1;
}
for (int i = 0; i < 19; i++) {
for (int k = 0; k < 19; k++) {
cout << badook[i][k] << " ";
}
cout << endl;
}
return 0;
}
URL : https://codeup.kr/problemsetsol.php?psid=23
// 이상한 출석 번호 부르기3
// input : 10
// 10 4 2 3 6 6 7 9 8 5
// output : 2
// 설명 : 출석 번호를 n번 무작위로 불렀을 때, 부른 번호를 거꾸로 출력
#include <iostream>
using namespace std;
int main()
{
int n, min = INT_MAX;
cin >> n;
for (int i = 0, inputNum; i < n; i++)
{
cin >> inputNum;
if (min > inputNum)
min = inputNum;
}
cout << min;
return 0;
}