※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 25375번 문제인 아주 간단한 문제이다.
문제는 아래 링크를 확인하자.

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

 

25375번: 아주 간단한 문제

양의 정수 $a$, $b$가 주어지면, $gcd(x, y) = a$이고 $x + y = b$인 자연수 쌍 $(x, y)$가 존재하는지의 여부를 출력하자.

www.acmicpc.net

먼저, gcd(x,y)는 a이므로 x와 y는 모두 a의 배수임을 알 수 있다. 또한 x+y가 b와 같으므로 b 또한 a의 배수여야 한다. 한편 a와 b는 0이 아니므로 b는 a일 수 없다.

 

한편, b가 a보다 큰 a의 배수이기만 하다면 x = a, y = b - a와 같이 x와 y를 골랐을 때 gcd(x,y) = a 및 x+y=b를 만족시키는 것을 알 수 있다.

 

따라서 각 a와 b가 상술한 조건을 만족하는지를 확인하는 것으로 문제를 해결할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;
typedef long long ll;

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

	int Q; cin >> Q;
	while (Q--) {
		ll a, b; cin >> a >> b;
		if (b % a == 0 && a < b) cout << 1 << '\n';
		else cout << 0 << '\n';
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 27113 // C++] 잠입  (0) 2023.01.26
[BOJ 27114 // C++] 조교의 맹연습  (0) 2023.01.26
[BOJ 27112 // C++] 시간 외 근무 멈춰!  (0) 2023.01.26
[BOJ 27111 // C++] 출입 기록  (0) 2023.01.25
[BOJ 25373 // C++] 벼락치기  (0) 2023.01.25

※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 25373번 문제인 벼락치기이다.
문제는 아래 링크를 확인하자.

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

 

25373번: 벼락치기

부산사이버대학교에 다니는 대희는 강의 영상 보는 것을 매일 미뤘다. 오늘은 중간고사가 일주일 남은 날이다. 대희는 더 이상 미루면 큰일이 날 것 같아서 오늘부터 밀린 영상을 보기로 했다.

www.acmicpc.net

첫 날에 K개의 영상을 봤다면 앞으로 7일동안 볼 수 있는 가장 많은 개수의 영상은 K + (K-1) + (K-2) + (K-3) + (K-4) + (K-5) + (K-6)이 될 것이다. (단, K>6이다.)

 

K가 7보다 작은 경우 볼 수 있는 가장 많은 영상개수를 따로 구해두고, 나머지 경우 위의 식을 이용해문제를 해결하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;
typedef long long ll;

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

	ll N; cin >> N;
	if (N == 1) cout << 1;
	else if (N <= 3) cout << 2;
	else if (N <= 6) cout << 3;
	else if (N <= 10) cout << 4;
	else if (N <= 15) cout << 5;
	else if (N <= 21) cout << 6;
	else cout << (N - 22) / 7 + 7;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 27112 // C++] 시간 외 근무 멈춰!  (0) 2023.01.26
[BOJ 27111 // C++] 출입 기록  (0) 2023.01.25
[BOJ 10855 // C++] Extreme Sort  (0) 2023.01.25
[BOJ 27258 // C++] Дроби  (0) 2023.01.24
[BOJ 3135 // C++] 라디오  (0) 2023.01.24

※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 25376번 문제인 이상한 스위치이다.
문제는 아래 링크를 확인하자.

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

 

25376번: 이상한 스위치

1번 스위치가 2, 4, 5번 스위치에 영향을 주고, 4번 스위치가 5번 스위치에 영향을 준다. 1번 스위치를 직접 켤 때, 2, 4, 5번 스위치의 상태가 반전되면서, 1, 2, 4, 5번 스위치가 모두 켜진다. 이때, 4번

www.acmicpc.net

i번째 스위치가 켜져있으면 i번째 성분이 1, 꺼져있으면 i번째 성분이 0인 N-tuple들을 각각의 노드로 생각하고, 각 스위치의 상태에서 현재 누를 수 있는 스위치를 눌러 다른 상태로 바뀌는 것을 각 N-tuple을 잇는 에지로 생각하면 문제의 상황을 방향그래프로 모델링할 수 있다. 이 때, 문제에서 구하는 값은 초기상태를 나타내는 N-tuple이 나타내는 노드부터 모든 성분이 1인 N-tuple을 나타내는 노드까지의 최단거리와 같아진다. 이는 BFS를 이용해 구할 수 있다.

 

각 노드는 비트마스킹을 이용해 하나의 정수로 나타낼 수 있다. 즉, N-tuple의 i번째 성분을 정수의 i번째 비트로 대응시켜 표현하면 각 노드를 정수로 편하게 나타낼 수 있다. 각 스위치의 번호를 0-based로 나타내 문제를 해결해보자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <queue>
using namespace std;

int N, S;
int dist[1048576];
int chng[20];

void bfs() {
	queue<int> que;
	que.push(S);
	dist[S] = 1;

	while (!que.empty()) {
		int cur = que.front(); que.pop();
		for (int i = 0; i < N; i++) {
			if (cur & (1 << i)) continue;
			int nxt = cur ^ chng[i];
			if (dist[nxt]) continue;
			dist[nxt] = dist[cur] + 1;
			que.push(nxt);
		}
	}
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	cin >> N;
	for (int i = 0; i < N; i++) {
		int x; cin >> x;
		if (x) S |= (1 << i);
	}

	for (int i = 0; i < N; i++) {
		chng[i] |= (1 << i);
		int K; cin >> K;
		while (K--) {
			int x; cin >> x; x--;
			chng[i] |= (1 << x);
		}
	}

	bfs();

	cout << dist[(1 << N) - 1] - 1;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 3135 // C++] 라디오  (0) 2023.01.24
[BOJ 27260 // C++] Красивые перестановки  (0) 2023.01.24
[BOJ 25374 // C++] 등급 계산하기  (0) 2023.01.23
[BOJ 27268 // C++] Рамки  (0) 2023.01.23
[BOJ 26432 // C++] Walktober  (0) 2023.01.23

※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 25374번 문제인 등급 계산하기이다.
문제는 아래 링크를 확인하자.

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

 

25374번: 등급 계산하기

등급 조건 1등급 ($x_1$점 초과인 사람의 비율)% $\lt$ 4% 2등급 4% $\leq$ ($x_2$점 초과인 사람의 비율)% $\lt$ 11% 3등급 11% $\leq$ ($x_3$점 초과인 사람의 비율)% $\lt$ 23% 4등급 23% $\leq$ ($x_4$점 초과인 사람의

www.acmicpc.net

상위 등급, 즉 1등급서부터 각 등급의 인원수를 구해나가 문제를 해결해야 하는 구현문제이다.

 

아래의 코드와 같이 각 등급컷 비율을 배열로 하나 만들어 구현하면 한결 간단하게 구현할 수 있다.

 

아래 코드의 23번째 줄 조건의 부등식은 퍼센트(%)값 비교를 실수자료형 없이 하기 위해 양변에 100을 곱한 형태이다. 이를 통해 실수오차로 인한 잘못된 비교결과가 나오는 것을 회피할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <algorithm>
using namespace std;

int N;
int arr[100];
int grade[9] = { 100,96,89,77,60,40,23,11,4 };
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N;
	for (int i = 0; i < N; i++) cin >> arr[i];
	sort(arr, arr + N);

	int cnt = 0, counted = 0, gidx = 8;
	int i = N - 1;
	while (i > -1) {
		int cur = arr[i];
		while (i > -1 && arr[i] == cur) {
			cnt++, i--;
		}
		while (gidx > -1 && N * grade[gidx] <= 100 * cnt) {
			cout << cnt - counted << '\n';
			counted = cnt;
			gidx--;
		}
	}
}
728x90

※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 25372번 문제인 성택이의 은밀한 비밀번호이다.
문제는 아래 링크를 확인하자.

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

 

25372번: 성택이의 은밀한 비밀번호

부산사이버대학교 학생 성택이는 엄마의 의뢰를 받아 주어진 문자열이 현관문 비밀번호에 사용 가능한지 알아내야 한다. 성택이는 공부해야 하므로 우리가 도와주자! 사용할 수 있는 비밀번호

www.acmicpc.net

각 테스트케이스마다 주어진 문자열의 길이가 6이상 9이하이면 "yes", 그렇지 않다면 "no"를 출력하는 문제이다.

 

문자열의 길이는 length()를 이용하여 구해낼 수 있다. 이를 이용해 문제를 간단히 해결하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <string>
using namespace std;

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

	int T; cin >> T;
	while (T--) {
		string s; cin >> s;
		int slen = s.length();
		if (6 <= slen && slen <= 9) cout << "yes\n";
		else cout << "no\n";
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 25802 // C++] Fiborooji Sequence  (0) 2022.10.30
[BOJ 25625 // C++] 샤틀버스  (0) 2022.10.30
[BOJ 4696 // C++] St. Ives  (0) 2022.10.30
[BOJ 18698 // C++] The Walking Adam  (0) 2022.10.30
[BOJ 18198 // C++] Basketball One-on-One  (0) 2022.10.30

+ Recent posts