Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

중첩된 리스트 #26

Open
hsskey opened this issue Nov 13, 2024 · 1 comment
Open

중첩된 리스트 #26

hsskey opened this issue Nov 13, 2024 · 1 comment

Comments

@hsskey
Copy link
Owner

hsskey commented Nov 13, 2024

문제 설명

중첩된 리스트를 평탄화(flatten)하여 중첩 없는 1차원 리스트로 반환하는 문제

📝 제약조건

  • 입력값은 중첩된 배열
  • 배열의 요소는 숫자 또는 배열
  • 출력값은 1차원 배열이어야 한다.

💡 예시

  • Input: [1, [2, 3, 4], [5, 6, [7, 8]]]
  • Output: [1, 2, 3, 4, 5, 6, 7, 8]

문제 해결 과정

Step 1: 문제 이해하기

작은 예시로 직접 풀어보기:

[1, [2]] → [1, 2]
[[2]] → [2]
[1, [2, [3]]] → [1, 2, 3]

규칙:

  • 숫자는 그대로 결과 배열에 포함
  • 배열을 만나면 내부를 확인하여 숫자를 추출

Step 2: 접근 방법

  1. 직관적 사고

    • 배열을 순회하면서 각 요소를 확인
    • 숫자면 결과에 포함
    • 배열이면 다시 같은 과정 반복
      → 재귀적 해결이 적합해 보임
  2. 자료구조 선택

    • 결과를 담을 배열 필요
    • 재귀 호출로 스택 사용

Step 3: 코드 설계

약식 알고리즘:

i = 0부터 시작
↓
현재 요소가 숫자인지 체크
↓
yes → 숫자 반환
no → 배열이므로 각 요소에 대해 재귀호출
↓
결과 합치기

Step 4: 코드 구현

/**
 * 문제: 중첩된 리스트 풀기  
중첩된 리스트 주어짐 -> 내부 괄호 모두 풀어 중첩 없는 리스트 반환  
입력: `[1, [2, 3, 4], [5, 6, [7, 8]]]`  
출력: `[1, 2, 3, 4, 5, 6, 7, 8]`
 */
/**
 * 
 * @param list { Array<number> }
 */
function flatten(list) { 
   // 종료조건
   if(list && typeof list === 'number') {
    return list 
   }
   let res = []
   // 재귀처리
   for(let item of list) {
    // 데이터 통합
    res = res.concat(flatten(item))
   }
   return res
}
console.log(flatten([1, [2, 3, 4], [5, 6, [7, 8]]]))
@hsskey
Copy link
Owner Author

hsskey commented Nov 28, 2024

인자값이 숫자가 아닐때(null,undefined, string..) 처리

/**
 * 중첩된 배열을 평탄화하는 함수
 * 재귀의 3단계(종료조건, 재귀호출, 데이터통합)를 명확히 구분
 * 
 * @param {Array} list - 평탄화할 중첩 배열
 * @returns {Array} - 평탄화된 배열
 */
function flatten(list) {
    // 1. 종료조건: 배열이 아닌 경우
    if (!Array.isArray(list)) {
        return [list];
    }
    
    // 2. 재귀처리를 위한 결과 배열 초기화
    let result = [];
    
    // 3. 재귀호출과 데이터 통합
    for (let item of list) {
        // 재귀: 각 item에 대해 flatten 수행
        const flattened = flatten(item);
        // 통합: 평탄화된 결과를 결과 배열에 연결
        result = result.concat(flattened);
    }
    
    return result;
}

export default flatten;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant