티스토리 뷰
[JavaScript]2566번, 최댓값, 이차원 배열, 두 번째 입력방식
Vagabund.Gni 2023. 7. 25. 21:55목차
문제
<그림 1>과 같이 9×9 격자판에 쓰인 81개의 자연수 또는 0이 주어질 때,
이들 중 최댓값을 찾고 그 최댓값이 몇 행 몇 열에 위치한 수인지 구하는 프로그램을 작성하시오.
예를 들어, 다음과 같이 81개의 수가 주어지면
이들 중 최댓값은 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'은 유닉스 계열의 운영체제에서 사용되는 특수한 파일로, 표준 입력을 나타낸다고 한다.
그러니까 표준 입력이 임시로 저장되는 파일이라고 보면 될 것 같다.
다른 운영체제에서도 지원하는지는 모르겠으나, 어쨌든 맥에서는 지원을 하고, 또 매우 편리해서 소개해 보았다.
계속해서 문제를 풀어보자. 문제 풀이 로직 자체는 사실 별 다른 게 없다.
- 9 x 9 크기의 이중 배열을 이중 반복문을 이용해 탐색한 뒤
- 최댓값과 그 위치를 기록해서
- 반복문이 종료되면 최댓값과 그 위치를 출력하면 된다.
하지만 여기서 또 한 조각 흥미로운 코드가 등장하는데, 바로 아래의 녀석이다.
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}`);
'Algorithm > [Java+Python+JavaScript]BackJoon' 카테고리의 다른 글
[Java+Python]24444번, 알고리즘 수업 - 너비 우선 탐색 1 (0) | 2023.08.03 |
---|---|
[JavaScript]2745번, 진법 변환 (0) | 2023.08.02 |
[Java+Python]24480번, 알고리즘 수업 - 깊이 우선 탐색 2 (0) | 2023.07.30 |
[Java+Python]24479번, 알고리즘 수업 - 깊이 우선 탐색 1 (0) | 2023.07.24 |
[Java+Python]3015번, 오아시스 재결합 (0) | 2023.07.22 |
[Java+Python]1725번, 히스토그램 (0) | 2023.07.21 |
- Total
- Today
- Yesterday
- 세모
- 동적계획법
- Algorithm
- 스프링
- 알고리즘
- 면접 준비
- 자바
- 기술면접
- 지지
- Backjoon
- 스트림
- 여행
- 세계여행
- 파이썬
- 중남미
- 유럽
- java
- 백준
- BOJ
- RX100M5
- 리스트
- 남미
- 칼이사
- 세계일주
- Python
- 유럽여행
- 야경
- a6000
- spring
- 맛집
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |