μ•Œκ³ λ¦¬μ¦˜/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

Lv.1 κ°€μž₯ κ°€κΉŒμš΄ 같은 κΈ€μž

meteorqz6 2024. 7. 7. 01:28

문제 μ„€λͺ…

λ¬Έμžμ—΄ sκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, s의 각 μœ„μΉ˜λ§ˆλ‹€ μžμ‹ λ³΄λ‹€ μ•žμ— λ‚˜μ™”μœΌλ©΄μ„œ, μžμ‹ κ³Ό κ°€μž₯ κ°€κΉŒμš΄ 곳에 μžˆλŠ” 같은 κΈ€μžκ°€ μ–΄λ”” μžˆλŠ”μ§€ μ•Œκ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, s = "banana"라고 ν•  λ•Œ, 각 κΈ€μžλ“€μ„ μ™Όμͺ½λΆ€ν„° 였λ₯Έμͺ½μœΌλ‘œ 읽어 λ‚˜κ°€λ©΄μ„œ λ‹€μŒκ³Ό 같이 μ§„ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • bλŠ” 처음 λ‚˜μ™”κΈ° λ•Œλ¬Έμ— μžμ‹ μ˜ μ•žμ— 같은 κΈ€μžκ°€ μ—†μŠ΅λ‹ˆλ‹€. μ΄λŠ” -1둜 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • aλŠ” 처음 λ‚˜μ™”κΈ° λ•Œλ¬Έμ— μžμ‹ μ˜ μ•žμ— 같은 κΈ€μžκ°€ μ—†μŠ΅λ‹ˆλ‹€. μ΄λŠ” -1둜 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • n은 처음 λ‚˜μ™”κΈ° λ•Œλ¬Έμ— μžμ‹ μ˜ μ•žμ— 같은 κΈ€μžκ°€ μ—†μŠ΅λ‹ˆλ‹€. μ΄λŠ” -1둜 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • aλŠ” μžμ‹ λ³΄λ‹€ 두 μΉΈ μ•žμ— aκ°€ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 2둜 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • n도 μžμ‹ λ³΄λ‹€ 두 μΉΈ μ•žμ— n이 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 2둜 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • aλŠ” μžμ‹ λ³΄λ‹€ 두 μΉΈ, λ„€ μΉΈ μ•žμ— aκ°€ μžˆμŠ΅λ‹ˆλ‹€. 이 쀑 κ°€κΉŒμš΄ 것은 두 μΉΈ μ•žμ΄κ³ , μ΄λŠ” 2둜 ν‘œν˜„ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ, μ΅œμ’… 결과물은 [ -1, -1, -1, 2, 2, 2 ]κ°€ λ©λ‹ˆλ‹€.

λ¬Έμžμ—΄ sκ°€ μ£Όμ–΄μ§ˆ λ•Œ, μœ„μ™€ 같이 μ •μ˜λœ 연산을 μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜ solution을 μ™„μ„±ν•΄μ£Όμ„Έμš”.

 

μ œν•œ 쑰건

  • 1 ≤ s의 길이 ≤ 10,000. s은 μ˜μ–΄ μ†Œλ¬Έμžλ‘œλ§Œ 이루어져 μžˆμŠ΅λ‹ˆλ‹€.

 

μž…μΆœλ ₯ 예

s result
"banana" [ -1, -1, -1, 2, 2, 2 ]
"foodbar" [ -1, -1, 1, -1, -1, -1 ]

 

< λ‚˜μ˜ 풀이 >

function solution(s) {
    let arr = s.split('');
    let len = arr.length;
    let answer = Array(len).fill(-1);
    for ( let i = 0 ; i < arr.length ; i++ ){
        for ( let j = 0 ; j < i ; j++){
            if( arr[i] == arr[j] ){
                answer[i] = i - j;    
            }
        }
    }
    return answer;
}

 

 

μ‹€ν–‰ μ‹œκ°„μ΄ λŠλ €μ„œ κ°œμ„ μ΄ ν•„μš”ν•˜λ‹€. ( μ„±λŠ₯ μš”μ•½ - λ©”λͺ¨λ¦¬ : 38MB , μ‹œκ°„ : 369.72 ms )

 

 

< λ‹€λ₯Έ μ‚¬λžŒμ˜ 풀이 >

function solution(s) {
    const hash = {};

    return [...s].map((v, i) => {
        let result = hash[v] !== undefined ? i - hash[v] : -1;
        hash[v] = i;
        return result;
    });
}

// μ΅œμ’…μ μœΌλ‘œ hash = { b: 0, a: 5, n: 4 }

 

- 이해λ₯Ό μœ„ν•΄μ„œ 좜λ ₯을 ν•΄ λ³΄μ•˜λ‹€.

function solution(s) {
    const hash = {};

    return [...s].map((v, i) => {
        // 각 문자의 인덱슀λ₯Ό κ³„μ‚°ν•˜κΈ° 전에 ν˜„μž¬ hash μƒνƒœλ₯Ό 좜λ ₯
        console.log(`Before processing character '${v}' at index ${i}:`, JSON.stringify(hash));

        let result = hash[v] !== undefined ? i - hash[v] : -1;
        hash[v] = i;

        // 문자λ₯Ό μ²˜λ¦¬ν•œ ν›„ hash μƒνƒœλ₯Ό 좜λ ₯
        console.log(`After processing character '${v}' at index ${i}:`, JSON.stringify(hash));
        
        return result;
    });
}

// ν…ŒμŠ€νŠΈ μ‹€ν–‰
console.log(solution("banana"));

 

// Before processing character 'b' at index 0: {}
// After processing character 'b' at index 0: {"b":0}
// Before processing character 'a' at index 1: {"b":0}
// After processing character 'a' at index 1: {"b":0,"a":1}
// Before processing character 'n' at index 2: {"b":0,"a":1}
// After processing character 'n' at index 2: {"b":0,"a":1,"n":2}
// Before processing character 'a' at index 3: {"b":0,"a":1,"n":2}
// After processing character 'a' at index 3: {"b":0,"a":3,"n":2}
// Before processing character 'n' at index 4: {"b":0,"a":3,"n":2}
// After processing character 'n' at index 4: {"b":0,"a":3,"n":4}
// Before processing character 'a' at index 5: {"b":0,"a":3,"n":4}
// After processing character 'a' at index 5: {"b":0,"a":5,"n":4}
// [ -1, -1, -1, 2, 2, 2 ]

 

ex) s = "banana"  좜λ ₯ : [ -1, -1, -1, 2, 2, 2 ]

hash κ°μ²΄λŠ” 각 λ¬Έμžκ°€ λ§ˆμ§€λ§‰μœΌλ‘œ λ“±μž₯ν•œ 인덱슀λ₯Ό μ €μž₯ν•œλ‹€.

[...s]λŠ” λ¬Έμžμ—΄ "banana"λ₯Ό λ°°μ—΄λ‘œ λ³€ν™˜ν•˜λŠ” 것이고, map ν•¨μˆ˜λŠ” λ¬Έμžμ—΄μ˜ 각 λ¬Έμžμ— λŒ€ν•΄ μ‹€ν–‰λœλ‹€.

  • hash[v] !== undefined : λ¬Έμžκ°€ 이전에 λ“±μž₯ν•œ 적이 μžˆλŠ” 경우, result = i - hash[v]
  • hash[v] === undefined : λ¬Έμžκ°€ 처음 λ“±μž₯ν•˜λŠ” 경우 , result = -1

 

[ μΆ”κ°€ ν•™μŠ΅ ]

  • λ¬Έμžμ—΄μ„ λ¬Έμžλ°°μ—΄λ‘œ λ°”κΎΈλŠ” 방법
let s = "banana";
console.log([...s]); // [ 'b', 'a', 'n', 'a', 'n', 'a' ]

 

  • undefined vs null  

          1. undefined : λ³€μˆ˜κ°€ μ„ μ–Έλ˜μ—ˆμ§€λ§Œ 값이 ν• λ‹Ήλ˜μ§€ μ•Šμ€ μƒνƒœ

let x;
console.log(x); // undefined

function foo(y) {
  console.log(y);
}

foo(); // undefined

 

          2. null : λ³€μˆ˜μ— λͺ…μ‹œμ μœΌλ‘œ "값이 μ—†μŒ"을 λ‚˜νƒ€λ‚΄λŠ” νŠΉλ³„ν•œ κ°’

let obj = null;
console.log(obj); // null

 

  • 객체 : ν‚€ - κ°’ 쌍으둜 κ΅¬μ„±λœ 데이터 ꡬ쑰 ( '{}'둜 μ •μ˜ )
let person = {
    name: "Alice",
    age: 30,
    profession: "Engineer"
};

console.log(person); 
// 좜λ ₯: { name: 'Alice', age: 30, profession: 'Engineer' }

// 객체 μ ‘κ·Όν•˜κΈ°
// 점 ν‘œκΈ°λ²•
console.log(person.name); // "Alice"
person.age = 31;
console.log(person.age); // 31

// λŒ€κ΄„ν˜Έ ν‘œκΈ°λ²•
console.log(person["profession"]); // "Engineer"
person["country"] = "USA";
console.log(person["country"]); // "USA"