https://www.acmicpc.net/problem/7576

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net


풀이

  • bfs를 실행하게 되면 배열을 해당 모습으로 값이 변한다.

익은 토마토를 큐에 집어넣고 탐색했을 때의 배열 상태

  • 1(익은 토마토)가 담겨있는 곳을 큐에 담는다.
  • 주변에 0(익지 않은 토마토)이 존재할 때  하루 지났다는 의미로 해당 위치에 1을 증가시킨 값을 집어넣는다.
  • 배열에 있는 최대값을 저장하여 1을 빼준 값이 토마토가 모두 익은 날이 된다.

코드

#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>

using namespace std;

#define MAX 1001
#define _X first
#define _Y second

int board[MAX][MAX];

int dx[4] = { 1, -1, 0, 0 };
int dy[4] = { 0, 0, -1, 1 };

int M, N;	// 가로, 세로
int maxDay = 0;
int day = 0;

queue<pair<int, int>> q;

void Bfs()
{
	while (!q.empty())
	{
		pair<int, int> cur = q.front();
		int x = cur._X;
		int y = cur._Y;

		q.pop();

		for (int i = 0; i < 4; i++)
		{
			int nx = x + dx[i];
			int ny = y + dy[i];

			if (nx < 0 || nx >= N || ny < 0 || ny >= M) continue;	// 범위를 벗어났다면
			if (board[nx][ny] == -1) continue;						// 토마토가 없다면

			// 익지 않은 토마토가 있을 경우, 
			if (board[nx][ny] == 0)
			{
				board[nx][ny] = board[x][y] + 1;
				q.push({ nx, ny });
			}
		}
	}
}

// 익지 않은 토마토가 있는지 확인하고 모두 익었으면 일수 출력
void CheckBoard()
{
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < M; j++)
		{
			// 익지 않은 토마토가 있을 때는 -1 출력 후 for문 탈출
			if (board[i][j] == 0)
			{
				cout << -1;
				return;
			}
			// 배열의 값을 저장하는 day 변수가 최대 일수보다 크다면 바꿔준다.
			day = board[i][j];
			if (maxDay < day)
				maxDay = day;
		}
	}
	// 익은 토마토가 1이기 때문에 일수를 구하기 위해서는 1을 빼줘야 한다.
	cout << maxDay - 1;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);

	// 가로, 세로 입력
	cin >> M >> N;

	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < M; j++)
		{
			// 배열 입력
			cin >> board[i][j];
		}
	}

	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < M; j++)
		{
			if (board[i][j] == 1)
			{
				// 익은 토마토가 있으면 큐에 넣음
				q.push({ i, j });
			}
		}
	}

	Bfs();
	CheckBoard();

	return 0;
}

'C++ > BFS, DFS' 카테고리의 다른 글

[C++] 백준 2606 - 바이러스  (0) 2022.12.25
[C++] 백준 7569 - 토마토 (3차원)  (0) 2022.12.12
[C++] 백준 5014 - 스타트 링크  (0) 2022.12.06
[c++] 백준 2468 - 안전 영역  (1) 2022.12.06
[C++] 백준 10026 - 적록색약  (0) 2022.12.05

https://www.acmicpc.net/problem/5014

 

5014번: 스타트링크

첫째 줄에 F, S, G, U, D가 주어진다. (1 ≤ S, G ≤ F ≤ 1000000, 0 ≤ U, D ≤ 1000000) 건물은 1층부터 시작하고, 가장 높은 층은 F층이다.

www.acmicpc.net

 
 

문제

강호는 코딩 교육을 하는 스타트업 스타트링크에 지원했다. 오늘은 강호의 면접날이다. 하지만, 늦잠을 잔 강호는 스타트링크가 있는 건물에 늦게 도착하고 말았다.

스타트링크는 총 F층으로 이루어진 고층 건물에 사무실이 있고, 스타트링크가 있는 곳의 위치는 G층이다. 강호가 지금 있는 곳은 S층이고, 이제 엘리베이터를 타고 G층으로 이동하려고 한다.

보통 엘리베이터에는 어떤 층으로 이동할 수 있는 버튼이 있지만, 강호가 탄 엘리베이터는 버튼이 2개밖에 없다. U버튼은 위로 U층을 가는 버튼, D버튼은 아래로 D층을 가는 버튼이다. (만약, U층 위, 또는 D층 아래에 해당하는 층이 없을 때는, 엘리베이터는 움직이지 않는다)

강호가 G층에 도착하려면, 버튼을 적어도 몇 번 눌러야 하는지 구하는 프로그램을 작성하시오. 만약, 엘리베이터를 이용해서 G층에 갈 수 없다면, "use the stairs"를 출력한다.

입력

첫째 줄에 F, S, G, U, D가 주어진다. (1 ≤ S, G ≤ F ≤ 1000000, 0 ≤ U, D ≤ 1000000) 건물은 1층부터 시작하고, 가장 높은 층은 F층이다.

출력

첫째 줄에 강호가 S층에서 G층으로 가기 위해 눌러야 하는 버튼의 수의 최솟값을 출력한다. 만약, 엘리베이터로 이동할 수 없을 때는 "use the stairs"를 출력한다.

예제 입력 1 복사

10 1 10 2 1

예제 출력 1 복사

6

예제 입력 2 복사

100 2 1 1 0

예제 출력 2 복사

use the stairs

Code

#include <iostream>
#include <queue>
#include <cstring>
#include <vector>

using namespace std;

#define MAX 1000001
#define _X first
#define _Y second

int visited[MAX];

int F;		// 꼭대기 층
int S;		// 강호가 있는 층
int G;		// 이동하려는 층
int U, D;	// 위로 몇 층? 아래로 몇 층?

queue<int> q;

void Bfs()
{
	q.push(S);
	visited[S] = 0;

	while (!q.empty())
	{
		int cur = q.front();
		q.pop();
		
		// 도착했으면 이동횟수 출력
		if (cur == G)
		{
			cout << visited[cur];
			return;
		}

		for (int i = 0; i < 2; i++)
		{
			// 아래, 위 방향 벡터
			int dir[2] = { -D, U };
			int next = cur + dir[i];

			// 1층 미만/최상층 이상, 방문한 곳이라면 무시한다.
			if (next <= 0 || next > F || visited[next] != -1) continue; 
			// 이동 횟수를 증가시켜 값을 저장시킨다.
			visited[next] = visited[cur] + 1;
			q.push(next);
		}
	}
	// 이동하려는 층에 도달하지 못했을 경우 출력된다.
	cout << "use the stairs";
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	cin >> F >> S >> G >> U >> D;
	
	// 방문 처리를 위해 전부 -1로 초기화한다.
	memset(visited, -1, sizeof(visited));

	Bfs();

	return 0;
}

 

'C++ > BFS, DFS' 카테고리의 다른 글

[C++] 백준 7569 - 토마토 (3차원)  (0) 2022.12.12
[C++] 백준 7576 - 토마토  (0) 2022.12.11
[c++] 백준 2468 - 안전 영역  (1) 2022.12.06
[C++] 백준 10026 - 적록색약  (0) 2022.12.05
[C++] 백준 1303 - 전투  (0) 2022.11.30

https://www.acmicpc.net/problem/2468

 

2468번: 안전 영역

재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는

www.acmicpc.net

  • *max_element(vector<int> first, vector<int> last): 벡터가 가지고 있는 요소 중 가장 큰 값을 참조한다. 가장 작은 값을 받아오고 싶을 경우 '*min_element'를 사용하면 된다.

사용 예시

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    vector<int> v;

    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    v.push_back(50);

    int maxIdx = max_element(v.begin(), v.end()) - v.begin();
    int max = *max_element(v.begin(), v.end());

    int minIdx = min_element(v.begin(), v.end()) - v.begin();
    int min = *min_element(v.begin(), v.end());

    cout << "최대값의 인덱스: " << maxIdx << endl;
    cout << "최대값: " << max << endl;
    cout << "최소값의 인덱스: " << minIdx << endl;
    cout << "최소값: " << min << endl;
}

// 결과
//최대값의 인덱스: 4
//최대값: 50
//최소값의 인덱스: 0
//최소값: 10

 

코드

#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>

using namespace std;

#define MAX 100
#define _X first
#define _Y second

int board[MAX][MAX];
bool visited[MAX][MAX];

int dx[4] = { 1, -1, 0, 0 };
int dy[4] = { 0, 0, -1, 1 };

int N;
int maxHeight = -1;     // 최대 높이 초기화

vector<int> vecArea;    // 각 높이에 대한 영역의 수 저장

void Dfs(int x, int y, int h)
{
    visited[x][y] = true;

    for (int i = 0; i < 4; i++)
    {
        int nx = x + dx[i];
        int ny = y + dy[i];
        
        if (nx < 0 || nx >= N || ny < 0 || ny >= N) continue;
        if (visited[nx][ny] || board[nx][ny] <= h) continue;
        visited[nx][ny] = true;
        Dfs(nx, ny, h);
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    cin >> N;

    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            // 배열 입력
            cin >> board[i][j];
            
            // 최대 높이 저장
            if (maxHeight < board[i][j])
                maxHeight = board[i][j];
        }
    }

    int area = 0;
    int maxArea = 0;

    // 높이가 1부터 최대 높이의 횟수만큼 물에 잠기지 않는 구역을 탐색
    for (int h = 1; h <= maxHeight; h++)
    {
        // 방문 배열 초기화
        memset(visited, false, sizeof(visited));

        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {
                if (board[i][j] > h && !visited[i][j])
                {
                    Dfs(i, j, h);
                    area++;
                }
            }
        }
        
        // 모든 높이에 대해 잠기지 않는 영역을 벡터에 저장
        vecArea.push_back(area);

        // 아무 지역도 물에 잠기지 않았을 경우 1로 세팅
        if (area == 0) vecArea.push_back(1);

        // 영역 초기화
        area = 0;
    }

    // 벡터 컨테이너의 최대값 구함
    int max = *max_element(vecArea.begin(), vecArea.end());
    cout << max;

    return 0;
}

 

'C++ > BFS, DFS' 카테고리의 다른 글

[C++] 백준 7576 - 토마토  (0) 2022.12.11
[C++] 백준 5014 - 스타트 링크  (0) 2022.12.06
[C++] 백준 10026 - 적록색약  (0) 2022.12.05
[C++] 백준 1303 - 전투  (0) 2022.11.30
[C++] 백준 1012 - 유기농 배추  (1) 2022.11.30

https://www.acmicpc.net/problem/10026

 

10026번: 적록색약

적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)

www.acmicpc.net

  • 적록색약인 사람은 붉은색과 초록색을 같은 색으로 보기 때문에 기존에 입력했던 2차원 배열에서 'G' 값을 'R'로 변경하여 한번 더 BFS를 실행하였음

코드

#include <iostream>
#include <cstring>
#include <queue>

using namespace std;

#define MAX 101
#define _X first
#define _Y second

char board[MAX][MAX];
bool visited[MAX][MAX];
int dx[4] = { 1, -1, 0, 0 };
int dy[4] = { 0, 0, -1, 1 };

int N;
char color;
int rgbCount, colorBlindCount;

void Bfs(int x, int y, char color)
{
    queue<pair<int, int>> q;
    q.push({ x, y });
    visited[x][y] = true;

    while (!q.empty())
    {
        pair<int, int> cur = q.front();
        q.pop();

        for (int i = 0; i < 4; i++)
        {
            int nx = cur._X + dx[i];
            int ny = cur._Y + dy[i];

            if (board[nx][ny] != color || visited[nx][ny]) continue;
            if (nx < 0 || nx >= N || ny < 0 || ny >= N) continue;

            q.push({ nx, ny });
            visited[nx][ny] = true;
        }
    }
}

// bfs 실행하여 총 그림 영역의 수를 반환하는 함수이다.
int GetCount(char arr[][MAX])
{
    int cnt = 0;

    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            color = arr[i][j];
            if (!visited[i][j] && arr[i][j] == color)
            {
                Bfs(i, j, color);
                cnt++;  
            }
        }
    }

    return cnt;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    // 크기 입력
    cin >> N;

    // 그림 입력
    for (int i = 0; i < N; i++)
    {
        string str;
        cin >> str;
        for (int j = 0; j < N; j++)
        {
            board[i][j] = str[j];
        }
    }

    // 적록색약이 아닌 사람이 보는 그림 영역의 수 구하기
    rgbCount = GetCount(board);

    // 방문 배열 초기화
    memset(visited, false, sizeof(visited));

    // 적록색약인 사람은 붉은색=초록색으로 인식하기 때문에
    // 초록색 그림이 위치한 곳을 붉은색 그림으로 변경
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            if (board[i][j] == 'G')
                board[i][j] = 'R';
        }
    }

    // 적록색약인 사람이 보는 그림 영역의 수 구하기
    colorBlindCount = GetCount(board);

    // 출력
    cout << rgbCount << ' ' << colorBlindCount;
}

'C++ > BFS, DFS' 카테고리의 다른 글

[C++] 백준 5014 - 스타트 링크  (0) 2022.12.06
[c++] 백준 2468 - 안전 영역  (1) 2022.12.06
[C++] 백준 1303 - 전투  (0) 2022.11.30
[C++] 백준 1012 - 유기농 배추  (1) 2022.11.30
[C++] 백준 1260 - BFS와 DFS  (0) 2022.11.28

https://www.acmicpc.net/problem/1303

 

1303번: 전쟁 - 전투

첫째 줄에는 전쟁터의 가로 크기 N, 세로 크기 M(1 ≤ N, M ≤ 100)이 주어진다. 그 다음 두 번째 줄에서 M+1번째 줄에는 각각 (X, Y)에 있는 병사들의 옷색이 띄어쓰기 없이 주어진다. 모든 자리에는

www.acmicpc.net

코드

#include <iostream>
#include <cmath>
#include <queue>
#include <cstring>

#define MAX 101
#define X first
#define Y second

using namespace std;

char board[MAX][MAX];
bool visited[MAX][MAX];

int dx[] = { 1, -1, 0, 0 };
int dy[] = { 0, 0, -1, 1 };

int N, M;				// 가로, 세로
char color;				// 병사의 옷 색 
int white, blue, cnt;	// 해당 색상 병사의 위력, 병사의 수

queue<pair<int, int>> q;

int Bfs(int x, int y, char color)
{
	cnt = 1;
	q.push({ x, y });
    visited[x][y] = true;

	while (!q.empty())
	{
		pair<int, int> cur = q.front();
		q.pop();

		for (int i = 0; i < 4; i++)
		{
			int nx = cur.X + dx[i];
			int ny = cur.Y + dy[i];

			if (nx < 0 || nx >= M || ny < 0 || ny >= N) continue;
			if (board[nx][ny] != color || visited[nx][ny]) continue;

			q.push({ nx, ny });
			visited[nx][ny] = true;
			cnt++;
		}
	}
	
	// 병사의 수를 제곱하여 위력을 구하여 반환
	int power = pow(cnt, 2);
	return power;
}

int main()
{
    cin >> N >> M;

	for (int i = 0; i < M; i++)
	{
		cin >> board[i];
	}

	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			if (board[i][j] == 'W' && !visited[i][j])
			{
				color = board[i][j];
				white += Bfs(i, j, color);
			}
			
			else if (board[i][j] == 'B' && !visited[i][j])
			{
				color = board[i][j];
				blue += Bfs(i, j, color);
			}
		}
	}
	cout << white << ' ' << blue;
}

'C++ > BFS, DFS' 카테고리의 다른 글

[C++] 백준 5014 - 스타트 링크  (0) 2022.12.06
[c++] 백준 2468 - 안전 영역  (1) 2022.12.06
[C++] 백준 10026 - 적록색약  (0) 2022.12.05
[C++] 백준 1012 - 유기농 배추  (1) 2022.11.30
[C++] 백준 1260 - BFS와 DFS  (0) 2022.11.28

https://www.acmicpc.net/problem/1012

 

1012번: 유기농 배추

차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 

www.acmicpc.net

  • memset(메모리, 변경하고 싶은 값, 길이): 메모리 초기화 함수로 어떤 메모리의 첫 위치에서부터 지정한 길이를 원하는 값으로 바꾼다. ex. 배열을 전부 초기화하고 싶을 때 sizeof(배열) 함수와 함께 사용
#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    int arr[5] = { 1,2,3,4,5 };

	for (int i = 0; i < 5; i++)
	{
		cout << arr[i] << " ";		// 1 2 3 4 5
	}

	cout << endl;

	memset(arr, 0, sizeof(arr));

	for (int i = 0; i < 5; i++)
	{
		cout << arr[i] << " ";		// 0 0 0 0 0
	}
}

코드

#include <iostream>
#include <queue>
#include <cstring>

#define X first
#define Y second
#define MAX 51

using namespace std;

int board[MAX][MAX];
bool visited[MAX][MAX];

int dx[] = { 1, -1, 0, 0 };
int dy[] = { 0, 0, -1, 1 };

// T: 테스트 케이스 개수, M: 가로, N: 세로, K: 배추 개수
int T, M, N, K;

queue<pair<int, int>> q;

void Bfs(int x, int y)
{
    q.push({ x, y });
    visited[x][y] = true;

    while (!q.empty())
    {
        pair<int, int> cur = q.front();
        q.pop();

        for (int i = 0; i < 4; i++)
        {
            int nx = cur.X + dx[i];
            int ny = cur.Y + dy[i];

            // 배열 벗어나면 탐색 안 함
            if (nx < 0 || nx >= N || ny < 0 || ny >= M)
                continue;
            
            // 배추 없거나 이미 방문한 곳은 탐색 안 함
            if (board[nx][ny] != 1 || visited[nx][ny]) 
                continue;

            // 그 외 인접한 공간에 배추 있으면 큐에 넣고 방문 처리
            q.push({ nx, ny });
            visited[nx][ny] = true;
        }
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> T;
    
    for (int i = 0; i < T; i++)
    {
        cin >> M >> N >> K;
        // 배열 초기화
        memset(board, 0, sizeof(board));
        memset(visited, false, sizeof(visited));

        // 배추가 있는 좌표값 입력 받기
        for (int i = 0; i < K; i++)
        {
            int x, y;
            cin >> x >> y;
            board[y][x] = 1;
        }

        // 지렁이의 수
        int cnt = 0;

        // 배열 탐색하며 배추가 있고 방문하지 않았다면 BFS 실행
        for (int n = 0; n < N; n++)
        {
            for (int m = 0; m < M; m++)
            {
                if (board[n][m] == 1 && !visited[n][m])
                {
                    Bfs(n, m);
                    cnt++;  // 한 배추 구역의 탐색이 종료되면 지렁이 수 1 증가
                }
            }
        }

        /*for (int n = 0; n < N; n++)
        {
            for (int m = 0; m < M; m++)
            {
                cout << board[n][m] << ' ';
            }
            cout << endl;
        }*/

        // 구역의 수 출력
        cout << cnt << "\n";
    }
}

'C++ > BFS, DFS' 카테고리의 다른 글

[C++] 백준 5014 - 스타트 링크  (0) 2022.12.06
[c++] 백준 2468 - 안전 영역  (1) 2022.12.06
[C++] 백준 10026 - 적록색약  (0) 2022.12.05
[C++] 백준 1303 - 전투  (0) 2022.11.30
[C++] 백준 1260 - BFS와 DFS  (0) 2022.11.28

https://www.acmicpc.net/problem/1260

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

#include <iostream>
#include <queue>
#include <stack>
#include <vector>
#include <algorithm>

using namespace std;
#define MAX 1001

int N, M, V;            // N: 정점, M: 간선, V: 시작 정점 번호
vector<int> vec[MAX];   // 인접 리스트
bool visited[MAX];      // 정점 방문 체크
queue<int> q;
stack<int> s;

// 재귀 함수 사용
void DFS_Recursion(int v)
{
    visited[v] = true;
    cout << v << " ";

    // vec[v]와 연결된 수만큼 반복
    for (int i = 0; i < vec[v].size(); i++)
    {
        int next = vec[v][i];
        if (visited[next] == false)
        {
            DFS_Recursion(next);
        }
    }
}

// 스택 사용
void DFS(int v)
{
    s.push(v);

    while (!s.empty())
    {
        // 가장 위에 있는 요소 저장하고 빼기
        v = s.top();
        s.pop();

        if (visited[v]) continue;
        visited[v] = true;
        cout << v << " ";  

        // vec[v]와 연결된 수만큼 반복
        for (int i = 0; i < vec[v].size(); i++)
        {
            // 스택의 선입후출 특징 때문에 역순으로 넣어주기 
            int next = vec[v][vec[v].size() - 1 - i];
            if (visited[next] == false)
            {
                if (visited[next]) continue;
                s.push(next);
            }
        }
        
    }
}

void BFS(int v)
{
    // 현재 정점을 큐에 넣고 방문처리
    q.push(v);
    visited[v] = true;

    while (!q.empty())
    {
        // 가장 앞에 있는 요소 저장하고 빼기
        v = q.front();
        q.pop();
        cout << v << " ";  

        for (int i = 0; i < vec[v].size(); i++)
        {
            int next = vec[v][i];
            if ( visited[next] == false)
            {
                q.push(next);
                visited[next] = true;
            }
        }
    }
}

// 방문 처리 초기화 함수
void ResetVisited()
{
    for (int i = 1; i <= N; i++)
        visited[i] = false;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> N >> M >> V;

    for (int i = 0; i < M; i++)
    {
        int from, to;
        cin >> from >> to;
        vec[from].push_back(to);
        vec[to].push_back(from);
    }

    // 오름차순 정렬 - 작은 숫자부터 방문해야 하기 때문이다
    for (int i = 1; i <= N; i++)
        sort(vec[i].begin(), vec[i].end());

    ResetVisited();
    DFS(V);

    cout << '\n';

    ResetVisited();
    BFS(V);
}

'C++ > BFS, DFS' 카테고리의 다른 글

[C++] 백준 5014 - 스타트 링크  (0) 2022.12.06
[c++] 백준 2468 - 안전 영역  (1) 2022.12.06
[C++] 백준 10026 - 적록색약  (0) 2022.12.05
[C++] 백준 1303 - 전투  (0) 2022.11.30
[C++] 백준 1012 - 유기농 배추  (1) 2022.11.30

https://www.acmicpc.net/problem/10814

 

10814번: 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을

www.acmicpc.net

  • stable_sort(): 동일한 값이 있을 경우 입력 순서를 보존하여 정렬
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

bool Comp(pair<int, string> p1, pair<int, string> p2)
{
    return p1.first < p2.first;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int n;
    int age;
    string name;
    cin >> n;

    vector<pair<int, string>> user;

    for (int i = 0; i < n; i++)
    {
        cin >> age >> name;
        user.push_back({ age, name });
    }

    stable_sort(user.begin(), user.end(), Comp);

    for (int i = 0; i < n; i++)
    {
        cout << user[i].first << ' ' << user[i].second << '\n';
    }
}

https://www.acmicpc.net/problem/11931

 

11931번: 수 정렬하기 4

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);

	int n;
	int num;
	vector<int> v;

	cin >> n;

	for (int i = 0; i < n; i++)
	{
		cin >> num;
		v.push_back(num);
	}

	sort(v.begin(), v.end(), greater<int>());

	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << '\n';
	}

}

https://www.acmicpc.net/problem/2822

 

2822번: 점수 계산

8개 줄에 걸쳐서 각 문제에 대한 참가자의 점수가 주어진다. 점수는 0보다 크거나 같고, 150보다 작거나 같다. 모든 문제에 대한 점수는 서로 다르다. 입력으로 주어지는 순서대로 1번 문제, 2번 문

www.acmicpc.net

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    int score;
    int sum = 0;
    vector<pair<int, int>> v;
    vector<int> idx;

    for (int i = 0; i < 8; i++)
    {
        cin >> score;
        v.push_back({ score, i + 1 });
    }

    sort(v.begin(), v.end(), greater<pair<int,int>>());

    for (int i = 0; i < 5; i++)
    {
        sum += v[i].first;
        idx.push_back(v[i].second);
    }

    cout << sum << '\n';

    sort(idx.begin(), idx.end());

    for (int i = 0; i < 5; i++)
    {
        cout << idx[i] << ' ';
    }
}

+ Recent posts