백준: Silver⑥ - 1740, 1769, 1789, 1812

2 분 소요


</br> 계속 풀이
</br>

1740: 거듭제곱

https://www.acmicpc.net/problem/1740

서로 다른 3의 제곱으로 표현되는 수 n 구하기

방법 1.

    long long n;
    cin >> n;
    int ind = 0;
    while( n > 0 ){
        bits[ind++] = n % 2;
        n /= 2;
    }
    unsigned long long cnt = 1, ans = 0;
    for(int i = 0; i < ind; i++){
        if( bits[i] ) ans += cnt;
        cnt *= 3;
    }
    cout << ans << endl;

헉… 갑자기 좀 까다롭다
삼진법을 사용하면 되겠다는 건 알았는데, long long으로 선언하고 for문으로 n & (1 << i)를 사용했는데 계속 32비트까지밖에 안 되더라!!
그래서 bits[]에다가 n을 이진수로 바꿔서 저장하고 답을 구했다.

방법 2.

    long long n;
    cin >> n;
    long long cnt = 1, ans = 0;
    for(long long i = 0; i < 64; i++){
        if( n & (1LL << i) ) ans += cnt;
        cnt *= 3;
    }
    cout << ans << endl;

나중에 찾아 보니, 쉬프트 연산을 받는 1이 32비트 정수형이라서 그렇다고 한다…
그래서 (long long )1, 또는 1LL이라 적고 쉬프트 해 주면 잘 되더라.
또 이렇게 배워 갑니다
</br>

1769: 3의 배수

https://www.acmcpc.net/problem/1769

어떤 수의 모든 자리를 더한 게 3의 배수면 그 수도 3의 배수다. 자리수 합이 한 자리수가 되게 하려면 이 변환을 몇 번 거쳐야 할까

    int cnt = 0;
    string y = n;
    while( y.size() > 1 ){
        long long sum = 0;
        for(int i = 0; i < y.size(); i++){
            sum += y[i] - '0';
        }
        y = to_string(sum);
        cnt++;
    }
    cout << cnt << endl;
    if( y[0] == '3' || y[0] == '6' || y[0] == '9' ) cout << "YES" << endl;
    else cout << "NO" << endl;

또 조건을 잘못 봐서 한 번 틀렸다. X가 1000000자리 이하의 수라고 한다. 짱 길다는 뜻

그래서 string으로 받고 다 더해줬다. 그게 한 자리수가 될 때까지 반복하기
</br>

1789: 수들의 합

https://www.acmcpc.net/problem/1789

S가 최대 몇 개의 서로 다른 자연수들의 합으로 이루어질까

    for(int i = 1; i < 100000; i++){
        long long sum = (long long)i*(i+1) / 2;
        if( sum > n ){
            cout << i-1 << endl;
            break;
        }
    }

간단하게 생각해 보니 최대로 서로 다른 자연수들의 합이니 당연히 1부터 더해야 할 것 같고… 그럼 1부터 i까지의 합으로 나타나지겠다.
따라서 1부터 i까지의 합과, 1부터 i+1까지의 합 사이의 S들은 전부 i개의 수들로 표현이 될 거다.
</br>

1812: 사탕

https://www.acmicpc.net/problem/1812

옆사람과의 사탕 개수 합만 알 때 각자의 개수 알아내기

    int sum = 0, sum2 = 0;
    for(int i = 0; i < n; i++){
        int a;
        cin >> a;
        v.push_back(a);
        sum += a;
        if( i%2 == 0 )sum2 += a;
    }
    sum2 -= v[n-1];
    sum /= 2;
    candies[n-1] = sum - sum2;
    int c = candies[n-1];
    for(int i = n-2; i >= 0; i--){
        candies[i] = v[i] - c;
        c = candies[i];
    }
    for(int i = 0; i < n; i++){
        cout << candies[i] << endl;
    }

n이 홀수이므로,

    a1 + a2 + a3 + a4 + a5 = s
-   a1 + a2   a3 + a4
                        a5 = s - ?

이렇게 생각해서 마지막 사람의 사탕 개수를 구할 수 있다
그걸로 계속 계속 구해주면 끝
</br>


이제 108문제 풀었고 학교 랭킹 159등이 되었다
등수 간 문제 수가 좀 차이나기 시작한다.
정답률은 42.857%다~~ 많이 늘었네
</br>

댓글남기기