ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 최대값, 최소값 - JavaScript
    알고리즘/Javascript 문제 2025. 4. 2. 23:39

     

    오늘은 JS를 사용해서 최대값과 최소값을 구하는 문제를 풀어본다.

    문제는 프로그래머스의 161990번 바탕화면 정리이다.

     

    문제: 바탕화면 정리

    1. 입력: 빈칸은 ".", 파일이 있는 칸은 "#"으로 표시한 배열

    • wallpaper = [".#...", "..#..", "...#."]
    • wallpaper[i][j]는 바탕화면에서 (i+1) 행, (j+1) 열에 해당하는 칸의 상태를 의미

    2. 로직: 드래그 한 거리 | rdx - lux | + | rdy - luy|

    • 가장 작은 row의 #은 lux를 결정
    • 가장 작은 col의 #은 luy을 결정
    • 가장 큰 row의 #은 rdx를 결정 → rdx + 1
    • 가장 큰 col의 #은 rdy를 결정 → rdy + 1
    • rdx와 rdy가 1이 더해짐을 아래 그림을 통해 이해해야 한다.

    프로그래머스 161990번 바탕화면 정리 설명 그림 중 일부

     

    3. 출력: 드래그의 시작점(lux, luy), 끝점 (rdx, rdy)의 정보를 가진 정수 배열 [ lux, luy, rdx, rdy ]

     

    제출한 답안

    wallpaper 값을 받아서 lux, luy, rdx, rdy를 뽑아낸 뒤 배열에 넣어 반환해주면 되겠다.

    최대값, 최소값을 구하는 방식으로 구현한다.

    • 가장 작은 값들에는 역설적으로 가장 큰 값을 넣어, 자신보다 작은 값으로 계속 업데이트를 수행
    • 반대로 가장 큰 값들에는 가장 작은 값을 넣고 자신보다 큰 값으로 계속 업데이트를 수행

    문자열을 스프레드 연산자를 활용하면 Array.from('문자열')과 동일한 결과를 가진다.

    function solution(wallpaper) {
      let [minX, minY, maxX, maxY] = [Infinity, Infinity, -Infinity, -Infinity];
    
      wallpaper.forEach((cols, row) => {
        [...cols].forEach((char, col) => {
          if (char === '#') {
            minX = minX > row ? row : minX;
            minY = minY > col ? col : minY;
            maxX = maxX < row ? row : maxX;
            maxY = maxY < col ? col : maxY;
          }
        });
      });
    
      return [minX, minY, maxX + 1, maxY + 1];
    }
    
    // console.log(solution(['.#...', '..#..', '...#.']));
    // console.log(solution(['..........', '.....#....', '......##..', '...##.....', '....#.....']));
    // console.log(solution(['.##...##.', '#..#.#..#', '#...#...#', '.#.....#.', '..#...#..', '...#.#...', '....#....']));
    // console.log(solution(['..', '#.']));

     

     

     

     

    출처 1. 프로그래머스 | 바탕화면 정리

Designed by Tistory.