πŸ’― CodingTest/Programmers

[Programmers] (Javascript) 좔석 νŠΈλž˜ν”½

S.Honey 2022. 4. 26. 17:30

https://programmers.co.kr/learn/courses/30/lessons/17676#qna

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - [1μ°¨] 좔석 νŠΈλž˜ν”½

μž…λ ₯: [ "2016-09-15 20:59:57.421 0.351s", "2016-09-15 20:59:58.233 1.181s", "2016-09-15 20:59:58.299 0.8s", "2016-09-15 20:59:58.688 1.041s", "2016-09-15 20:59:59.591 1.412s", "2016-09-15 21:00:00.464 1.466s", "2016-09-15 21:00:00.741 1.581s", "2016-09-1

programmers.co.kr

 

β–Ά μ½”λ“œ : 

function solution(lines) {
    let answer = 0;
    let data = [];
    let minTime = 100000000;
    let maxTime = 0;

    for (const line of lines)
    {
        var temp = line.split(' ');
        var time = temp[1].split(':');
        var h = parseInt(time[0]) * 3600;
        var m = parseInt(time[1]) * 60;
        var s = parseFloat(time[2]);

        var endTime = (h + m + s) * 1000;
        var startTime = endTime - (parseFloat(temp[2].split('s').join(''))*1000 - 1);
        data.push([startTime, endTime]);
    }
   
    // λ¬Έμžμ—΄μ„ 숫자둜 λ°”κΎΈμ–΄ μ €μž₯
    // 초둜 λ³€ν™˜ν•΄μ„œ ν•΄λ³΄μž

    let count = 0;

    for (let i =0; i < data.length; i++)
    {
        let boundL = data[i][1];
        let boundR = boundL + 999;
        let temp = 1;

        for (let j = i+1; j<data.length; j++)
        {
            if (data[j][0] > boundR)
            {
                continue;
            }
            else
            {
                temp+=1;
            }
        }

        if (temp > count)
        {
            count = temp;
        }
    }
    return count;
}

 

β–Ά 문제 풀이 : 

1. 초기 각각의 둜그 정보 λ¬Έμžμ—΄λ“€μ— λŒ€ν•΄ μ‹œκ°„μ„ 초의 λˆ„μ μœΌλ‘œ λ³€ν™˜ν•œλ‹€. 

  - ν•΄λ‹Ή 문제의 경우 μ†Œμˆ˜μ  μ…‹μ§Έμžλ¦¬κΉŒμ§€ λ‚˜νƒ€λ‚˜ μžˆκΈ°μ— 1000을 κ³±ν•˜μ—¬ μ •μˆ˜ν˜•νƒœλ‘œ λ³€ν™˜ν•œλ’€ μ‹œμž‘μ‹œκ°„κ³Ό λμ‹œκ°„μ˜ 초(second)λˆ„μ κ°’μ„ data 배열에 μ €μž₯ν–ˆλ‹€.

2. 이제 ν•΄λ‹Ή 값듀을 μ΄μš©ν•΄ νƒμƒ‰ν•˜μ—¬ 1μ΄ˆλ™μ•ˆ 처리된 둜그수의 μ΅œλŒ€κ°’μ„ μ°Ύμ•„μ•Όν•˜λŠ”λ° 초기 완전탐색을 μ΄μš©ν•΄ κ΅¬ν˜„ν–ˆμœΌλ‚˜ μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚˜μ™”λ‹€.

3. μ΄λ‘œμΈν•΄ λ‘œμ§μ— λ³€ν™”λ₯Ό μ£Όμ–΄μ•Ό ν–ˆκ³ , μ’…λ£Œμ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœλœ μ •λ ¬λœ 데이터(lines)μž„μ— μ°©μ•ˆν•˜μ—¬ 각 둜그의 μ’…λ£Œμ‹œκ°„μ„ μ‹œμž‘μ‹œκ°„μœΌλ‘œ ν•˜μ—¬ 1초 내에 둜그의 수λ₯Ό νƒμƒ‰ν•˜λ©΄ λœλ‹€κ³  μƒκ°ν–ˆλ‹€.

4. 이후 각각의 κ΅¬κ°„λ³„λ‘œ λ‹€λ₯Έ λ‘œκ·Έλ“€(ν˜„μž¬ μ‹œμž‘κ°’μ΄ λ˜λŠ” 둜그의 이후 처리된 λ‘œκ·Έλ“€)κ³Ό λΉ„κ΅ν•˜μ—¬ 만일 ν˜„μž¬ 1μ΄ˆκ΅¬κ°„μ˜ λ§ˆμ§€λ§‰μ‹œκ°„(boundR)보닀 ν•΄λ‹Ή 둜그의 μ‹œμž‘μ‹œκ°„(data[j][0])이 큰 κ²½μš°κ°€ μ•„λ‹ˆλΌλ©΄ countλ₯Ό μ˜¬λ €μ£Όμ—ˆλ‹€.

 

둜그 μ˜ˆμ‹œ

- μœ„μ™€ 같이 λ‘œκ·Έκ°€ μ’…λ£Œμ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬λ˜μ–΄ μžˆλ‹€λ©΄, 각 둜그의 μ’…λ£Œκ°’ κΈ°μ€€ 1μ΄ˆλ‚΄ λ‹€λ₯Έ λ‘œκ·Έλ“€κ³Ό κ²ΉμΉ˜λŠ” 횟수λ₯Ό μ„ΈλŠ” 것이 κ°€μž₯ 큰 count값을 얻을 수 μžˆλŠ” 방법이닀.

 

β–Ά μ‹€νŒ¨ μ½”λ“œ => κ²½μš°κ°€ λ‹€λ₯΄λ‹€.

μ΄κ²½μš°λŠ” λ‘œκ·Έμ‹œκ°„μ΄ μ’…λ£Œμ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœμ΄ μ•„λ‹λ•Œ μ™„μ „νƒμƒ‰μœΌλ‘œ κ΅¬ν˜„ν•œ 경우

let count = 0;
// 둜그 쀑 μ–΄λ–€ λ‘œκ·Έμ‹œκ°„μ˜ endtimeμœΌλ‘œλΆ€ν„° 1μ΄ˆλ‚΄μ— ν•΄λ‹Ή μ‹œκ°„μ΄ ν¬ν•¨λ˜λŠ”μ§€λ₯Ό ν™•μΈν•˜λ©΄ νƒμƒ‰νšŸμˆ˜λ₯Ό 쀄일 수 μžˆλ‹€.   
// ν˜„μž¬ 방식은 λ‘œκ·Έμ‹œκ°„μ΄ μ’…λ£Œμ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ 정렬이 μ•„λ‹λ•Œμ˜ κ²½μš°μž„
   
for (let i = minTime; i <= maxTime; i++ )
{
    let boundL = i;
    let boundR = i + 999;
    let temp = 0;

    for (const times of data)
    {
        if (times[1] < boundL || times[0] > boundR){
            continue;
        }
        else
        {
            temp += 1;
        }
    }

    if (temp > count)
    {
        count = temp;
    }
}