본문 바로가기

BOJ28

[BOJ] 16953번 - A → B 문제에서는 A를 B로 바꾼다고 했지만 B에서 A로 바꾸는게 코드 짜기 훨씬 편하다. 조건을 나눠본다면 먼저 짝수냐 홀수이냐를 크게 구분할 수 있는데 여기서 문제 조건인 1을 수의 가장 오른쪽에 추가한다는 내용 때문에 1. 가장 먼저 if문에 1의자리가 1인지 확인한다. 10으로 나누고 count ++, 반복문 진행 2. 다음으로 홀수인지 확인 조건에 있는 연산으로는 1을 제외한 홀수의 숫자가 나올 수 없기 때문에 -1 출력하고 종료 3. 그 외의 나머지 경우 2로 나누고 count ++, 반복문 진행 4. while문 내의 조건을 만족하고 빠져나온 경우 주어진 조건인 2를 곱하거나 1을 수의 가장 오른쪽에 추가하는 것으로 숫자를 변환 할수 없으므로 -1 출력하고 종료 #include using names.. 2022. 6. 16.
[BOJ] 1715번 - 카드 정렬하기 priority queue를 사용하여 문제를 해결했다. 여러 카드 묶음들을 두 묶음씩 골라서 합쳐나가면 고르는 순서에 따라서 비교 횟수가 달라지게 된다. 이 때 비교 횟수를 최소한으로 하려면 묶음이 적은 카드들부터 묶어서 합쳐야 한다. priority queue를 통해 카드 뭉치 두개를 변수에 넣고 각각 pop한뒤 두 뭉치의 합을 queue에 넣는 식으로 최소 비교횟수를 구한다. #include #include #define MAX 100000 using namespace std; int N,num; int arr[MAX]; int main() { cin >> N; priority_queue pq; for (int i = 0; i > num; pq.push(num); } i.. 2022. 6. 16.
[BOJ] 1339번 - 단어 수학 알파벳으로 이루어진 문자열을 각각 자릿수마다 숫자로 바꾸어 합의 최대값을 구하는 문제이다. 문제의 예시를 살펴보면 GCF와 ACDEB의 합의 최대값을 구하는 경우를 보면 A*10000 + C*1000 + (D+G)*100 + (E+C)*100 + (B+F)로 표현할 수 있다. 이때 빈도수가 가장 많은 순서대로 알파벳에 값을 넣어주면 되므로 A : 9 / C : 8 / D : 7 / G : 6 / E : 5 / B : 4 / F : 3으로 대입하고 최대값을 계산하면 99437이 나온다. 단계 1 : char로 이루어진 문자열 형태를 알파벳 별 개수로 변환하여 배열에 넣는다. 단계 2 : 알파벳 별 개수를 sort해준다 - 빈도수가 많은 것부터 큰 수를 넣어주기 위해 단계 3 : 9부터 대입하여 알맞은 숫자.. 2022. 6. 15.
[BOJ] 1543번 - 문서 검색 두 문자열을 비교하여 한 문자열에 대하여 다른 문자열이 몇번 등장하는지 구하는 문제이다.(문자열 비교) 문제 조건에서 문자열은 공백도 포함을 하기 때문에 입력에 getline을 사용했다. 이해를 돕기 위해 문자열 A안에 문자열 B가 중복하지 않고 최대 몇번 등장하지 않는다고 가정한다. 이중 for문을 통해 바깥 for문으로 문자열 A길이만큼 돌리고 안쪽 for문으로 문자열 B길이로 비교한 다음 문자열이 다르면 다음 index값으로, 같다면 바깥 for문에서 문자열 B 길이만큼 index를 넘어가서 다시 비교한다. #include #include #include using namespace std; int main() { cin.tie(0); ios_base::sync_with_stdio(false); s.. 2022. 6. 15.
[BOJ] 1735번 - 분수 합 분수 A,B가 주어지고 두 분수의 합을 기약분수 형태로 구하는 문제이다. 기약분수는 더 이상 약분되지 않아야 하므로 분수의 합을 계산해주고 분모,분자의 최대공약수로 각각 나누어 표현한다. 최대공약수는 유클리드 호제법을 사용하여 계산한다. https://dong-min-god.tistory.com/19 최대공약수(GCD), 최소공배수(LCM) C++ 구현 최대공약수(GCD, Great Common Divisor)과 최소공배수(LCM, Least Common Multiple)을 구해보자 최대 공약수 최대공약수는 나머지 연산을 활용하는 유클리드 호제법을 이용하여 쉽게 구할 수 있다. 입력으로 들 dong-min-god.tistory.com #include using namespace std; int gcd(i.. 2022. 6. 15.
[BOJ] 2609번 - 최대공약수와 최소공배수 유클리드 호제법을 이용하여 최대공약수 GCD, 최소공배수 LCM을 구하는 문제이다. 내용은 다음 링크 참조 https://dong-min-god.tistory.com/19 최대공약수(GCD), 최소공배수(LCM) C++ 구현 최대공약수(GCD, Great Common Divisor)과 최소공배수(LCM, Least Common Multiple)을 구해보자 최대 공약수 최대공약수는 나머지 연산을 활용하는 유클리드 호제법을 이용하여 쉽게 구할 수 있다. 입력으로 들 dong-min-god.tistory.com #include using namespace std; int gcd(int a, int b) { while (b != 0) { int r = a % b; a = b; b = r; } return a; .. 2022. 6. 14.
[BOJ] 3460번 - 이진수 주어진 10진수를 2진수로 나타내어 1의 위치를 표시하는 문제이다. %와 / 연산자를 통해 이진수를 구하고 1인 경우만 출력해주도록 한다. 테스트 케이스마다 자리를 표시하는 count를 0으로 초기화해야 한다. #include using namespace std; int T, n, num; int main() { cin.tie(0); ios_base::sync_with_stdio(false); cin >> T; while (T--) { cin >> n; int count = 0; while (n > 0) { num = n % 2; n /= 2; if (num == 1) cout 2022. 6. 14.
[BOJ] 2501번 - 약수 구하기 단순 약수문제. 문제 조건상 N이 10000 이하 이므로 브루트포스로 탐색하면 clear. 약수의 개수가 K보다 작은 경우 0을 출력하는 조건을 빼먹지 않도록 한다. #include #include #include using namespace std; int main() { cin.tie(0); ios_base::sync_with_stdio(false); int N, K; int count = 0; cin >> N >> K; for (int i = 1; i 2022. 6. 14.
[BOJ] 2740번 - 행렬 곱셈 단순 수학, 구현 문제이다. 행렬의 곱셈을 코드화할 수 있다면 쉽게 풀 수 있다. res[i][j] += A[i][k] * B[k][j]; 이 부분이 행렬의 곱셈을 구현한 부분이다. #include #include #include using namespace std; int N, M, K; int A[101][101]; int B[101][101]; int res[101][101]; int main() { cin.tie(0); ios_base::sync_with_stdio(false); cin >> N >> M; for (int i = 0; i > A[i][j]; } cin >> M >> K; for (int i = 0; i.. 2022. 6. 14.