백준 1474번
- 이 문제는 다 풀어놓고 js 특유의 입력값을 받는 방식을 잘못설정하여 한참을 헤맸던 문제이다...
https://www.acmicpc.net/problem/1475
1475번: 방 번호
첫째 줄에 다솜이의 방 번호 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수이다.
www.acmicpc.net
맨처음 제출한 코드
let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().split(' ');
//입력값 가공
let target = [];
for(let i = 0;i < input[0].length;i++){
target.push(input[0][i]);
}
//각각의 번호가 몇번필요한지 종합할 배열 생성
let numbers = [0,0,0,0,0,0,0,0,0,0];
for(let i = 0; i < target.length; i++){
numbers[Number(target[i])]++;
}
//6과 9는 하나로 생각해도 되므로 둘을 합친뒤 /2 그리고 반올림
let sixNine = Math.ceil(((numbers[6] + numbers[9])/2));
numbers[6] = sixNine;
numbers[9] = sixNine;
let set = Math.max(...numbers);
console.log(parseInt(set));
처음 이 문제를 보았을때 떠올린 풀이방법은 위 아래와 같다.
1. 입력받은값을 배열로 변환한다.
2. 필요한 0~9의 개수를 저장할 배열을 만든다.
3. 입력받은값을 for문을 통하여 2에서 만든 배열에 각 숫자에 해당하는 index를 ++ 해준다.
4. 6과 9는 서로 바꾸어 쓸 수 있으므로 둘을 합친뒤 / 2 그리고 반올림을 해준다.(반올림 하는 이유는 6과 9의 합이 홀수
경우 .5 가 생기지만 이는 세트 하나를 더 챙겨야하기 때문)
5. 2에서 만든 배열의 최댓값을 구해주면 끝
나는 위 코드를 만들고 모든 반례가 정상적으로 정답이 나오지만 코드를 제출할때마다 입구컷을 당하는 상황을 보고 정신이 나가는줄 알았다..코드는 아무리 봐도 잘못된 부분이 없었고 이 근거로 어떠한 반례를 찾을 수가 없었다.
정답으로 제출한 코드
const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim();
let word = input.toString();
let target = [];
for(let i = 0;i < word.length;i++){
target.push(word[i]);
}
let numbers = [0,0,0,0,0,0,0,0,0,0];
for(let i = 0; i < target.length; i++){
numbers[Number(target[i])]++;
}
let sixNine = Math.ceil(((numbers[6] + numbers[9])/2));
numbers[6] = sixNine;
numbers[9] = sixNine;
let set = Math.max(...numbers);
console.log(set);
기존코드가 입구컷을 당하는 문제는 입력값을 받는 방식에 있었다. js는 입력값을 받는것이 다른 언어들에 비해 어렵다. 백준을 처음 시작한만큼 아직 입력값을 받는데 익숙치 않아서 많이 헤맸던거 같다.
기존코드가 입구컷을 당하는 이유는 입력값을 받는 부분에서 .trim() 을통해 공백을 지워주지 않아 숫자형으로 처리해야하는 데이터에 오류가 발생했던거 같다. 제출할때는 따로 출력값을 볼 수 없어 확신할 수 없지만 그것이 코드제출에서 입구컷을 당한 이유에 가장 가능성이 높아보인다.
'백준' 카테고리의 다른 글
백준 2018번 "수들의 합 5" (0) | 2024.04.15 |
---|---|
백준 1384번 "메시지" (1) | 2024.04.14 |
백준 1316번 "그룹 단체 체커" (0) | 2024.04.13 |
백준 2563번 "색종이" (0) | 2024.04.12 |
백준 1312번 "소수" (0) | 2024.04.11 |