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

걍걍규·2023년 8월 17일
0
post-thumbnail


문제 해석

  • 두번째 줄 이후의 입력에는 정수 연산자 정수 가 입력된다
  • 각 줄마다의 연산을 실행 후 나온 결과를 모두 합해준다

해결 방법

  • 주어진 한줄의 입력의 정수와 연산자를 분리해야겠단 생각을 했다
  • 각자 가진 연산자가 무엇인지 확인한다
  • 그 문자에 따른 연산을 진행해준다
const readline = require('readline');
let rl = readline.createInterface({
	input: process.stdin,
	output: process.stdout,
});
let input = [];
rl.on('line', (line) => {
	input.push(line.trim());
	if (input.length === Number(input[0]) + 1){
		rl.close();
	}
  
/*
첫날에 해맸던 입력부분
input 배열을 만들어서 모두 푸쉬해주고 첫 줄의 입력을 받을 때 보통 테스트 케이스의 갯수를 받는 경우가 많은데
내가 필요한 인풋의 갯수를 파악해서 연산을해 준 후 그 횟수만큼 푸쉬하고
인풋의 길이가 내가 원하는 값이 될 때 rl.close 함수를 호출해준닷

이해됐다
*/
});

rl.on('close', () => {
	const nums = []
	let result = 0
	const T = input.shift()
	const data = input.map(el=>el.split(' ').join(''))
	for(let i=0; i<data.length; i++){
		let cnt = 1
		let num1 = ''
		let cal = ''
		let num2 = ''
		//이중 반복문
		for(let j=0; j<data[i].length; j++){
          //정수와 연산자를 분리해 주는 과정을 거친다
			if(cnt === 1 && !isNaN(data[i][j])){
				num1 = num1 + data[i][j]	
			}
			if(cnt === 1 && isNaN(data[i][j])){
				cal = data[i][j]
				cnt++
			}
			if(cnt === 2 && !isNaN(data[i][j])){
				num2 = num2 + data[i][j]
			}

		}
      //연산자에 따른 계산을 해준 후 하나의 배열에 그 결과값을 모두 모아준다
		if(cal === '+'){
			nums.push((+num1) + (+num2))
		}
		if(cal === '-'){
			nums.push((+num1) - (+num2))
		}
		if(cal === '/'){
			nums.push(Math.floor((+num1) / (+num2)))
		}
		if(cal === '*'){
			nums.push((+num1) * (+num2))
		}
	}
  //계산 !!
	for(const num of nums){
		result = result + num
	}
	console.log(result)
})


내가 좋아하는 햄버거를 만드는 문제 !

문제 해석

  • 둘째 줄에는 공백을 두고 여러개의 정수가 주어진다
  • 첫째 줄에는 그 정수의 갯수가 주어진다
  • 둘째 줄의 정수 중 가장 큰 정수를 기준으로 잡는다
  • 기준의 좌우로 내림차순이 된다면 정상적인 햄버거라고 볼 수 있다
  • 정상적인 햄버거일 시 모든 정수를 더한 후 출력
  • 비정상적인 햄버거일 시 0을 출력

문제 풀이

  • 가장 큰 수를 먼저 구하기로 하였다
  • 좌측에 있는 가장 큰 수를 기준으로 두고 좌 우를 나누어준다
  • 그 후에 주어진 조건에 맞는지를 판단한다
  • 좌측의 경우는 오름차순인지 우측인 경우는 내림차순인지를 판별한다
  • 그렇게 해서 정상적인 햄버거인지 아닌지 알 수 있게 된다
// Run by Node.js
const readline = require('readline');

(async () => {
	let rl = readline.createInterface({ input: process.stdin });
  //입력 받는 부분의 코드가 다르게 들어왔는데 원리는 비슷했다
	let input = []
	for await (const line of rl) {
		input.push(line.trim())
		if(input.length === 2){
					rl.close();
		}
	}
	
	const stuffs = input[1].split(' ').map(el=>+el)
    
	//둘째 줄을 공백을 빼고 배열로 나눠 준 상황
    //[1, 2, 3, 3, 1] 이런 형식의 배열이 완성된다

	const maxStuff = Math.max(...stuffs)
	
	const arr1 = []
	const arr2 = []
    
    //좌 우 각각의 정수들을 담아 줄 배열
    
	let bool1 = true
	let bool2 = true
    
    //좌측은 오름차순으로 멀쩡한가
    //우측은 오름차순으로 멀쩡한가
    //판별을 위한 boolean 변수
    
	let cnt = 0
    
    //좌측이 모두 옮겨지면 카운트 되며 새로운 배열에 우측의 값 들이 담길 수 있도록 만든 변수
	
	for(const stuff of stuffs){
      	if(cnt == 0){
			arr1.push(stuff)
        //처음엔 1번배열에 정수들을 담아주고
		}
		if(cnt === 0 && stuff == maxStuff){
			cnt++
			continue
        //처음 만나는 가장 큰 수
        //앞으로는 arr2에 정수가 쌓이도록 스위칭
		}

		if(cnt == 1){
			arr2.push(stuff)
        //2번째 배열에 정수가 쌓인다
		}
	}

	/*
    arr1 : [1, 2]
    arr2 : [3, 1]
    */
  
	for(let i=0; i<arr1.length; i++){
		if(arr1[i] > arr1[i+1]){

			bool1 = false
			break;
		}
	}
		for(let i=0; i<arr2.length; i++){
			if(arr2[i] < arr2[i+1]){
				bool2 = false
				break;
			}
	}
  //오름차순인가 내림차순인가 판별해준다

	if(bool1 && bool2){
		let sum = 0;
		for(let i=0; i<stuffs.length; i++){
			sum = sum + stuffs[i]
		}
		console.log(sum)
	}
	if(!bool1 || !bool2){
		console.log(0)
    }

	process.exit();
})();

처음엔 입력 가공할 때 문자열로도 풀 수 있겠다는 생각을 했다
그러나 k의 범위가 1 <= k <= 10의6제곱
인 것을 확인한 후에 공백 기준으로 배열을 만들어 주었다
두 문제를 푸는데 약 1시간이 걸렸는데 간단한 문제였음에도 꽤 걸렸다
앞으로도 꾸준히 풀자 !

profile
안녕하시오?

0개의 댓글