[Softeer] Challenge Lv1

세나정·2024년 10월 23일

날이면 날마다 오는 게 아닌.. 돌아온 코딩테스트! 입사하고 1년 3개월이 지난 직후인 지금
다시 전과 같은 마음으로 여러가지 준비를 해서 더 열심히 해보려 한다!
사실 아무런 것도 기억이 나지 않지만^^.. 나름 일하면서 JS에 몰두했으니 괜찮지 않을까란 생각을하며
오답노트 시작-!

나무 출력

보자마자 엥? 했던 문제 설마 했지만 설마로 푸는 게 맞았다..
그냥 단순한 콘솔 출력문제
(사실 너무 오랜만에 코테라.. 별 갯수 계산하면서 수학식 유추한 건 비밀)

그 후로 출력 문제는 건너뜀!


[한양대 HCPC 2023] 개표

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());
}

여기에서 주의해야할 점은 왜 굳이 trim을 쓰는가이다.

나도 맨처음엔 ans로 했다가 답이 5에 맞춰 떨어지는 경우 옳지 않는 정답에 의문을 가졌다

우선 trim은 문자열의 앞뒤공백을 제거해주는 함수이다.
여기에서 만약 주어진 n이 10 즉, plus가 2라면

++++v++++v 이렇게 마지막에 공백이 추가된 답이 나오기에 이것은 정답과 일치 하지 않는다

고로 문자열의 맨 앞과 뒤의 공백을 제거하는 trim을 사용하여 (맨처음엔 어차피 공백 없으니) 맨뒤의 공백을 제거주어
++++v++++ 이것이 정답이 됨


[한양대 HCPC 2023] Tren del Fin del Mundo

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);
profile
기록, 꺼내 쓸 수 있는 즐거움

0개의 댓글