티스토리 뷰

728x90
반응형

목차

     

    문제

     

    <그림 1>과 같이 9×9 격자판에 쓰인 81개의 자연수 또는 0이 주어질 때, 

    이들 중 최댓값을 찾고 그 최댓값이 몇 행 몇 열에 위치한 수인지 구하는 프로그램을 작성하시오.

    예를 들어, 다음과 같이 81개의 수가 주어지면

     

    <그림 1>

    이들 중 최댓값은 90이고, 이 값은 5행 7열에 위치한다.

     

    입력

     

    첫째 줄부터 아홉 번째 줄까지 한 줄에 아홉 개씩 수가 주어진다. 

    주어지는 수는 100보다 작은 자연수 또는 0이다.

     

    출력

     

    첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 위치한 행 번호와 열 번호를 빈칸을 사이에 두고 차례로 출력한다. 

    최댓값이 두 개 이상인 경우 그 중 한 곳의 위치를 출력한다.

     

    풀이

     

    문제 풀이에 앞서, 이번 문제에서는 여태까지 본 적 없었던 입력 방식이 등장한다.

     

    기존 방식으로 문제를 풀다가 다른 사람의 풀이가 궁금해서 보다가 알게 된 방식인데,

     

    이차원 배열과 같이 대량의 데이터를 받을 때 좋은 방식인 것 같아 사용하기로 했다.

     

    해당 코드는 다음과 같다.

    let rl = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');

    이 방식은 기존의 'readline'이 아닌 'fs' 모듈을 사용해서 파일 시스템의 파일을 동기적으로 읽어온다.

     

    여기서 보면 readFileSync를 통해 동기적으로 읽어온 파일을 toString() 메서드로 문자열로 변환,

     

    trim()과 split()을 이용해 배열로 만드는 것을 확인할 수 있다.

     

    그런데 문제에서 입력값을 받는데 갑자기 왜 '/dev/stdin'파일을 읽지? 해서 알아보니

     

    '/dev/stdin'은 유닉스 계열의 운영체제에서 사용되는 특수한 파일로, 표준 입력을 나타낸다고 한다.

     

    그러니까 표준 입력이 임시로 저장되는 파일이라고 보면 될 것 같다.

     

    다른 운영체제에서도 지원하는지는 모르겠으나, 어쨌든 맥에서는 지원을 하고, 또 매우 편리해서 소개해 보았다.

     

    계속해서 문제를 풀어보자. 문제 풀이 로직 자체는 사실 별 다른 게 없다.

     

    1. 9 x 9 크기의 이중 배열을 이중 반복문을 이용해 탐색한 뒤
    2. 최댓값과 그 위치를 기록해서
    3. 반복문이 종료되면 최댓값과 그 위치를 출력하면 된다.

    하지만 여기서 또 한 조각 흥미로운 코드가 등장하는데, 바로 아래의 녀석이다.

    rl.forEach((line, rowIndex) => {
        let numbers = line.split(' ').map(Number);
        numbers.forEach((num, colIndex) => {
            if (num > mx) {
                mx = num;
                mxRow = rowIndex + 1;
                mxCol = colIndex + 1;
            }
        });
    });

    위 함수는 이차원 배열에서 최댓값과 그 위치를 찾는다. 즉 위에서 언급한 이중 반복문이다.

     

    forEach를 아무렇지도 않게 사용해 람다식으로 이중 반복문을 사용한다는 점이 꽤 마음에 들었다.

     

    노드로 개발하는 법을 공부하면서도 꽤 매력을 느끼는 중인데..

     

    코드가 길다는 단점 때문에 역시 파이썬 만한 끌림은 없는 듯하다.

     

    문제풀이 코드를 보고 마치자.

     

    JavaScript

     

    let rl = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
    let mx = Number.MIN_SAFE_INTEGER;
    let mxRow = -1;
    let mxCol = -1;
    
    rl.forEach((line, rowIndex) => {
        let numbers = line.split(' ').map(Number);
        numbers.forEach((num, colIndex) => {
            if (num > mx) {
                mx = num;
                mxRow = rowIndex + 1;
                mxCol = colIndex + 1;
            }
        });
    });
    
    console.log(mx);
    console.log(`${mxRow} ${mxCol}`);

     

    반응형
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2024/05   »
    1 2 3 4
    5 6 7 8 9 10 11
    12 13 14 15 16 17 18
    19 20 21 22 23 24 25
    26 27 28 29 30 31
    글 보관함