TIL 12 알고리즘 공부하자
시저암호 [39번 문제]
[문제설명]
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다.
예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다.
문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
[제한조건]
공백은 아무리 밀어도 공백입니다.
s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
s의 길이는 8000이하입니다.
n은 1 이상, 25이하인 자연수입니다.
function solution(s, n) {
// 변수, 상수 선언 ===============================================
const upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
const lower = 'abcdefghijklmnopqrstuvwxyz'
console.log('문자열 길이 : ' + upper.length)
let changedStr = ''
// 반복문 ========================================================
for (let i = 0; i < s.length; i++){
const str = s[i]
console.log(' '.repeat(70))
console.log('입력 문자 : '+ str)
console.log('-'.repeat(70))
// 조건문1. ========================================================
if (str == ' ') {
changedStr += ' '
console.log('조건문1')
continue
}
// 반복문 내에서 변수, 상수 선언 ====================================
const upperOrLower = upper.includes(str) ? upper : lower
let index = upperOrLower.indexOf(str) + n
console.log('대문자인가요? 소문자인가요? : '+ upperOrLower)
console.log('몇번째 인가요? : ' + upperOrLower.indexOf(str))
console.log('바뀐건 몇번째 인가요? : ' + index)
console.log('='.repeat(70))
// 조건문2 =========================================================
if (index >= upperOrLower.length) {
index -= upperOrLower.length
console.log(' '.repeat(70))
console.log('조건문2')
console.log('문자열 길이 값 고정 : ' + upperOrLower.length)
}
console.log(' '.repeat(70))
console.log('바뀐 index에 해당하는 문자는? : '+ upperOrLower[index])
changedStr += upperOrLower[index]
}
console.log('==> 결과값 : ' + changedStr)
}
solution("a B z", 4)
// 소문자, 대문자, 공백
[접근방식]
[풀이]
[문제링크]
[다른사람풀이]
직사각형 별찍기 [1번 문제]
process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
const n = data.split(" ");
const a = Number(n[0]), b = Number(n[1]);
console.log((('*').repeat(a)+`\n`).repeat(b))
});
[풀이]
1. 표준입력 방식으로 배열 data를 받아 공백 기준으로 나눈 상수 n을 선언한다.
2. 숫자값 n의 0번째 인덱스에 해당하는 수는 a로 선언하고,
3. 숫자값 n의 1번째 인덱스에 해당하는 수는 b로 선언한다.
4. 출력하고자 하는 별문자열을 repeat함수로 a번 반복하고
5. 백틱문자와 역슬래쉬 n 으로 줄바꿈을 한다.
6. a번 반복된 별과 줄바꿈된 상태를 b번 반복한다.
짝수와 홀수 [2번 문제]
function solution(num) {
if (num % 2 === 0){
return 'Even'
}else{
return 'Odd'
}
}
solution(4)
[풀이]
1. 주어진 수는 num
2. 만약 num을 나눠서 나머지값이 0이(짝수)라면
3. Even를 출력하고 짝수가 아니(홀수)라면,
4. Odd를 출력한다.
가운데 글자 가져오기 [3번 문제]
function solution(strings){
let centerStr = '';
if (strings.length % 2 == 0){
centerStr = strings[strings.length / 2 - 1] + strings[strings.length / 2]
}else{
centerStr = strings[strings.length / 2 - 0.5]
}
return centerStr;
}
solution('qwer') // 짝수의 경우
solution('abcde') // 홀수의 경우
[풀이]
1. 출력하고자 하는 가운제 문자를 centerStr로 선언한다.
2. 만약 strings 길이가 짝수라면
3. strings길이를 반으로 나눈 값에 -1을 한 인덱스[w]와 반으로만 나눈 값의 인덱스[e]를 더해서 centerStr에 할당하고
4. 짝수가 아니라면, strings길이를 반으로 나눈 값에 -0.5을 한 인덱스[c]를 centerStr에 할당한다.
5. 두가지 경우를 담은 centerStr를 리턴한다.
두 정수 사이의 합 [4번 문제]
function solution(a, b) {
let answer = 0;
let arr = [];
if (a === b) {
answer = a
} else {
arr.push(a,b);
arr.sort((a,b)=>a-b);
for (let i = arr[0]; i <= arr[1]; i++) {
answer += i
}
}
return answer
}
[풀이]
1. 결과값 answer를 선언한다.
2. 배열에 넣어 정렬을 해야하기에 배열을 하나 선언한다.
3. 만약 a값과 b의 값이 같다면, answer에 그대로 a값을 나타내고
4. 다르다면 push함수로 a와 b를 배열에 담는다.
5. 이를 sort함수로 오름차순으로 정렬을 한번 해주는데
6. 그이유는 a와 b의 사이의 일정한 대소관계를 파악해서 그 차이만큼 반복을 돌리기 위함이다.
7. arr[0]의 수 부터 arr[1]보다 같거나 작은 모든 수를 반복해서 나온 i 값들을
8. 나올때마다 더하고 할당하여 answer 값에 담는다.
9. 두가지 경우를 담은 answer를 리턴한다.
문자열을 정수로 바꾸기 [5번 문제]
function solution(s) {
return Number(s)
}
[풀이]
1. Number() 내장함수 활용
없는 숫자 더하기 [6번 문제]
function solution(numbers) {
let answer = 0;
for(let i = 0; i<10; i++){
answer += i
}
for(const number of numbers) {
answer -= number
}
return answer;
}
solution([1,2,3,4,6,7,8,0])
[풀이]
1. 출력할 값 answer를 선언한다.
2. 반복문을 돌려 0부터 9까지 모든 값을 합한다.
3. answer의 전체 값에서, numbers에서 for .. of 문으로 배열에서 하나씩 꺼낸 값마다 값을 빼준다.
4. 전체값에서 numbers의 있는 값을 뺀 나머지가 결과값이 된다.
음양 더하기 [7번 문제]
function solution(absolutes, signs) {
let answer = 0
for (let i = 0; i < absolutes.length; i++){
if (signs[i] === true) {
answer = answer + absolutes[i]
}else{
answer = answer - absolutes[i]
}
}
return answer;
}
[풀이]
1. 출력할 값 answer를 선언한다.
2. absolutes 배열 길이만큼 반복한 i 값으로
3. signs의 인덱스를 색인해서 true 값이 나오면,
4. absolutes 값을 더해주고 true 값이 나오지 않는다면,
5. absolutes 값을 빼준다.
6. 두가지 경우를 answer로 출력한다.
평균 구하기 [8번 문제]
function solution(arr) {
let value = 0;
for(const el of arr)
value += el
return value/arr.length;
}
solution([1,2,3,4])
[풀이]
1. 출력할 값 value를 선언한다.
2. for .. of 문으로 배열에서 el을 하나씩 꺼낸값을 모두 더한다.
3. 나온 값 value를 배열의 길이만큼 값으로 나눈다.
핸드폰 번호 가리기 [9번 문제]
function solution(phone_number) {
return '*'.repeat(phone_number.length -4)+ phone_number.slice(-4)
}
solution("01033334444")
[풀이]
1. *을 번호길이의 끝 4자리 만큼만 빼고 별로 채운다.
2. 번호의 끝 4자리만 짜른다.
3. 그 둘을 더한다.
행렬의 덧셈 [10번 문제]
var input1 = [[1,2],[2,3]]
var input2 = [[3,4],[5,6]]
function solution(arr1, arr2) {
var answer = [];
for (let i = 0; i < arr1.length; i++) {
let temp = []
for (let j = 0; j < arr1[i].length; j++){
temp.push(arr1[i][j] + arr2[i][j])
}
answer.push(temp)
}
return answer;
}
console.log(solution(input1, input2))
[풀이]
1. 배열 answer를 선언한다.
2.
x만큼 간격이 있는 n개의 숫자 [11번 문제]
function solution(x, n) {
let answer = [];
for (let i = 0; i <= n; i++) {
answer.push(x*i)
}
return answer.slice(1)
}
[풀이]
1. 배열 answer를 선언한다.
2. n의 수 만큼 반복하여 얻은 i 값에
3. x를 곱한 값을 push로 answer 배열에 넣는다.
4. 리턴한다.
[번 문제]
[문제링크]
[풀이]
[번 문제]
[문제링크]
[풀이]