-
1. javascript 기초 - for문/if문 사용해서 문제풀기Javascript 2022. 1. 3. 17:13
1번문제
Q. 마스크 공장
마스크를 담을 수 있는 팩이 3개입/5개입 2종류가 있다.
최대한 적은 팩을 사용하여 마스크를 담으려고 한다.
예를들어 18개의 마스크가 있다면 3개입 팩 6개를 사용 할 수 있지만,
5개입 3개와 3개입 1개로 담으면 더 적은 팩으로 담을 수 있다.
N개의 마스크를 담기 위해서 필요한 최소한의 팩의 수를 구하는 프로그램을 작성하라.
단, 정확하게 팩을 만들 수 없다면 -1을 리턴해야한다.
ex)
18 👉 4
4 👉 -1
6 👉 2A.
<script> function solution(n) { let result = 0; let five = 0; let three = 0; for (let i=parseInt(n/5); i>=0; i--) { if ((n-(5*i))%3 == 0) { five = i; three = (n-(5*i))/3; result = five + three; break; } else { result = -1; } } return result; } console.log(solution(41)); </script>
접근 방법.
가장 적은 팩을 사용하기 위해서는 가장 많은 5개입 팩을 사용해야 한다.
따라서 5개입 팩을 최대로 사용 가능한 갯수를 i의 초기값으로 두고
해당 개수에서 5개입에 담은 나머지가 3으로 나누어 떨어지는 지를 확인하여
나누어 떨어진다면 👉 break로 계산을 종료하고 그 시점에서의 5개입/3개입 팩의 수를 더하여 리턴한다.
나누어 떨어지지 않는다면 👉 i값을 하나 낮춰 다시 반복한다.
ex1) N = 19
초기 i 값 : 19이하의 최대의 5의 배수 = 5 * 3, i = 3
19 = 15 + 4
4%3 == 0 : false
else문으로 이동하여
result = -1 이 되고
다시 for문의 시작으로 이동.
i--가 되어 i = 2
19 = 10 + 9
9%3 == 0 : true
if 문 내의 코드블럭 실행됨 : 5개입 팩의 수 = 2, 3개입 팩의 수 = 3, result = 2 + 3 = 5 연산 후 breakex2) N = 7
초기 i 값 : 7이하의 최대의 5의 배수 = 5*1, i = 1
7 = 5 + 2
2%3 == 0 : false
result = -1
i--하여 i=0
7 = 0 + 7
7%3 == 0 : false
result = -1
i-- 하여 i=-1
for문의 조건( i >= 0 )에 맞지 않으므로 for문은 실행되지 않고
현재의 result 값을 리턴하여
-1이 출력❗️나눗셈의 몫을 구하기 위해 parseInt()를 사용
parseInt()의 정확한 설명은
"함수는 문자열 인자를 파싱하여 특정 진수(수의 진법 체계에서 기준이 되는 값)의 정수를 반환합니다."
라고 하는데 잘은 모르겠고 그냥 '자바스크립트 나눗셈 몫 구하는 법'이라고 검색하면 이게 나왔다.
근데 원래 사용용도는 문자열을 정수로 바꾸는? 용도인거같다. 2진법, 16진법 등등의 수를 정수로 반환해준다.
parseInt('100', 2) 이렇게 하면 앞의 수를 2진법으로 보고 그 값인 정수 4를 반환해준다.
다른 인자 없이 실수만 입력하면 소수점 뒤를 버린 정수를 반환해준다.
parseInt(2.7) = 2
parseint(-0.4) = -0 (-0이라고 콘솔에 출력 되는데 -0 == 0, -0 === 0 모두 참으로 나와서 -표기는 크게 신경 안써도 되는 것 같다.)
parseint(-2.7) = -2
이런 식으로.
2번문제(프로그래머스)
Q. 직사각형 별찍기
이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.
별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.A.
process.stdin.setEncoding('utf8'); process.stdin.on('data', data => { const n = data.split(" "); const a = Number(n[0]), b = Number(n[1]); //입력받은 두 수를 a와 b에 저장하는 코드. 입력창에 디폴트로 있음 //기존에 있던 a와 b를 console.log 하는 코드 두 줄을 지우고 여기에 작성하면 됨. let result = []; //문자열의 초기값. 빈 array를 만들어 둠. for (let j=0; j<b; j++) { for(let i=0; i<a; i++) { result += "*"; } result += "\n" } console.log(result); })
입력받은 두 수 a와 b만큼 도는 for문을 작성하여
a만큼 *을 추가하고 b만큼 줄바꿈(\n)을 추가하는 방식으로 문자열을 작성한 뒤 출력.
다른 사람의 풀이.
process.stdin.setEncoding('utf8'); process.stdin.on('data', data => { const n = data.split(" "); const a = Number(n[0]), b = Number(n[1]); let row = "*".repeat(n)+"\n"; console.log(row.repeat(m)) } });
for문 대신 repeat이라는 메소드를 사용하여 매우 간단하게 코드를 작성하였다.
( ) 안의 값만큼 앞의 문자열을 반복하는 메소드이다.
let str = "HB" console.log(str.repeat(3)) //결과 : HBHBHB
문제를 풀고 다른 사람의 풀이를 보니까 아직 모르는 게 너무 많은데 여러가지 메소드를 배울 수 있어서 좋았다.
'Javascript' 카테고리의 다른 글
6. To do list 만들기 (0) 2022.01.12 5. javascript - 객체의 복사 (0) 2022.01.10 4. javascript - html DOM 조작 (0) 2022.01.10 3. javascript 기초 - forEach, 배열중복제거 (0) 2022.01.06 2. javascript 기초 - array와 object (0) 2022.01.04