이 포스트는 프로그래밍 문제 사이트 백준 Online Judge(BOJ)의 8892번 : '팰린드롬', 9656번 : '돌 게임 2', 1292번 : '쉽게 푸는 문제' 문제의 풀이 코드와 해설을 다루고 있습니다.
문제 난이도는 Silver 티어에 해당하며, 랜덤으로 문제를 풀이하고 있기에 알고리즘 분류는 다양하게 나올 수 있습니다.
8892번 : 팰린드롬
주어진 k개의 문자열 중에서 2개를 조합하여 팰린드롬 문자열을 만들 수 있다면 해당 문자열을 출력하고, 그러한 조합이 단 한 가지 경우도 없다면 0을 출력하는 문제입니다.
문제 티어가 Silver V에 해당하고, 알고리즘의 분류가 브루트포스 알고리즘으로 되어있기 때문에 모든 경우의 수를 조합해서 확인해 볼 수 있습니다.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
int T; cin >> T;
while(T--) {
int N; cin >> N;
vector<string> str(N);
for(int i=0; i<N; i++) cin >> str[i];
bool foundAns = false;
for(int i=0; i<N; i++) {
for(int j=i+1; j<N; j++) {
for(int k=0; k<2; k++) {
string temp;
if(k == 0) temp = str[i] + str[j];
else temp = str[j] + str[i];
bool check = true;
for(int l=0; l<temp.length()/2; l++)
if(temp[l] != temp[temp.length()-1-l]) {
check = false;
break;
}
if(check) {
cout << temp << "\n";
foundAns = true;
break;
}
}
if(foundAns) break;
}
if(foundAns) break;
}
if(!foundAns) cout << "0\n";
}
}
다만 이 문제의 경우 풀이 코드가 살짝 길어지는데, 그 이유는 우선 두 문자열을 순서를 다르게 하여 조합을 할 수 있기 때문이고, 각 조합에 대해 검사가 필요하며, 만약 팰린드롬 문자열을 찾은 경우에는 모든 반복문을 종료해주어야 하기 때문입니다.
그래서 foundAns라는 bool 변수를 두고 답을 찾은 경우 출력 후 foundAns = true로 바꾸어 모든 반복문을 종료하도록 설정해주었습니다.
9656번 : 돌 게임 2
돌 N개를 1개 또는 3개씩 번갈아가며 가져간다고 하고, 마지막 돌을 가져가는 사람이 진다고 할 때 이기는 사람을 구하는 문제입니다.
잘 생각해보면 돌은 무조건 홀수개만 가져갈 수 있으므로 N의 홀짝성에 따라 두 사람이 어떤 선택을 해도 승패는 고정되게 됩니다.
N = 4일 때 SK가 승자이므로 짝수일 때는 SK, 홀수일 때는 CY를 출력해주면 됩니다.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
int N; cin >> N;
if(N%2 == 0) cout << "SK";
else cout << "CY";
}
풀이 코드는 위와 같이 아주 간단함을 확인할 수 있습니다.
1292번 : 쉽게 푸는 문제
1이 한 번, 2가 두 번, 3이 세 번, ... 으로 이루어진 수열이 있을 때 A번째 수부터 B번째 수까지 합한 값을 구하는 문제입니다.
Silver V 티어 문제이므로 배열에 그냥 값을 저장하고 A부터 B번째 수까지 다 더해주는 방식으로 구현해도 됩니다.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
int A, B; cin >> A >> B;
int arr[1001], cnt = 1;
for(int i=1, j=1; i<=B; i++, j++) {
arr[i] = cnt;
if(j == cnt) j = 0, cnt++;
}
int sum = 0;
for(int i=A; i<=B; i++) sum += arr[i];
cout << sum;
}
위와 같이 cnt라는 상한선을 정하고, j를 0부터 계속 증가시켜주면서 cnt에 도달할때마다 j를 0으로 되돌려주면면서 cnt 값을 arr에 값을 저장해주었습니다.
그 뒤에 A번째부터 B번째 arr 값을 더해서 sum에 합쳐준 뒤 출력해주면 됩니다.
'알고리즘 > 백준(BOJ) 문제풀이' 카테고리의 다른 글
C++ cin 초기화, 입력 버퍼 비우는 법 : ignore 함수 (BOJ 4458) (0) | 2022.03.20 |
---|---|
[백준/BOJ] 1049번 : 기타줄, 9613번 : GCD 합, 21921번 : 블로그 (0) | 2022.03.20 |
[백준/BOJ] 2075번 : K번째 큰 수, 9658번 : 돌 게임 4, 11004번 : K번째 수 (0) | 2022.03.18 |
[백준/BOJ] 14853번 : 동전 던지기 (조합론, Diamond II) (0) | 2022.03.08 |
[백준/BOJ] 2629번 : 양팔저울, 2293번 : 동전 1, 7579번 : 앱 (DP, 동적 계획법 중급) (0) | 2022.03.08 |