📂 JS 100제 (61번~70번)
문제61 : 문자열 압축하기
문자열을 입력받고 연속되는 문자열을 압축해서 표현하고 싶습니다.
**입력**
aaabbbbcdddd
**출력**
a3b4c1d4
풀이 1.
let str = prompt('문자를 입력하세요.');
let new_str = [...new Set(str)].join('');
let result ='';
for (i = 0; i < new_str.length; i++){
let count = 0;
for (j = 0; j < str.length; j++){
if (new_str[i] === str[j]) {
count++
if (j === str.length-1) {
result += new_str[i] + count;
}
} else {
result += new_str[i] + count;
str = str.substr(j);
break;
}
}
}
console.log(result);
풀이 2.
const user_s = new String(prompt('문자열을 입력하세요'));
let result_s = '';
let store_s = user_s[0];
let count = 0;
for (let i of user_s){
if (i === store_s){
count += 1;
} else{
result_s += store_s + String(count);
store_s = i;
count = 1;
}
}
result_s += store_s + String(count);
console.log(result_s);
문제62 : 20190923출력하기
20190923을 출력합니다. 아래 기준만 만족하면 됩니다.
- 코드 내에 숫자가 없어야 합니다.
- 예) console.log(20190923)이라고 하시면 안됩니다.
- 파일 이름이나 경로를 사용해서는 안됩니다.
- 시간, 날짜 함수를 사용해서는 안됩니다.
- 에러 번호 출력을 이용해서는 안됩니다.
- input을 이용해서는 안됩니다.
풀이
//abcdefgh
//20190923
const user_s = 'aacdddddddddfffffffffgghhh';
let result_s = '';
console.log(`${user_s.match(/a/g).length}${Number(user_s.match(/b/g))}${user_s.match(/c/g).length}${user_s.match(/d/g).length}${Number(user_s.match(/e/g))}${user_s.match(/f/g).length}${user_s.match(/g/g).length}${user_s.match(/h/g).length}`);
문제63 : 친해지고 싶어
한국 대학교의 김한국 교수님은 학생들과 친해지기 위해서 딸에게 줄임말을 배우기로 했습니다. 딸은 '복잡한 세상 편하게 살자'라는 문장을 '복세편살'로 줄여 말합니다.
교수님이 줄임말을 배우기 위해 아래와 같이 어떤 입력이 주어지면 앞 글자만 줄여 출력하도록 해주세요. 입력은 한글 혹은 영어로 입력되며, 띄어쓰기를 기준으로 하여 짧은 형태로 출력합니다.
**입력**
복잡한 세상 편하게 살자
**출력**
복세편살
풀이 1.
const user_input = prompt('문자열을 입력하세요').split(' ');
let result = '';
for (let s of user_input){
result += s.slice(0, 1);
}
console.log(result);
풀이 2.
const str = prompt('문자를 입력하세요.').split(' ');
let result = ''
for (i = 0; i < str.length; i++){
result += str[i][0]
}
console.log(result)
문제64 : 이상한 엘레베이터
정량 N에 정확히 맞춰야만 움직이는 화물용 엘리베이터가 있습니다. 화물은 7kg, 3kg 두 가지이며 팔이 아픈 은후는 가장 적게 화물을 옮기고 싶습니다.
예를 들어 정량이 24kg이라면 3kg 8개를 옮기는 것보다는 7kg 3개, 3kg 1개 즉 4개로 더 적게 옮길 수 있습니다.
입력 정량 N이 입력됩니다.
출력 가장 적게 옮길 수 있는 횟수를 출력합니다. 만약 어떻게 해도 정량이 N이 되지 않는다면 -1을 출력합니다.
풀이 1. while문 사용
let N = parseInt(prompt('정량을 입력하세요'), 10);
let result = 0;
while (true){
if (N%7 === 0){
result += parseInt(N/7, 10);
console.log(result);
break;
}
N -= 3;
result += 1;
if (N < 0){
console.log(-1);
break;
}
}
풀이 2. 재귀함수 사용
function solution(n, count = 0) {
if (n < 0) return -1;
return n % 7 === 0
? (count += parseInt(n / 7, 10))
: solution(n - 3, count + 1);
}
문제65 : 변형된 리스트
a = [1, 2, 3, 4] b = [a, b, c, d] 이런 리스트가 있을 때 [[1, a], [b, 2], [3, c], [d, 4]] 이런 식으로 a, b 리스트가 번갈아가면서 출력되게 해주세요.
풀이 1. for문 사용
let a = [1, 2, 3, 4];
let b = ['a', 'b', 'c', 'd'];
let result = [];
for (i = 0; i < a.length; i++){
if (i % 2 === 0){
result.push([a[i], b[i]]);
} else {
result.push([b[i], a[i]]);
}
};
console.log(result);
풀이 2. forEach 사용
const a = [1, 2, 3, 4];
const b = ['a', 'b', 'c', 'd'];
let c = [];
a.forEach(function(e, i){
if (i%2 === 0){
c.push([e, b[i]]);
} else {
c.push([b[i], e]);
}
});
console.log(c);
풀이 3. map 사용
const a = [1, 2, 3, 4];
const b = ['a', 'b', 'c', 'd'];
let c = [];
a.forEach(function(e, i){
if (i%2 === 0){
c.push([e, b[i]]);
} else {
c.push([b[i], e]);
}
});
console.log(c);
문제66 : 블럭탑쌓기
탑을 쌓기 위해 각 크기별로 준비된 블럭들을 정해진 순서에 맞게 쌓아야 합니다. 순서에 맞게 쌓지 않으면 무너질 수 있습니다.
예를 들면 정해진 순서가 BAC 라면 A 다음 C가 쌓아져야 합니다. 선행으로 쌓아야 하는 블럭이 만족된 경우라면 탑이 무너지지 않습니다.
- B를 쌓지 않아도 A와 C를 쌓을 수 있습니다.
- B 다음 블럭이 C가 될 수 있습니다.
쌓아져 있는 블럭 탑이 순서에 맞게 쌓아져 있는지 확인하세요.
- 블럭은 알파벳 대문자로 표기합니다.
- 규칙에 없는 블럭이 사용될 수 있습니다.
- 중복된 블럭은 존재하지 않습니다.
**입력**
탑 = ["ABCDEF", "BCAD", "ADEFQRX", "BEDFG", "EFGHZ"]
규칙 = "ABD"
**출력**
["가능", "불가능", "가능", "가능", "가능"]
풀이 1.
const block = ["ABCDEF", "BCAD", "ADEFQRX", "BEDFG", "EFGHZ"];
const rule = "ABD";
let result = [];
for (let word of block) {
// let possible = 0;
let impossible = 0;
for (j = 0; j < rule.length-1; j++) {
if (word.indexOf(rule[j]) > 0) {
if (word.indexOf(rule[j]) > word.indexOf(rule[j+1])){
impossible++
}
}
}
if (impossible === 0) {
result.push("가능")
} else { result.push("불가능") }
}
console.log(result);
풀이 2.
function solution(전체블록, 규칙){
let answer = [];
for (let 부분블록 of 전체블록){
answer.push(블록순서체크(부분블록, 규칙));
}
return answer;
}
function 블록순서체크(부분블록, 규칙){
let 임시변수 = 규칙.indexOf(규칙[0]);
for (let 문자 of 부분블록){
if (규칙.includes(문자)){
if (임시변수 > 규칙.indexOf(문자)){
return '불가능';
}
임시변수 = 규칙.indexOf(문자);
}
}
return '가능';
}
const 전체블록 = ['ABCDEF', 'BCAD', 'ADEFQRX', 'BEDFG', 'AEBFDGCH'];
const 규칙 = 'ABCD';
console.log(solution(전체블록, 규칙));
//["가능", "불가능", "가능", "가능", "불가능"]
문제67 : 민규의 악수
광장에서 모인 사람들과 악수를 하는 행사가 열렸습니다. 참가자인 민규는 몇명의 사람들과 악수를 한 후 중간에 일이 생겨 집으로 갔습니다.
이 행사에서 진행된 악수는 총 n번이라고 했을 때, 민규는 몇 번의 악수를 하고 집으로 돌아갔을까요? 그리고 민규를 포함한 행사 참가자는 몇 명일까요?
- 악수는 모두 1대 1로 진행이 됩니다.
- 민규를 제외한 모든 참가자는 자신을 제외한 참가자와 모두 한번씩 악수를 합니다.
- 같은 상대와 중복된 악수는 카운트 하지 않습니다.
- 민규를 제외한 참가자는 행사를 모두 마쳤습니다.
예를들어 행사에서 59회의 악수가 진행되었다면 민규는 4번의 악수를 하였고 민규를 포함한 참가자는 12명이다.
행사에서 진행된 악수 횟수(n)를 입력으로 받으면 민규의 악수 횟수와 행사 참가자 수가 출력됩니다.
**입력**
59
**출력**
[4, 12] // [악수 횟수, 행사 참가자 수]
풀이 1.
function solution(n){
let 사람 = 0;
let 총악수 = 0;
let temp = 0;
while(true){
총악수 = parseInt((사람*(사람-1))/2, 10);
if(n < 총악수){
break;
}
temp = 총악수;
사람 += 1;
}
return [parseInt(n-temp, 10), 사람];
}
const 악수의수 = 59;
console.log(solution(악수의수));
풀이 2.
function handShake(totalCount) {
let sumOfOthers = 0;
let countOfOthers = 1;
while ((countOfOthers * (countOfOthers + 1)) / 2 < totalCount) {
sumOfOthers = (countOfOthers * (countOfOthers + 1)) / 2;
countOfOthers++;
}
return [totalCount - sumOfOthers, countOfOthers + 1];
}
console.log(handShake(59));
문제68 : 버스 시간표
학교가 끝난 지원이는 집에 가려고 합니다. 학교 앞에 있는 버스 시간표는 너무 복잡해서 버스 도착시간이 몇 분 남았는지 알려주는 프로그램을 만들고 싶습니다.
버스 시간표와 현재 시간이 주어졌을 때 버스 도착 시간이 얼마나 남았는지 알려주는 프로그램을 만들어주세요.
- 버스 시간표와 현재 시간이 입력으로 주어집니다.
- 출력 포맷은 "00시 00분"입니다. 만약 1시간 3분이 남았다면 **"01시간 03분"**으로 출력해야 합니다.
- 버스 시간표에 현재 시간보다 이전인 버스가 있다면 **"지나갔습니다."**라고 출력합니다.
**입력**
["12:30", "13:20", "14:13"]
"12:40"
**출력**
['지나갔습니다', '00시간 40분', '01시간 33분']
풀이 1.
function solution(버스시간, 기준시간){
let answer = [];
기준시간 = 기준시간.split(':').map(n => parseInt(n, 10));
기준시간 = (기준시간[0] * 60) + 기준시간[1];
for (let i in 버스시간){
let time = 버스시간[i].split(':').map(n => parseInt(n, 10));
time = (time[0] * 60) + time[1];
if (time < 기준시간){
answer.push('지나갔습니다');
} else{
let 시간 = parseInt((time - 기준시간) / 60, 10);
let 분 = (time - 기준시간) % 60;
answer.push(String(시간).padStart(2, 0) + '시간 ' + String(분).padStart(2, 0) + '분');
}
}
return answer;
}
console.log(solution(["12:30", "13:20", "14:13"], "12:40"));
풀이 2.
function bus(busTime, now){
let nowHour = parseInt(now.slice(0,2), 10);
let nowMin = parseInt(now.slice(3), 10);
let result = [];
for (let time of busTime){
let busTimeHour = parseInt(time.slice(0,2), 10);
let busTimeMin = parseInt(time.slice(3), 10);
if (busTimeHour < nowHour) {
result.push("지나갔습니다");
} else if (busTimeHour === nowHour) {
if (busTimeMin >= nowMin) {
result.push("00시간 "+ busTimeMin - nowMin + "분 남았습니다");
} else { result.push("지나갔습니다") }
} else {
if ((((busTimeHour - nowHour) * 60 + busTimeMin) - nowMin) < 60) {
result.push("00시간 " + (((busTimeHour - nowHour) * 60 + busTimeMin) - nowMin) + "분 남았습니다");
} else {
let hour = Math.floor(((((busTimeHour - nowHour) * 60 + busTimeMin) - nowMin) / 60));
result.push("0" + hour + "시간 " + (((busTimeHour - nowHour) * 60 + busTimeMin) - nowMin - (60 * hour)) + "분 남았습니다"); }
}
}
return result;
}
console.log(bus(["12:30", "13:20", "14:13"], "12:40"));
문제69 : 골드바흐의 추측
골드바흐의 추측(Goldbach's conjecture)은 오래전부터 알려진 정수론의 미해결 문제로, 2보다 큰 모든 짝수는 두 개의 소수(Prime number)의 합으로 표시할 수 있다는 것이다. 이때 하나의 소수를 두 번 사용하는 것은 허용한다. - 위키백과
위 설명에서 2보다 큰 모든 짝수를 두 소수의 합으로 나타낸 것을 골드바흐 파티션이라고 합니다.
예) 100 == 47 + 53 56 == 19 + 37
2보다 큰 짝수 n이 주어졌을 때, 골드바흐 파티션을 출력하는 코드를 작성하세요.
- 해당 문제의 출력 형식은 자유롭습니다. 가능하시다면 골드바흐 파티션 모두를 출력하거나, 그 차가 작은 것을 출력하거나 그 차가 큰 것 모두 출력해보세요
풀이 1.
// 소수 구하기
let prime = [];
let isPrime = true;
for(let i = 2; i < 100; i++){
for(let j = 2; j < i; j++){
if(i % j == 0){
isPrime = false;
}
}
if(isPrime){
prime.push(i);
}
isPrime = true;
}
let val = parseInt(prompt('숫자를 입력하세요:'), 10);
let 골드바흐파티션 = [];
for(let n of prime){
if(prime.includes(val - n) && n <= (val - n)){
골드바흐파티션.push([n, val - n])
}
}
let 차 = 골드바흐파티션.map(e => e[1] - e[0]);
let 작은값 = 골드바흐파티션[차.indexOf(Math.min.apply(null,차))];
let 큰값 = 골드바흐파티션[차.indexOf(Math.max.apply(null,차))];
console.log(골드바흐파티션);
console.log(작은값);
console.log(큰값);
풀이 2.
function prime_list(n){
//에라토스테네스의 체 초기화: n개 요소에 True 설정(소수로 간주)
let sieve = []
for(let i = 2; i < n; i++){
sieve.push(true);
}
//n의 최대 약수가 sqrt(n) 이하이므로 i=sqrt(n)까지 검사
let m = parseInt(n ** 0.5, 10);
for(let i = 2; i < m + 1; i++){
if (sieve[i] == true){ // i가 소수인 경우
for(let j = i+i; j < n; j+=i){ // i이후 i의 배수들을 False 판정
sieve[j] = false;
}
}
}
// 소수 목록 산출
let prime = [];
for(let i = 2; i < n; i++){
if (sieve[i] == true){
prime.push(i);
}
}
return prime;
}
문제70 : 행렬 곱하기
행렬 2개가 주어졌을 때 곱할 수 있는 행렬인지 확인하고 곱할 수 있다면 그 결과를 출력하고, 곱할 수 없다면 -1을 출력하는 프로그램을 만들어주세요.
**입력**
a = [[1, 2],
[2, 4]]
b = [[1, 0],
[0, 3]]
**출력
[**[1, 6], [2, 12]]
풀이
function solution(a, b) {
let c = [];
const len = a[0].length;
if (len === b.length){
for(let i=0; i<len; i++){
let row = [];
for(let j=0; j<len; j++){
let x = 0;
for(let k=0; k<len; k++){
x += a[i][k]*b[k][j];
}
row.push(x);
}
c.push(row);
}
return c;
} else {
return -1;
}
}
const a = [[1, 2], [2, 4]];
const b = [[1, 0], [0, 3]];
console.log(solution(a, b));
https://www.notion.so/JS-100-2-327372e894a843cf9c9430070c1ce5da