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

 

2910번: 빈도 정렬

첫째 줄에 메시지의 길이 N과 C가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ C ≤ 1,000,000,000) 둘째 줄에 메시지 수열이 주어진다.

www.acmicpc.net

 

풀이 과정

 여러 개의 수가 주어질 때, 출현 빈도의 내림차순으로, 동일한 경우 먼저 출현한 순으로, 수를 정렬하는 문제이다. map<ll, int> 와 vector<pair<ll, int>>를 이용해서 풀었다. map에 input값을 넣으면 vector의 인덱스 번호가 나오고 해당 번호에서 입력값과 출현 횟수를 볼 수 있는 방식이다. 동일한 요소가 들어 왔을 때, map을 사용하기 때문에 더 빠르게 접근할 수 있지 않을까 생각했다. 그리고 stable_sort()와 cmp() 함수를 구현해 pair<ll, int>의 second값을 기준으로 내림차순 정렬로 만들었다. stable_sort() (병합 정렬)는 일반 sort() (퀵 정렬)와 다르게 동일한 값을 가진 요소에 대해 기존 순서를 보장함으로 동일한 출현 횟수를 가질 경우 먼저 출현한 수를 출력할 수 있다.

 

느낀 점

 map<ll, int>과  vector<pair<ll ,int>>로 감을 잡는데 어려웠다. C가 크지만 N이 1000으로 작기 때문에 굳이 map을 사용하지 않고 두 개의  vector를 이용해서 풀 수도 있었다. 또 sort()와 stable_sort()의 차이를 알 수 있는 좋은 경험이었다. 만약 sort() 함수의 동일한 값에 대한 기존 순서를 유지하고 싶다면 인덱스 정보를 추가로 compare() 함수에 추가해준다면 될 것이다.

 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

map<ll, int> mp;
ll n, c, temp;
vector<pair<ll, int>> cnt;

bool cmp(pair<ll, int> a, pair<ll, int> b) {
	return a.second > b.second;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	//입력
	cin >> n >> c;
	cnt.push_back({ 0, 0 }); // 1부터 탐색하기 위한 더미
	//수행
	for (int i = 0; i < n; i++) {
		cin >> temp;
		if (mp[temp] == 0) {//0은 더미
			cnt.push_back({ temp, 1 }); //cnt에 숫자와 카운트 기록
			mp[temp] = cnt.size() - 1; //mp에 해당 숫자 정보로 가는 cnt 인덱스 기록
		}
		else {
			cnt[mp[temp]].second++; //map에서 해당 숫자의 인덱스를 찾고 cnt++
		}
	}
	//정렬
	stable_sort(cnt.begin(), cnt.end(), cmp);
	//출력
	for (int i = 0; i < cnt.size(); i++) {
		for (int j = 0; j < cnt[i].second; j++) cout << cnt[i].first << " ";
	}

	return 0;
}

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

 

2828번: 사과 담기 게임

상근이는 오락실에서 바구니를 옮기는 오래된 게임을 한다. 스크린은 N칸으로 나누어져 있다. 스크린의 아래쪽에는 M칸을 차지하는 바구니가 있다. (M<N) 플레이어는 게임을 하는 중에 바구니를

www.acmicpc.net

 

풀이 과정

 주어진 N 크기의 1차원 배열에 사과가 떨어지면 바구니를 최소한으로 옮겨 사과를 받고 이동 거리를 구하는 문제이다. 일단 바구니를 하나의 객체로 생각하고 basket이라는 pair<int, int> 변수에 바구니의 시작점과 끝점을 담았다. 그리고 move_basket()에 사용할 바구니의 주소와 사과가 떨어지는 지점을 주고 사과를 담기 위한 바구니의 최소 이동거리를 반환했다. ret에 사과가 떨어질 때마다 이동한 거리를 더해주면서 해결했다.

 

느낀 점

 굳이 객체로 만들어 풀지 않아도 됬을거 같지만 이렇게 하니 손쉽게 풀렸다. 단, 바구니의 경계값을 잘 체크해야하고 이동 거리를 구할 때는 절댓값을 구해야 한다는 사실을 명심하자.

 

#include<bits/stdc++.h>
using namespace std;

int n, m, k, temp, ret;
pair<int, int> basket; //start, end
//(이동시킬 바구니, 사과 도착 지점)으로 이동거리 반환
int move_basket(pair<int, int> *bas, int des) {
	//바구니를 이동 불필요
	if (des >= bas->first && des <= bas->second) return 0;
	int move_dis = 0;
	//바구니를 이동 필요, 이동거리 계산
	if (des < bas->first) move_dis = des - bas->first;
	else if (des > bas->second) move_dis = des - bas->second;
	//바구니 이동
	bas->first += move_dis;
	bas->second += move_dis;

	return abs(move_dis);
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	//입력
	cin >> n >> m >> k;
	//초기화
	basket = { 1, m };
	//수행
	for (int i = 0; i < k; i++) {
		cin >> temp;
		ret += move_basket(&basket, temp);
	}
	//출력
	cout << ret;

	return 0;
}

'알고리즘 : C++ > BaekJoon' 카테고리의 다른 글

백준 4659번 - 비밀번호 발음하기  (0) 2023.05.23
백준 2910번 - 빈도 정렬  (1) 2023.05.20
백준 1992번 - 쿼드트리  (0) 2023.05.20
백준 2583번 - 영역 구하기  (0) 2023.05.20
백준 2468번 - 안전 영역  (0) 2023.05.20

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

 

1992번: 쿼드트리

첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 ≤ N ≤ 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또

www.acmicpc.net

 

풀이 과정

 전체 map 탐색하며 조건을 만족하면 출력, 아니라면 만족할 때까지 분할하는 문제이다. 입력을 받고 qt()라는 재귀 함수를 작성해서 문제를 풀었다. qt() 함수는 먼저 지정된 영역 (x, y) 부터 (x + nn, y + nn)까지 값이 동일한지 검사한다. 동일하다면 범위 내 mp 요소를 하나 출력한다. 그러나 동일하지 않다면 mp를 4부분으로 분할해서 다시 검사한다. 분할 될 때는 앞에 '(', 분할 된 모든 qt()가 종료되면 ')'를 출력한다.

 

 느낀 점

 처음 풀 때는 어려움을 많이 느꼈는데, 다시 풀어보니 간단히 풀렸다. 분할 정복이란 무엇인지 직관적으로 느낄 수 있었다. 중간에 qt()를 4부분으로 분할할 때 y와 x를 하나 헷갈려 바꾸어 적었고, 디버깅하면서 탐색 범위를 좁히고 수정했다.

 

#include<bits/stdc++.h>
using namespace std;

int n;
char mp[65][65];

void qt(int y, int x, int nn) {
	int flag = false, _prev = mp[y][x];
	for (int i = y; i < y + nn; i++) {
		for (int j = x; j < x + nn; j++) {
			if (mp[i][j] != _prev) flag = true;
		}
	}
	//값이 동일하지 않다면 분할
	if (flag) {
		cout << "(";
		qt(y, x, nn / 2);
		qt(y, x + nn / 2, nn / 2);
		qt(y + nn / 2, x, nn / 2);
		qt(y + (nn / 2), x + (nn / 2), nn / 2);
		cout << ")";
	}//동일하면 출력
	else cout << mp[y][x];

	return;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	//입력
	cin >> n;
	for (int i = 0; i < n; i ++) {
		for (int j = 0; j < n; j++) {
			cin >> mp[i][j];
		}
	}
	//수행 및 출력
	qt(0, 0, n);

	return 0;
}

'알고리즘 : C++ > BaekJoon' 카테고리의 다른 글

백준 2910번 - 빈도 정렬  (1) 2023.05.20
백준 2828번 - 사과 담기 게임  (0) 2023.05.20
백준 2583번 - 영역 구하기  (0) 2023.05.20
백준 2468번 - 안전 영역  (0) 2023.05.20
백준 1012번 - 유기농 배추  (0) 2023.05.20

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

 

2583번: 영역 구하기

첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오

www.acmicpc.net

 

풀이 과정

 꼭짓점 좌표에 따라서 사각형을 맵에 기록하고 최종적으로 mp값이 0인 연결 컴포넌트의 개수와 각 컴포넌트의 크기를 구하는 문제였다. 꼭짓점 좌표를 입력받고 시작 꼭짓점 이상 마지막 꼭짓점 미만으로 mp에 값을 입력했다. dfs()에서 노드 하나를 방문하고 종료되면 cnt++를 수행하며 컴포넌트의 크기를 구했다.

 

느낀 점

 문제에 2가지 포인트가 있었다고 생각한다. 첫 째는 DFS를 구현할 때 리턴값을 활용할 줄 아는가, 둘 째는 꼭짓점이 가지는 의미를 알고 이를 이용해 잘 입력받았는가 이다. 나는 두 번째를 뒤늦게 알아차려 시간이 조금 소요되었다. 꼭짓점과 칸의 인덱스를 매치 해봤을 때, 시작 꼭짓점에 해당하는 좌표의 칸은 직사각형 안에 포함 되지만, 마지막 꼭짓점 좌표에 해당하는 칸은 포함되지 않는다. 따라서 시작 꼭짓점 이상, 종료 꼭짓점 미만으로 사각형 범위를 지정하고 값을 채워나가야 했다. 섬세하게 생각해 볼 수 있는 기회가 됬다.

 

#include<bits/stdc++.h>
using namespace std;

const int MAX = 101;
int n, m, k, cnt;
int mp[MAX][MAX], visited[MAX][MAX];
int my[4] = { 1, 0 , -1, 0 }, mx[4] = { 0, 1, 0, -1 };
vector<int> ret;

int dfs(int y, int x) {
	if (mp[y][x] != 0 || visited[y][x]) return 0;
	visited[y][x] = 1;
	for (int i = 0; i < 4; i++) {
		int ny = my[i] + y;
		int nx = mx[i] + x;
		if (ny < 0 || ny >= n || nx < 0 || nx >= m) continue;
		dfs(ny, nx);
	}
	cnt++;
	return cnt;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	//입력
	cin >> n >> m >> k;
	for (int i = 0; i < k; i++) {
		int fy, fx, ly, lx;
		cin >> fx >> fy >> lx >> ly;
		for (int j = fy; j < ly; j++) {
			for (int z = fx; z < lx; z++) {
				mp[j][z]++;
			}
		}
	}
	
	/* 입력 테스트
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cout << mp[i][j] << " ";
		}
		cout << "\n";
	}
	*/

	//수행
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cnt = 0;
			int temp = dfs(i, j);
			if(temp) ret.push_back(temp);
		}
	}
	//정렬
	sort(ret.begin(), ret.end());
	//출력
	cout << ret.size() << "\n";
	for (int i = 0; i < ret.size(); i++) cout << ret[i] << " ";
	return 0;
}

'알고리즘 : C++ > BaekJoon' 카테고리의 다른 글

백준 2828번 - 사과 담기 게임  (0) 2023.05.20
백준 1992번 - 쿼드트리  (0) 2023.05.20
백준 2468번 - 안전 영역  (0) 2023.05.20
백준 1012번 - 유기농 배추  (0) 2023.05.20
백준 2178번 - 미로 탐색  (0) 2023.05.20

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

 

2468번: 안전 영역

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

www.acmicpc.net

 

풀이 과정

 비가 내리는 양에 따라 침수, 비침수로 영역이 구분되고, 이때 비침수 지역의 연결 컴포넌트 개수 중 최대치를 구하는 문제이다. 이전에 풀었던 '유기농 배추' 문제와 같이 연결 컴포넌트를 구하는 문제이지만, 탐색 조건에 변화를 주며(비 내리는 양) 최대치를 갱신해야하는 문제였다. 아에 오지 않는 경우부터 모든 건물이 침수 되기 전까지 for문을 이용해 탐색했다. 이전과 마찬가지로 연결 컴포넌트를 구할 때는 DFS를 이용해 탐색이 성공하면 1을 리턴하고 cnt++를 하며 연결 컴포넌트 개수를 구했고, 최종적을 max(ret, cnt)로 최댓값을 갱신했다. 이때 내리는 비의 양이 바뀔 때마다 visited와 cnt를 초기화 했다. 비가 아에 내리지 않는 경우부터 모든 건물이 침수 되기 직전까지(모두 침수되면 0개, 비가 오지 않으면 1개이기 때문에) 구하기 위해서 k를 0이상, 건물 최대높이 이하 조건까지 탐색했고, 건물 높이와 비의 양이 같은 경우는 침수되지 않는 것으로 판단했다. 

 

느낀 점

 초기화를 수행할 때 visited뿐 아니라 mp까지 초기화하는 실수, dfs()인자에 i와 j 인덱스가 아닌 0, 0을 넣는 실수를 해서 디버깅하느라 애를 먹었다. 체화해서 빠르게 하는 것도 중요하지만, 실수 하는 부분들은 내가 완전히 체화되지 않은 부분이라 생각하고 신중히 신경써야겠다.

 

#include<bits/stdc++.h>
using namespace std;

const int MAX = 101;
int n, cnt, rmx, ret, temp;
int mp[MAX][MAX], visited[MAX][MAX];
int my[4] = { 1, 0 , -1, 0 }, mx[4] = { 0, 1, 0, -1 };

//DFS로 연결된 컴포넌트 완전 탐색
bool dfs(int y, int x, int r) {
	if (visited[y][x] || r > mp[y][x]) return 0;
	visited[y][x] = 1;
	for (int i = 0; i < 4; i++) {
		int ny = y + my[i];
		int nx = x + mx[i];
		if (ny < 0 || ny >= n || nx < 0 || nx >= n || visited[ny][nx]) continue;
		dfs(ny, nx, r);
	}
	return 1;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	//입력
	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> temp;
			mp[i][j] = temp;
			rmx = max(rmx, temp);
		}
	}
	//수행, 비가 내리는 양이 k일 때 연결 컴포넌트
	for (int k = 0; k <= rmx; k++) {
		//초기화
		fill(&visited[0][0], &visited[100][100], 0);
		cnt = 0;
		//컴포넌트 개수 카운트
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if(dfs(i, j, k)) cnt++;
			}
		}
		//최댓값 갱신
		ret = max(ret, cnt);
	}
	//출력
	cout << ret << "\n";
	return 0;
}

'알고리즘 : C++ > BaekJoon' 카테고리의 다른 글

백준 1992번 - 쿼드트리  (0) 2023.05.20
백준 2583번 - 영역 구하기  (0) 2023.05.20
백준 1012번 - 유기농 배추  (0) 2023.05.20
백준 2178번 - 미로 탐색  (0) 2023.05.20
백준 1627번 - 곱셈  (0) 2023.05.20

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

 

1012번: 유기농 배추

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

www.acmicpc.net

 

풀이 과정

 애벌레가 상하좌우만 이동 가능할 때,  총 몇 마리의 애벌레가 있어야 전체 배추를 방문할 수 있는지에 대한 문제이다. 연결 컴포넌트를 찾는 문제로, 배열 전체를 방문하며 완전 탐색을 수행한다. 탐색을 하며 방문한 배열에 visitied 표시를 해주고 중복되어 방문하지 않도록 한다. 모든 mp요소에 DFS를 수행한다. 방문하지 않았던 배열의 경우 DFS를 수행해 visited를 1로 바꿔주고 하나의 컴포넌트 방문이 끝나면 1을 리턴하고 cnt에 더해준다. 이미 방문한 컴포넌트 요소에는 다시 방문하지 않기 때문에 최종적으로 cnt는 연결 컴포넌트 개수가 된다.

 

느낀 점

 처음에 int형 2차원 배열들에 대해서 'C3863'에러가 발생했다. 관련된 배열을 참조하는 함수를 찾다 fill() 함수에서 문제가 있을 것이라 생각해, memset()함수로 바꾸어 실행한 결과 정상적으로 작동했다. fill() 함수로 2차원 (혹은 다차원) 배열을 초기화 할 때 단순히 'fill(&mp[0], &mp[0] + 51, 0)이라 한 것이 문제였다. 지금 생각해보면 위 함수가 실행된다해도 2차원 배열 중 첫 째줄 배열에만 초기화가 적용되니 잘못된 것이 당연했다. fill(&mp[0][0], &mp[50][50], 0)이 올바른 초기화 법이고, 0이나 1로 초기화 할 때는 memset() 이용하는 것도 기억해두자.

 

#include<bits/stdc++.h>
using namespace std;

const int MAX = 51;
int n, m, k, t, ky, kx, cnt;
int mp[MAX][MAX], visited[MAX][MAX];
int my[4] = { 1, 0 , -1, 0 }, mx[4] = { 0, 1, 0, -1 };

//DFS 완전 탐색(하나의 연결 컴포넌트 방문)
bool dfs(int y, int x) {
	if (visited[y][x] || !mp[y][x]) return 0;
	visited[y][x] = 1;
	for (int i = 0; i < 4; i++) { //4방향 탐색
		int ny = y + my[i];
		int nx = x + mx[i];
		if (ny < 0 || ny >= n || nx < 0 || nx >= m || visited[ny][nx] || !mp[ny][nx]) continue;
		dfs(ny, nx);
	}
	return 1;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	cin >> t;
	for (int T = 1; T <= t; T++) {
    	//초기화
		n = 0; m = 0; k = 0; ky = 0; kx = 0; cnt = 0;
		//memset(mp, 0, 51);
		//memset(visited, 0, 51);
		fill(&mp[0][0], &mp[50][50], 0);
		fill(&visited[0][0], &visited[50][50], 0);
		//입력
		cin >> m >> n >> k;
		for (int i = 0; i < k; i++) {
			cin >> kx >> ky;
			mp[ky][kx] = 1;
		}
		//수행
		for (int i = 0; i < n; i ++) {
			for (int j = 0; j < m; j++) {
				cnt += dfs(i, j);
			}
		}
		//출력
		cout << cnt << "\n";
	}
	return 0;
}

'알고리즘 : C++ > BaekJoon' 카테고리의 다른 글

백준 2583번 - 영역 구하기  (0) 2023.05.20
백준 2468번 - 안전 영역  (0) 2023.05.20
백준 2178번 - 미로 탐색  (0) 2023.05.20
백준 1627번 - 곱셈  (0) 2023.05.20
백준 4375번 - 1  (0) 2023.05.19

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

 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net

 

풀이 과정

 1과 0으로 이루어진 미로의 (0, 0)에서 (n - 1, m - 1)까지 최단 거리를 구하는 문제이다. 이때 가중치가 1로 일정하므로 BFS를 사용해서 문제를 풀었다. QUEUE를 이용해 BFS를 구현할 때, 이전 visited + 1 을 해줌으로서 첫 노드와 탐색 노드의 거리를 구했다.

 

느낀 점

 DFS를 주로 사용하다가 BFS를 사용하려하니 곧바로 코드가 생각나지 않았다. 하지만 큐와 4방향 탐색을 통해 찾아간다는 개념을 기반으로 천천히 구현하다보니 자연스럽게 구현되었다.

 

#include<bits/stdc++.h>
using namespace std;

int n, m;
char mp[101][101];
int visited[101][101];
int my[4] = { 1, 0, -1, 0 }, mx[4] = { 0, 1, 0, -1 };

void bfs(int y, int x) {
	//큐생성과 초기값 할당
	queue<pair<int, int>> q;
	q.push({ y, x });
	visited[y][x] = 1;

	while (q.size()) {
		for (int i = 0; i < 4; i++) { //4방향 탐색
			int ny = q.front().first + my[i];
			int nx = q.front().second + mx[i];
			if (ny < 0 || ny >= n || nx < 0 || nx >= m || visited[ny][nx] || mp[ny][nx] == '0') continue;
			q.push({ ny, nx });
			visited[ny][nx] = visited[q.front().first][q.front().second] + 1;
		}
		if(!q.empty()) q.pop();
	}
	return;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	//입력
	cin >> n >> m;

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> mp[i][j];
		}
	}
	//수행
	bfs(0, 0);
	//출력
	cout << visited[n - 1][m - 1];

	return 0;
}

'알고리즘 : C++ > BaekJoon' 카테고리의 다른 글

백준 2468번 - 안전 영역  (0) 2023.05.20
백준 1012번 - 유기농 배추  (0) 2023.05.20
백준 1627번 - 곱셈  (0) 2023.05.20
백준 4375번 - 1  (0) 2023.05.19
백준 3986번 - 좋은 단어  (0) 2023.05.19

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

 

1629번: 곱셈

첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.

www.acmicpc.net

 

풀이 과정

 모듈러 연산과 분할 정복을 알아야 풀 수 있다. '( A  *  B ) % C = ( A % C ) * ( B % C ) % C' 와  2^2 * 2^2 = 2^4 와 같은 사실을 이용한다. 재귀 함수를 만들어 b번 일어날 연산을 log(2)b (로그 2의 b)번 까지 줄여준다. b == 1이 되면 돌아오도록 조건을 걸고, 재귀를 빠져나오며 연산이 수행된다. 연산이 수행될 때는 수가 너무 커지지 않도록 모듈러 연산 개념을 이용해서 수를 계속 줄여준다. 그리고 마지막 리턴 전에 b가 홀수라면 a를 1회 더 곱해줘야하므로 b%2 == 1일 경우 a를 한번 더 곱하고 모듈러 연산 해주었다.

 

느낀 점

 다른 문제도 마찬가지지만 비슷한 문제를 몇번 풀어보며 체화해야될 것이라 보인다. 결국 다른 사람들의 코드를 참고한 후 풀 수 있었고 기본적인 수학 개념을 보충해야될 필요성을 느꼈다. 또 분할 정복과 모듈러 연산은 연산 횟수를 획기적으로 줄이기 때문에 반드시 짚고 가야할 개념이다.

 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a, b, c, ret;

ll re(ll a, ll b, ll c) {
	if (b == 1) return a % c;
	ll temp = re(a, b / 2, c);
	temp = (temp % c) * (temp % c) % c;
	if (b % 2 == 1)temp = (temp % c) * (a % c) % c;
	return temp;
}

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

	cin >> a >> b >> c;

	ret = re(a, b, c);

	cout << ret << "\n";

	return 0;
}

'알고리즘 : C++ > BaekJoon' 카테고리의 다른 글

백준 1012번 - 유기농 배추  (0) 2023.05.20
백준 2178번 - 미로 탐색  (0) 2023.05.20
백준 4375번 - 1  (0) 2023.05.19
백준 3986번 - 좋은 단어  (0) 2023.05.19
백준 1940번 - 주몽  (0) 2023.05.19

+ Recent posts