[알고리즘] 양옆앞뒤 큰 수 찾기

Jay·2023년 6월 22일
0

TIL

목록 보기
10/12
post-custom-banner

조건

5x5 2차원 배열이 주어질 때 어떤 원소가 상하좌우에 있는 원소보다 클 때 해당 위치에 * 을 표시하는 프로그램을 작성하세요. 경계선에 있는 수는 상하좌우 중 존재하는 원소만을 비교합니다.

조건 1: 결과는 하나의 문자열이며, 2차원 배열의 각 배열의 요소들에 해당하는 문자는 길이 1의 공백으로 구분된다.

조건2: 결과에서 배열간의 구분은 줄바꿈(개행문자)으로 한다.

조건3: 비교할 원소가 존재하지 않는 경우 0으로 간주한다.

My Solution / Try

  • 비교할 이중배열의 상하좌우 해당 인덱스 요소가 undefined라면 크기를 비교할 수 없음
  • push와 unshift를 활용해서 이중배열 테두리를 전부 0으로 채움
  • 상하좌우를 비교해서 제일 큰 수에 * 재할당
function solution(arr1){
    
    arr1.push([0,0,0,0,0])
    arr1.unshift([0,0,0,0,0])
    arr1.map(e => e.push(0))
    arr1.map(e => e.unshift(0))

    for (let i=1; i<=5; i++) {
        for (let j=1; j<=5; j++) {
            if (arr1[i][j] > arr1[i-1][j] && arr1[i][j] > arr1[i+1][j] && arr1[i][j] > arr1[i][j-1] && arr1[i][j] > arr1[i][j+1]) {
                arr1[i][j] = "*"
            }
        }
    }
    arr1.pop()
    arr1.shift()
    arr1.map(e => e.pop())
    arr1.map(e => e.shift())

    for (let i = 0; i<5; i++) {
        console.log(...arr1[i]);
    }	
}

Another Solution

  • 이중배열의 인덱스를 활용해 상하좌우 값이 있을 때만 할당 (없으면 0)
  • 현재값과 상하좌우 비교
function solution(arr1) {
  let answer = [[], [], [], [], []];

  for (let i = 0; i < 5; i++) {
    for (let j = 0; j < 5; j++) {
      let current = arr1[i][j];
      let top = i > 0 ? arr1[i - 1][j] : 0;
      let bottom = i < 4 ? arr1[i + 1][j] : 0;
      let left = j > 0 ? arr1[i][j - 1] : 0;
      let right = j < 4 ? arr1[i][j + 1] : 0;

      if (
        current > top &&
        current > bottom &&
        current > left &&
        current > right
      ) {
        answer[i][j] = '*';
      } else {
        answer[i][j] = current;
      }
    }
  }

  let result = '';
  for (let i = 0; i < 5; i++) {
    result += answer[i].join(' ') + '\n';
  }
  console.log(result);
}
profile
Software Developer
post-custom-banner

0개의 댓글