프로그래머스 Lv 1. 시저암호

FE 개발자 신상오·2022년 6월 5일
0

프로그래머스

목록 보기
9/20
post-thumbnail

문제


풀이

문자열 알파벳 인덱스(idx)에서 n만큼 이동하는 암호화

function solution(s, n) {
  const lower = "abcdefghijklmnopqrstuvwxyz";
  const upper = lower.toUpperCase();
  let   idx = 0;
  let   result = "";

  for (let i = 0; i < s.length; i++) {
    // 문자가 공백일 경우
    if (s[i] === " ") {
      result += " ";
      continue;
    }

	// 문자가 소문자일 경우
    if (s[i] === s[i].toLowerCase()){
        idx = lower.indexOf(s[i]);

        if (idx + n > 25) {
          result += lower[idx + n - 26];
        } else {
          result += lower[idx + n];
        }
    // 문자가 대문자일 경우
    } else {
        idx = upper.indexOf(s[i]);

        if (idx + n > 25) {
          result += upper[idx + n - 26];
        } else {
          result += upper[idx + n];
        }
    }
  }
  return result;
}

다른 풀이

function solution(s, n) {
  const lower = "abcdefghijklmnopqrstuvwxyz";
  const upper = lower.toUpperCase();
  let   idx = 0;
  let   result = "";

  for (let i = 0; i < s.length; i++) {
    
    if (s[i] === " ") {
      result += " ";
      continue;
    }

    if (s[i] === s[i].toLowerCase()){
        idx = lower.indexOf(s[i]);
        result += lower[(idx + n) % 26];
    } else {
        idx = upper.indexOf(s[i]);
        result += upper[(idx + n) % 26];
        }
    }
    return result;
  }

해설

문제를 분해해서 3문제를 해결하면 풀 수 있습니다

1. 문자가 공백일 경우

가독성을 위해서 continue 키워드로 해당 문자열 인덱스를 건너뛰었습니다.

  if (s[i] === " ") {
      result += " ";
      continue;
    }

2. 소문자, 대문자일 경우

// 소문자일 경우
if (s[i] === s[i].toLowerCase()){}

// 대문자일 경우
else{}

3. 암호화를 할 때 인덱스가 25를 넘어갈 경우

두 가지의 풀이방법이 있습니다.

  • 인덱스가 25가 넘어가는 경우를 따로 처리
// 25 넘어가는 경우
  if (idx + n > 25) 
  {
    result += lower[idx + n - 26];
  } // 25 안 넘는 경우
	else {
          result += lower[idx + n];
        }
  • 진법변환 원리를 이용
result += lower[(idx + n) % 26];

암호화한 문자의 인덱스가 알파벳의 길이인 26을 넘어가는 경우 % 연산자를 이용해서 처리합니다.

예를들어 설명하자면 'z' 문자를 1 만큼 암호화할 경우 'a' 문자가 나와야합니다
알파벳에서 'z'는 25번째 인덱스에 위치하고 'a'는 0번째 인덱스에 위치합니다
25 + 1 = 26 의 값을 % 26 으로 계산하면 나머지 값인 0이 도출됩니다

profile
주간 회고용 블로그입니다 (개발일지와 정보글은 티스토리에 작성합니다.)

0개의 댓글