백준: Silver⑨ - 1606, 1620, 1622, 1676
</br>
계속 계속
</br>
1606: 침투 계획 세우기
https://www.acmicpc.net/problem/1606
육각형을 좌표로 나타냈을 때 번호로 변환하기
if( a == 0 && b == 0 ){
cout << 1 << endl;
return 0;
}
if( b == 0 ){
long long ans = 1 + 6 * a*(a+1) / 2;
cout << ans << endl;
return 0;
}
int x = a+b-1, y = 1;
long long ans = (long long)2 + (long long)6 * x*(x+1) / 2;
while( x != a || y != b ){
x -= 1;
y += 1;
ans++;
}
cout << ans << endl;
이걸 좀 보니까
0 0 1
0 1 2
6
1 0 7
1 1 8
0 2 9
12
2 0 19
2 1 20
1 2 21
0 3 22
18
3 0 37
3 1 38
2 2 39
1 3 40
0 4 41
...
이런 규칙이 있더라
그래서 (x, 0)의 경우를 따로 처리하고, (x, y)의 경우는 (x, 1)에서부터 계산해 나갔다.
</br>
1620: 나는야 포켓몬 마스터 이다솜
https://www.acmcpc.net/problem/1620
도감 번호 말하면 이름 대답하고 이름 말하면 번호 대답하기
string v[100001];
map<string, int> ma;
int n, m;
cin >> n >> m;
for(int i = 1; i < n+1; i++){
string s;
cin >> s;
v[i] = s;
ma.insert(pair<string, int>(s, i));
}
for(int i = 0; i < m; i++){
string s;
cin >> s;
if( '0' < s[0] && s[0] <= '9' ){
int t = stoi(s);
cout << v[t] << '\n';
}
else{
cout << ma[s] << '\n';
}
}
그냥 벡터랑 맵에 저장해서 출력하면 되는 건데
시간 초과 났다
cout << endl
은 상당히 시간이 걸린다고 한다.
cout << '\n';
로 바꾸니 바로 통과한다.
소중한 걸 배웠다… cin만 tie한다고 되는 게 아니었다
어디서 endl말고 ‘\n’ 쓰라는 말을 듣기는 했는데 진짜 오래 걸리는구나
</br>
1622: 공통 순열
https://www.acmcpc.net/problem/1622
부분 수열: 대충 A ⊆ B일 때 A는 B의 부분 수열이라는 느낌
for (int i = 0; !cin.eof(); i++){
memset(a1, 0, 26*sizeof(int));
memset(a2, 0, 26*sizeof(int));
string s1, s2;
getline(cin, s1);
getline(cin, s2);
if( s1.size() == 0 || s2.size() == 0 ){
cout << '\n';
continue;
}
for(int j = 0; j < s1.size(); j++){
a1[s1[j]-'a']++;
}
for(int j = 0; j < s2.size(); j++){
a2[s2[j]-'a']++;
}
string ans = "";
for(int j = 0; j < 26; j++){
if( a1[j] && a2[j] ){
ans.append(min(a1[j], a2[j]), j+'a');
}
}
cout << ans << '\n';
}
그러니까 둘이 공통된 것들을 다 출력하면 된다는 거
그래서 각자 알파벳 개수를 저장하고, 둘 다 그 알파벳이 있다면 min값만큼 출력해주면 되더라
</br>
1676: 팩토리얼 0의 개수
https://www.acmicpc.net/problem/1676
n!의 오른쪽에 0이 몇 개 있을까
int fives = 0, twos = 0;
for(int i = 1; i <= n; i++){
int k = i;
if( k % 2 == 0 ){
while( k % 2 == 0 ){
k /= 2;
twos++;
}
}
if( k % 5 == 0 ){
while( k % 5 == 0 ){
k /= 5;
fives++;
}
}
}
cout << min(twos, fives)<< endl;
0은 10이 곱해짐을 의미하고 10은 2와 5로 있으니까, 2랑 5가 몇 개 들어갈지 세서 min을 출력하면 된다.
</br>
44.610%까지 올렸다 다음 포스트 분량이면 45는 찍겠다
학교 순위도 148등~~ 이제 150 안에 들었네
</br>
댓글남기기