[Problem Solving] 250420 문제 풀이 기록
오늘도 B2 50문제 (많이 푼 순서대로 첫 150~200문제)를 풀어 보았다. 이제부터는 영어 문제가 조금씩 섞여 있어서 번역하느냐 조금 애를 먹었다. 몇몇 개 재밌는 문제들을 5문제 정도 추려서 정리해본다.
[1] 지수 연산 (BOJ 2052) : 수가 매우 크기 때문에 C++보다는 파이썬을 이용해서 구현하는 것을 권장한다. 분모, 분자에 5^n을 곱하면 답은 5^n/10^n 꼴이 된다는 것을 알 수 있고 5^n을 먼저 계산한 다음에 소수점 아래 자릿수를 맞춰서 출력해주면 된다.
n = int(input())
s = str(5**n)
diff = n - len(s)
for _ in range(diff):
s = "0" + s
print("0." + s)
[2] 문어 (BOJ 21313) : B2에서 오랜만에 본 해 구성하기 문제여서 재밌게 풀었다. 기우성에 따라서 해가 달라진다는 것을 알 수 있다. N이 짝수인 경우 1, 2, . . .를 번갈아가면서 출력해주면 되고 N이 홀수인 경우 첫 번째 문어는 이미 1번 손을 사용했으므로 1, 2, . . .를 번갈아가다가 마지막에 3을 출력해주면 된다.
# include <bits/stdc++.h>
using namespace std;
int n;
int main(void){
cin >> n;
if(n%2 == 0){
for(int i=0;i<n;i++){
cout << (i%2 ? 2 : 1) << " ";
}
}
else{
for(int i=0;i<n;i++){
if(i == n - 1) cout << 3 << " ";
else cout << (i%2 ? 2 : 1) << " ";
}
}
}
[3] 캔디 구매 (BOJ 2909) : 반올림 여부를 고려하면 m = 10^k라고 할 때 c/m * m와 (c/m + 1) * m 중에 하나가 답이 됨을 관찰할 수 있다.
# include <bits/stdc++.h>
using namespace std;
int c, k, m, res;
int main(void){
cin >> c >> k;
m = pow(10, k);
res = c / m * m;
if(c % m * 2 >= m) res += m;
cout << res;
}
[4] 전북대학교 (BOJ 14624) : n이 홀수인 경우에 ㅈ 모양으로 별 찍기를 하는 문제이다.
# include <bits/stdc++.h>
using namespace std;
int n;
void f(int idx, int sp){
if(idx == -1) return;
for(int i=0;i<idx;i++) cout << " ";
cout << "*";
for(int i=0;i<sp;i++) cout << " ";
cout << "*\n";
f(idx - 1, sp + 2);
}
int main(void){
cin >> n;
if(n%2 == 0){
cout << "I LOVE CBNU\n";
return 0;
}
for(int i=0;i<n;i++) cout << "*"; cout << "\n";
int mid = n / 2;
for(int i=0;i<mid;i++) cout << " "; cout << "*\n";
f(mid - 1, 1);
}
[5] 끝말잇기 (BOJ 20528) : B2에서 오랜만에 만난 애드혹 문제라서 재밌게 풀었다. 팰린드롬만을 이용해서 끝말잇기를 할 경우 주어진 단어들의 첫 글자가 모두 같아야 한다는 점을 관찰하면 쉽게 해결할 수 있다.
# include <bits/stdc++.h>
using namespace std;
int n;
string s;
set <char> st;
int main(void){
cin >> n;
while(cin >> s) st.insert(s[0]);
cout << (st.size() == 1);
}