
날이면 날마다 오는 게 아닌.. 돌아온 코딩테스트! 입사하고 1년 3개월이 지난 직후인 지금
다시 전과 같은 마음으로 여러가지 준비를 해서 더 열심히 해보려 한다!
사실 아무런 것도 기억이 나지 않지만^^.. 나름 일하면서 JS에 몰두했으니 괜찮지 않을까란 생각을하며
오답노트 시작-!
보자마자 엥? 했던 문제 설마 했지만 설마로 푸는 게 맞았다..
그냥 단순한 콘솔 출력문제
(사실 너무 오랜만에 코테라.. 별 갯수 계산하면서 수학식 유추한 건 비밀)
그 후로 출력 문제는 건너뜀!
https://softeer.ai/practice/7698
아 생각보다 엄청 놀랐던 문제.. 내가 한동안 프로그래머스에서만 해서 그런가 당연히 n이 주어지고 난 그 n에 대한 함수를 짰으면 되는 줄 알았는데 오랜만에 하니까 n을 출력하는 법을 까먹었다^^...
이제야 기억난 참가자수, 그리고 주어지는 TC의 배열!
그래서 그거를 받아오는데에 많은 시간을 쏟았다
만약 다음 같은 input TC가 주어질 때
3
12
1
5
Node.js의 파일시스템으로 받아와서 해야함을 기억함
const fs = require('fs')
const input = fs.readFileSync('/dev/stdin').toString().trim();
const inputArray = input.split('\n').map(Number);
const candidateNumber = inputArray[0];
그 후 for문을 써서 candidateNumber의 배열을 활용하여 쓰면 된다!
이 문제는 5명으로 나누어 떨어지면 ++++ 4개를 그리고 나머지 수만큼 | 를 출력하면 되는 간단한 문제
여기서 주의해야할 것은 자바스크립트는 Type이 명시되어있지 않으므로 문자열에 수를 곱하는 로직을 통하지 않는다.
repeat를 활용해서 곱해줘야함 고로 결론은
for (let i=0; i <= candidateNumber; i++) {
let votes = candidateNumber[i];
let plus = Math.floor(votes / 5);
let column = votes%5;
let ans = '++++ '.repeat(plus) + '|'.repeat(column);
console.log(ans.trim());
}
나도 맨처음엔 ans로 했다가 답이 5에 맞춰 떨어지는 경우 옳지 않는 정답에 의문을 가졌다
우선 trim은 문자열의 앞뒤공백을 제거해주는 함수이다.
여기에서 만약 주어진 n이 10 즉, plus가 2라면
++++v++++v 이렇게 마지막에 공백이 추가된 답이 나오기에 이것은 정답과 일치 하지 않는다
고로 문자열의 맨 앞과 뒤의 공백을 제거하는 trim을 사용하여 (맨처음엔 어차피 공백 없으니) 맨뒤의 공백을 제거주어
++++v++++ 이것이 정답이 됨
https://softeer.ai/practice/7695
생각보다 오랜만에 머리를 많이많이 쓴 문제.. 1단계부터 이러면 어떡하지 싶다 아 코테 좀 진짜 미리미리할 걸
우선 바뀐 점이 있다. 파일시스템 라이브러리를 호출할 때 더욱 간단하게 하기 위해 한줄로 선언을 하는 것이다
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const tcNumber = parseInt(input[0]);
// 그 후엔 반복문을 통해 넣어주면 됨 ex) 만약 두 개가 아니라 한 개 일 땐
let tcArr = [];
for (let i=1; i<tcNumber; i++) {
const x = input[i].split(' ').map(Number);
tcArr.push(x);
}
이런식으로 TC와 나머지 것들을 배열로 나누어서 관리하게 해줌
그 후 나머지 좌표애들을 배열에 넣어주는 방법은 다음과 같다
제시된 배열들을 split(' ')으로 분리한 후에 각각 Number로 형변환 하는 것
const = coordinates = [];
for (let i=1; i <= tcNumber; i++) {
const [x, y] = input[i].split(' ').map(Number);
coordinates.push([x, y])
}
이런 형태가 되면
// TC를 제외한 애들(x,y 좌표) 배열에 넣어줌
// [[10, 5], [6, -3], [3, 2], [4, 2]]
이런 형태를 만든 후
어릴 때 많이 했던 최소값 찾기를 진행하면 된다.
우선 가장 처음 애를 비교대상으로 놓고
// 가장 첫 비교점이 될 X,Y좌표 (분리해놓은 인풋값의 첫번째 인덱스이다.)
let minXY = coordinates[0];
다음 첫번째 애부터 minXY의 Y와 비교하여 더 작다면 그 좌표값 전체를 minXY에 넣어주면 된다.
for(let i=1; i<tcNumber; i++) {
if (coordinates[i][1] < minXY[1]) {
minXY = coordinates[i]
}
}
console.log(minXY[0], minXY[1])
전체코드
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const tcNumber = parseInt(input[0]);
const coordinates = [];
// TC를 제외한 애들(x,y 좌표) 배열에 넣어줌
// [[10, 5], [6, -3], [3, 2], [4, 2]]
for (let i = 1; i <= tcNumber; i++) {
const [x, y] = input[i].split(' ').map(Number);
coordinates.push([x,y])
}
// 가장 처음 비교점이 될 X, Y 좌표 (좌표 배열의 첫번째 인덱스)
let minXY = coordinates[0];
for (let i =1; i<tcNumber; i++) {
// 나머지 배열의과 처음 비교점 X, Y 좌표에서 Y만을 비교하여 더 작을 때 비교점에 삽입
if(coordinates[i][1] < minXY[1]) {
// 해당하는 X, y좌표를 minXY가 됡밧에 삽입
minXY = coordinates[i]
}
}
console.log(minXY[0], minXY[1])
자, 추운데 연탄배달이란 고된 일을 하기 싫으면 다시 코테를 풉시다.
https://softeer.ai/practice/7626
문제는 뭐 숫자가 주어지면 배열에 넣고 그 배열 사이의 길이를 계산한다음 가장 작은 값의 갯수를 찾으면 되는 겁니다. 말로하다보니 다른 방법이 떠올랐는데 하여튼..
늘 그렇듯 fs먼저 불러와주고
const fs = require('fs');
// 아까 배운거
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const tcNumber = input[0];
근데 이번엔 TC가 한 줄에 다 주느라 그냥 그 배열 자체로 쓰면 됨
// 우선 배열안에 다 넣어버리기
// 이렇게 하면 숫자로된 배열이 나옴
let arr input[1].split(' ').map(Number)
// 최솟값 할 애 넣어두고
let minDistance = arr[1] - arr[0]
let ans = 1;
// 그 다음 인덱스부터 세버림
for(let i=2; i < tcNumber; i++) {
if (arr[i] - arr[i-1] < minDistance) {
minDistance = arr[i] - arr[i-1];
// 최소거리가 바뀌면 1
ans =1;
} else if (arr[i] - arr[i-1] === minDistance) {
// 다음도 최소 거리가 같으면 +=1
ans += 1;
}
}
console.log(ans);