문제링크 : https://www.acmicpc.net/problem/1057#include using namespace std;int main(void){ ios_base::sync_with_stdio(false); cin.tie(0); int n, a, b, cnt = 0; cin >> n >> a >> b; while(a!=b) { a = (a+1)/2; b = (b+1)/2; cnt++; } cout 각 값들을 2로 나누면서 같아지는 순간을 체크한다.다만 단순히 2를 나누는 것이 아니라 1을 더해주어야 한다.7, 8을 예시로 들면 7/2 = 3, 8/2 = 4 이기에 둘 다 같은 4를 반환하려면 1을 더해줄 필요가 ..
#include #include using namespace std;vector solution(int n, long long k) { vector answer, v; vector fac(n, 1); //팩토리얼 계산 for (int i = 1; i = 0; i--) { int idx = k / fac[i]; //위치 answer.push_back(v[idx]); v.erase(v.begin() + idx); //찾은 값 삭제 k %= fac[i]; //k값 조정 } return answer;} 먼저 가능한 케이스를 통해 규칙을 찾아보자.1 : 12 : 1 2 / 2 13 : 1 2 3 / 1 3 2 / 2 1 3 /..
문제링크 : https://www.acmicpc.net/problem/1058#include using namespace std;int dist[51][51];int main(void){ ios_base::sync_with_stdio(false); cin.tie(0); int n, result = 0; cin >> n; for(int i=0; i> s; for(int j=0; j 플로이드 - 워셜 알고리즘을 통해 풀 수 있는 문제이다.먼저 배열을 최대값으로 지정하고, 이후에 'Y' 값을 기준으로 해당 거리 ij에 대해서 초기 거리 1을 설정해준다. 이제 플로이드 워셜 알고리즘을 통해서 가능한 케이스에 대해 거리를 갱신해준다.거리를 갱신했으면 이제 가장 2-친구의 수..
#include #include #include #include using namespace std;int dy[] = {0, 0, 1, -1};int dx[] = {1, -1, 0, 0};int visited[101][101];vector solution(vector maps) { vector answer; for(int i=0; i>q; q.push({i, j}); visited[i][j] = 1; int sum = maps[i][j]-'0'; //누적합용 변수, 시작 값 저장 while(!q.empty()) { auto [y, x] = q.front(); ..