항해99

TIL 12 알고리즘 공부하자

kongom2 2021. 11. 13. 00:57

시저암호 [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번 문제]

[문제링크]

 

코딩테스트 연습 - 직사각형 별찍기

이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다. 별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요. 제한 조건 n과 m은 각각 1000 이하인 자연수

programmers.co.kr

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번 문제]

[문제링크]

 

코딩테스트 연습 - 짝수와 홀수

정수 num이 짝수일 경우 "Even"을 반환하고 홀수인 경우 "Odd"를 반환하는 함수, solution을 완성해주세요. 제한 조건 num은 int 범위의 정수입니다. 0은 짝수입니다. 입출력 예 num return 3 "Odd" 4 "Even"

programmers.co.kr

function solution(num) {
    if (num % 2 === 0){
      return  'Even'
    }else{
       return 'Odd'
    }
}
solution(4)

[풀이]

1. 주어진 수는 num

2. 만약 num을 나눠서 나머지값이 0이(짝수)라면

3. Even를 출력하고 짝수가 아니(홀수)라면,

4. Odd를 출력한다.


가운데 글자 가져오기 [3번 문제]

[문제링크]

 

코딩테스트 연습 - 가운데 글자 가져오기

단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다. 재한사항 s는 길이가 1 이상, 100이하인 스트링입니다. 입출력 예 s ret

programmers.co.kr

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번 문제]

[문제링크]

 

코딩테스트 연습 - 두 정수 사이의 합

두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요. 예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다. 제한 조건 a와 b가 같은 경우

programmers.co.kr

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번 문제]

[문제링크]

 

코딩테스트 연습 - 문자열을 정수로 바꾸기

문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요. 제한 조건 s의 길이는 1 이상 5이하입니다. s의 맨앞에는 부호(+, -)가 올 수 있습니다. s는 부호와 숫자로만 이루어져있습니

programmers.co.kr

function solution(s) {
    return Number(s)
}

[풀이]

1. Number() 내장함수 활용


없는 숫자 더하기 [6번 문제]

[문제링크]

 

코딩테스트 연습 - 없는 숫자 더하기

0부터 9까지의 숫자 중 일부가 들어있는 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요. 제한

programmers.co.kr

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번 문제]

[문제링크]

 

코딩테스트 연습 - 음양 더하기

어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 re

programmers.co.kr

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번 문제]

[문제링크]

 

코딩테스트 연습 - 평균 구하기

정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요. 제한사항 arr은 길이 1 이상, 100 이하인 배열입니다. arr의 원소는 -10,000 이상 10,000 이하인 정수입니다. 입출력 예 arr

programmers.co.kr

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번 문제]

[문제링크]

 

코딩테스트 연습 - 핸드폰 번호 가리기

프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다. 전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자

programmers.co.kr

function solution(phone_number) {
   return '*'.repeat(phone_number.length -4)+ phone_number.slice(-4)
}
solution("01033334444")

[풀이]

1. *을 번호길이의 끝 4자리 만큼만 빼고 별로 채운다.

2. 번호의 끝 4자리만 짜른다.

3. 그 둘을 더한다.


행렬의 덧셈 [10번 문제]

[문제링크]

 

코딩테스트 연습 - 행렬의 덧셈

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요

programmers.co.kr

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번 문제]

[문제링크]

 

코딩테스트 연습 - x만큼 간격이 있는 n개의 숫자

함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.

programmers.co.kr

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. 리턴한다.

 


 

 [번 문제]

[문제링크]

[풀이]


 [번 문제]

[문제링크]

[풀이]