백준: Silver⑨ - 1606, 1620, 1622, 1676

2 분 소요


</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>

댓글남기기