[TIL] 251021

๊น€์„ธํฌยท2025๋…„ 10์›” 21์ผ

โœ๏ธToday I Learned

๐Ÿ“… 2025-10-21

  • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค: ์‹œ์†Œ ์ง๊ฟ

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค: ์‹œ์†Œ ์ง๊ฟ

๋ฌธ์ œ ๋งํฌ
๋ฌธ์ œ ์„ค๋ช…
์–ด๋А ๊ณต์› ๋†€์ดํ„ฐ์—๋Š” ์‹œ์†Œ๊ฐ€ ํ•˜๋‚˜ ์„ค์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ์†Œ๋Š” ์ค‘์‹ฌ์œผ๋กœ๋ถ€ํ„ฐ 2(m), 3(m), 4(m) ๊ฑฐ๋ฆฌ์˜ ์ง€์ ์— ์ขŒ์„์ด ํ•˜๋‚˜์”ฉ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์‹œ์†Œ๋ฅผ ๋‘ ๋ช…์ด ๋งˆ์ฃผ ๋ณด๊ณ  ํƒ„๋‹ค๊ณ  ํ•  ๋•Œ, ์‹œ์†Œ๊ฐ€ ํ‰ํ˜•์ธ ์ƒํƒœ์—์„œ ๊ฐ๊ฐ์— ์˜ํ•ด ์‹œ์†Œ์— ๊ฑธ๋ฆฌ๋Š” ํ† ํฌ์˜ ํฌ๊ธฐ๊ฐ€ ์„œ๋กœ ์ƒ์‡„๋˜์–ด ์™„์ „ํ•œ ๊ท ํ˜•์„ ์ด๋ฃฐ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ ๋‘ ์‚ฌ๋žŒ์„ ์‹œ์†Œ ์ง๊ฟ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํƒ‘์Šนํ•œ ์‚ฌ๋žŒ์˜ ๋ฌด๊ฒŒ์™€ ์‹œ์†Œ ์ถ•๊ณผ ์ขŒ์„ ๊ฐ„์˜ ๊ฑฐ๋ฆฌ์˜ ๊ณฑ์ด ์–‘์ชฝ ๋‹ค ๊ฐ™๋‹ค๋ฉด ์‹œ์†Œ ์ง๊ฟ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์‚ฌ๋žŒ๋“ค์˜ ๋ชธ๋ฌด๊ฒŒ ๋ชฉ๋ก weights์ด ์ฃผ์–ด์งˆ ๋•Œ, ์‹œ์†Œ ์ง๊ฟ์ด ๋ช‡ ์Œ ์กด์žฌํ•˜๋Š”์ง€ ๊ตฌํ•˜์—ฌ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ ์‚ฌํ•ญ

  • 2 โ‰ค weights์˜ ๊ธธ์ด โ‰ค 100,000
  • 100 โ‰ค weights[i] โ‰ค 1,000
    - ๋ชธ๋ฌด๊ฒŒ ๋‹จ์œ„๋Š” N(๋‰ดํ„ด)์œผ๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
    - ๋ชธ๋ฌด๊ฒŒ๋Š” ๋ชจ๋‘ ์ •์ˆ˜์ž…๋‹ˆ๋‹ค.

์ด์ „ ํ’€์ด

๋ชจ๋“  ์Œ์„ ๊ณ„์‚ฐํ•˜์—ฌ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(N^2)์œผ๋กœ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋๋‹ค.

#include <vector>
using namespace std;
long long solution(vector<int> weights) {
    long long answer = 0;
    vector<int> seesaw = {2,3,4};
    int idx = 0;
    while(idx<weights.size())
    {
        int temp = weights[idx];
        for(int i = idx + 1; i < weights.size(); i++)
        {
            if(temp == weights[i])
            {
                answer += 1;
                continue;
            }
            for(const int& dist1 : seesaw)
            {
                for(const int& dist2 : seesaw)
                {
                    if(temp*dist1%dist2 != 0) continue;
                    if(temp*dist1/dist2 < weights[i]) break;
                    if(temp*dist1/dist2 == weights[i])
                    {
                        answer += 1;
                        break;
                    }
                }
            }
        }
        idx += 1;
    }
    return answer;
}

์ตœ์ข… ํ’€์ด

๋ชธ๋ฌด๊ฒŒ๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ์˜ ์กฐํ•ฉ ์ˆ˜๋ฅผ ๋จผ์ € ๊ณ„์‚ฐ ํ›„ ๋ชธ๋ฌด๊ฒŒ ๋ณ„๋กœ ๊ฑฐ๋ฆฌ์— ๋”ฐ๋ฅธ ์กฐํ•ฉ ๊ณ„์‚ฐํ•˜์—ฌ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ O(N)์œผ๋กœ ์ค„์˜€๋‹ค.

#include <vector>
#include <unordered_map>

using namespace std;

long long solution(vector<int> weights) {
    long long answer = 0;
    unordered_map<int, long long> weightCount;
    
    // ๋ชธ๋ฌด๊ฒŒ๋ณ„ ์ธ์› ์ˆ˜
    for(const int& i : weights)
    {
        weightCount[i] += 1;
    }
    // ๊ฐ™์€ ๋ชธ๋ฌด๊ฒŒ ์กฐํ•ฉ ์ˆ˜
    for(const auto& [w,c] : weightCount)
    {
        if(c>1)
        {
            answer+=c*(c-1)/2;
        }
    }
    
    for(const auto& [w,c] : weightCount)
    {
        // 2:3
        if(w * 2 % 3 == 0)
        {
            int temp = w * 2 / 3;
            if(weightCount.find(temp) != weightCount.end())
            {
                answer += c * weightCount[temp];
            }
        }                
        // 2:4
        if(w * 2 % 4 == 0)
        {
            int temp = w * 2 / 4;
            if(weightCount.find(temp) != weightCount.end())
            {
                answer += c * weightCount[temp];
            }
        }
        // 3:4
        if(w * 3 % 4 == 0)
        {
            int temp = w * 3 / 4;
            if(weightCount.find(temp) != weightCount.end())
            {
                answer += c * weightCount[temp];
            }
        }
    }
    
    return answer;
}

๐Ÿ’ก ๋А๋‚€ ์  (What I Felt)


์ถœ์ฒ˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค: ์‹œ์†Œ ์ง๊ฟ

0๊ฐœ์˜ ๋Œ“๊ธ€