구름톤 챌린지 1주 차 (1)

걍걍규·2023년 8월 15일
0

구름톤 챌린지 참가

오랜만에 글을 올리는데 한동안 팀프로젝트 준비하느라 정신이 없었고
글로 정리해서 내가 한 것들을 돌아봐야 100%를 했다고 할 수 있다 하였거늘 ..
정리하는 과정이 힘들어 하지 못하였다
물론 알고리즘도 공부할 시간이 많지 않았고

그러던 중 주 마다 다른 유형으로 한달 동안 알고리즘 문제를 푸는 구름톤 챌린지를 부트캠프 공지에서 발견하였고
느슨해진 알고리즘에 대한 긴장감을 다시 끌어 올리기로 하였다

한달동안 적어도 하루 한문제는 풀겠습니다

구름의 문제는 전에도 겪어본 적이 있는데 입력 받는 것이 내가 사용하던

readFileSyne 모듈이 이 아닌

readrile 모듈을 사용한다

입력 부분부터 애를 먹었고 어제 문제를 못풀어 두 문제를 연달아 풀며 걸린 시간은 약 1시간 ..
간단한 문제였지만 두번째 문제의 입력 부분에서 애를 먹었다
문제는 풀었으나 완벽한 해결법은 아니여서 다음에 입력 정제 과정을 좀 더 매끄럽게 할 순 없을지
생각하며 풀어봐야겠다

운동 중독 플레이어

문제 내용

입출력 형식

풀이의 과정

입력의 R과 M을 받아 위 공식에 대입해 주면 끝이라는 판단으로 풀이를 시작하였다

const readline = require('readline');
let rl = readline.createInterface({
	input: process.stdin,
	output: process.stdout,
});
let input;
rl.on('line', (line) => {
	input = line;
    //입력이 한줄이기에 이렇게 한번 라인을 받아오고 바로 close 함수를 실행해 주어도 된다
	rl.close();
});

rl.on('close', () => {
  	//input = 100 30

	const [W, R] = input.split(' ').map(Number)
    //구조분해할당으로 인풋을 [100, 30]의 형식으로 정제해 주어 W, R에 각각 할당

	const result = W * (1+ (R / 30))
    //답을 구하기 위한 계산 식
	
	console.log(Math.floor(result))
    //floor함수를 이용하여 소수점 내림 처리 한 후 출력
})

위와 같이 한 줄의 경우 입력 받아오는 과정부터 문제 풀이까지 순조로웠다
저도 20대 후반 곧 30대를 바라보는 입장에서 몸이 망가짐을 많이 느끼는데 다들 운동하십쇼

프로젝트 매니징

문제

입출력 형식


난관에 봉착하였다 여러줄의 입력이다 !
입력 받는 부분을 먼저 보겠다

const readline = require('readline');
let rl = readline.createInterface({
	input: process.stdin,
	output: process.stdout,
});
let input = [];
let N;
// line이 어떤 식으로 들어오는지를 모르겠다 한 줄씩 들어오는걸까
// console.log(line)을 찍어보시면 하나하나의 값이 각각 들어온다는 것을 알수 있다
// 해서 나는 N외의 모든 값을 input에 push해주려 했다
rl.on('line', (line) => {
	
	if(N === undefined){
      	N = line
    	//N은 처음 선언 한 당시 undefined이다
      	//해서 처음에 들어오는 line을 N에 넣어준다
	}
	if(!N === undefined){
      	input.push(line)
      	//다음부터 들어오는 line은 input에 푸쉬해준다
      	//그 과정을 반복하며 input이 쌓일텐데 N이 채워지고 바로 그 다음 값은 두번째 줄이 들어올것이고
        //그 다음부터 본격적으로 N의 갯수가 채워질 것이라 +1을 해주었다
      if(input.length === N + 1){

        //그리고 이 부분에선 input이 쌓이다가 N + 1이 되면 이 부분이 종료되고 rl.on('close)가 실행되게 하였는데
          rl.close();	
    }
      
	}
	
});

이 결과에서 인풋은 비어있다 그래서 수정을 하다보니까

아래의 코드가 되니까 input에 모든 값이 들어가 있었더라 ..
논리는 모르겠지만 그래서 일단은 문제를 풀기로 하였다

풀이 방법

  • 나는 들어오는 모든 시간을 더해서 M에 더해주고 그 값에 60의 몫을 구하고 T에 더해주었다
  • 그렇게 할 시 T가 24보다 작은 경우의 수와 그 외의 경우의 수가 생긴다
  • T가 24보다 작은 경우는 위에 더해준 T 값과 M을 60으로 나눈 나머지가 정답이 된다
  • 그 외의 경우는 T도 24로 나눈 나머지가 T의 정답이 되고 M은 위와 동일하다
const readline = require('readline');
let rl = readline.createInterface({
	input: process.stdin,
	output: process.stdout,
});
let input = [];
let N;

rl.on('line', (line) => {
	input.push(line)
	
	if(N === undefined){
			N = line
	}
	if(!N === undefined){
      if(input.length === N + 1){
        rl.close();	
    }
      
	}
	
});

rl.on('close', () => {
  	//지금 인풋에는
  	//[ '3', '10 10', '50', '22', '23' ]
  	//이런 모양으로 line의 모든 값이 들어와있다 왜일까 ?..
	input.shift()
  	//3은 잘라주고
	let [T, M] = input.shift().split(' ').map(Number)
    //[10, 10]
	const workTimes = input.map(Number)
    //[50, 22, 23]
	//해서 알맞게 가공을 해주었고
	for(const work of workTimes){
		M = M + work
	}
  	//모든 일한 시간들을 M에 더해주었다
  	//입력 기준이 분으로 되어있기 때문이다

	T = T + Math.floor(M / 60)
  	//모두 더해준 M을 60으로 나눈 몫이 실수로 나올 시 소숫점을 내려주어 그 만큼 T에 더해준다
  
  	//여기서 분기가 생기는데 24보다 작은 경우와 그 외의 경우이다
  	//위에서 말한 과정을 코드로 풀어냈다
  
	if(T >= 24){
		console.log((T % 24), (M % 60))
	}
	if(T < 24){

		console.log(T, (M % 60))
	}
	

})

문제는 간단했으나 입력 때문에 애먹었다 다음에 더 복잡한 입력이 나올때를 대비하여
readline모듈에 대해 공부해둬야지
야호~

profile
안녕하시오?

1개의 댓글

comment-user-thumbnail
2023년 8월 15일

좋은 글 감사합니다.

답글 달기