[알고리즘] 배열을 반복해 순차적으로 값을 변경 및 수정하기

2022. 7. 28. 13:54·알고리즘/풀이 힌트
반응형

0. 들어가며 

프로그래머스 순위 탐색 문제를 풀다가 배열을 참조해서 순차적으로 배열을 변경하는 경우가 의외로

많이 있는 것 같아서 정리하였다. 

1. 사용 방식

예를 들어 [a, b, c, b, e]라는 배열이 있는데, 이것을 [-, b, c, d, e], [-, -, c, d, e], ... [a, b, c, d, -] 순으로 

모든 경우의 수를 다 만들어야 하는 상황이 있을 것이다. 

 

그럴 경우에 반복문을 통해서 만들어도 되지만 그렇게 만들려면 배열의 길이는 고정되야하고 

배열의 속성 개수에 따라 반복문 개수도 변경되기 때문에 일반적으로 재귀함수를 사용한다. 

 

2. 코드 구현 

const info = [
  "java backend junior pizza 150",
  "python frontend senior chicken 210",
  "python frontend senior chicken 150",
  "cpp backend senior pizza 260",
  "java backend junior chicken 80",
  "python backend senior chicken 50",
];

function loop(key, index, score, map) {
  const joinKey = key.join(" ");
  const arr = map[joinKey];
  if (arr) {
    arr.push(score);
  } else {
    map[joinKey] = [score];
  }

  for (let i = index; i < key.length; i++) {
    const newKey = [...key];
    newKey[i] = "-";

    loop(newKey, i + 1, score, map);
  }
}

const map = {};

for (const item of info) { 
  // item은 info의 값
  const key = item.split(" ");
  const score = parseInt(key.pop());

  loop(key, 0, score, map);
}

프로그래머스에서 사용된 코드의 일부분을 가지고 왔다. 

 

function loop(key, index, score, map) {
  const joinKey = key.join(" ");
  
  // ...
  
  map[joinKey] = [score];

  for (let i = index; i < key.length; i++) {
    const newKey = [...key];
    newKey[i] = "-";

    loop(newKey, i + 1, score, map);
  }
}

핵심은 loop 함수이다.  매개 변수로 4개를 받는데 

  • key : 기준 배열 
  • index : 몇 번째 값을 변경할 지를 나타내는 index
  • score : 점수를 나타냄 ( 의미 없음 )
  • map : 틀이 되는 객체 ( 틀이 되는 배열이라고 생각하면 됨 )

 

재귀 함수 loop에서 현재 배열 key를 for문으로 반복하고 있다. 

for (let i = index; i < key.length; i++) {
  const newKey = [...key];
  newKey[i] = "-";

  loop(newKey, i + 1, score, map);
}

여기서 let i 는 index를 가지고 있는데,

이게 처음엔 0 이고 만약 loop를 이동하다 보면 i + 1이기 때문에 1, 2, 3 ... 이 될 것이다. 

 

그래서 0번째를 " - " 로 바꾸고 다시 loop에선 1번째를 " - " 로 바꾸는 방식으로 반복한다. 

그렇게 하면 중복은 발생하지 않고 모든 경우의 값을 만들 수 있다. 

반응형
저작자표시 비영리 변경금지

'알고리즘 > 풀이 힌트' 카테고리의 다른 글

[알고리즘] 기준이 되는 배열로 만들 수 있는 모든 배열을 만들기  (1) 2022.08.01
[알고리즘] 이진 탐색 - JavaScript  (1) 2022.07.29
[알고리즘] 배열( 순차 리스트)  (4) 2022.04.20
[알고리즘] 자바스크립트 9가지 코드 트릭  (5) 2022.04.19
[알고리즘] 시간 복잡도  (0) 2022.04.11
'알고리즘/풀이 힌트' 카테고리의 다른 글
  • [알고리즘] 기준이 되는 배열로 만들 수 있는 모든 배열을 만들기
  • [알고리즘] 이진 탐색 - JavaScript
  • [알고리즘] 배열( 순차 리스트)
  • [알고리즘] 자바스크립트 9가지 코드 트릭
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    react
    리얼클래스
    알고리즘
    Node.js
    webpack
    ChatGPT
    자바스크립트
    CCNA
    바질 키우기
    네트워크
    리액트
    typescript
    네이버 부스트캠프
    Babel
    리얼학습일기
    javascript
    덤프
    CSS
    ReactNative
    redux
    다이소
    식물
    Docker
    타일러영어
    영어회화
    타입스크립트
    next.js
    프로그래머스
    영어독학
    바질
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[알고리즘] 배열을 반복해 순차적으로 값을 변경 및 수정하기
상단으로

티스토리툴바