Algorithm/프로그래머스

[프로그래머스] Level1) 시저 암호

햄습햄 2021. 10. 22. 03:40

문제 설명

 

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.

 

 

제한 조건

 

  • 공백은 아무리 밀어도 공백입니다.
  • s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
  • s의 길이는 8000이하입니다.
  • n은 1 이상, 25이하인 자연수입니다.

 


풀이 과정 (자바)

 

입력받은 String형 s 값을 char형 배열 arr에 알파벳별로 나눠 넣었다.

 

for문을 돌려 arr 내에 값을 하나씩 꺼내 처리했다.

이때 아스키코드(십진법)를 적용했다.

c가 32이면 공백인데,

공백은 그대로 출력해야 하므로 값 변경 없이 그대로 32가 나오도록 처리했고,

공백이 아닌 경우에는 n만큼 더해서 (밀어서) 처리했다.

 

그리고 이 값이 대문자인지, 소문자인지 판단하여

각각 90 (= Z), 122(= z)가 넘으면 다시 A, a부터 시작할 수 있도록 처리했다.

 

마지막으로 처리된 값을 char형으로 변환하여 answer에 넣었다.

 

더보기

char형인 알파벳을 int 형으로 변환하면 해당 알파벳의 아스키코드(십진법)값을 알 수 있다.

A: 65, Z: 90 /a: 97, z: 122 /공백: 32

A~Z, a~z까지는 순서대로 숫자가 증가한다. (B: 66, C: 67, ....)

 

 

결과

 

 


다른 사람의 풀이

 

알파벳은 총 26개로 구성되어있다. 

밀어야 하는 수인 n을 26으로 나눈 나머지 값을 n에 넣었다.

어차피 z 값을 넘어가게 되면 다시 a부터 시작하므로,

26으로 나눈 나머지만큼 이동하면 (밀어주면) 된다.

 

for문을 String형 s의 길이만큼 돌렸다.

s는 charAt을 통해 하나씩 문자로 ch에 넣었다.

ch가 대문자인지, 소문자인지 판단했다.

 

ch에서 a(or A)값을 빼서 두 문자 간의 간격을 알아냈고, 밀어야 하는 n만큼 더했다.

그리고 그 값(여기서, X라고 지정)을 26으로 나눠 나머지를 구했다.

n 값이 커서 X가 26을 넘게 되면 한 바퀴 돈다는 뜻(a~z)이 되므로, 26으로 나눈 나머지를 구했다.

나머지를 a(or A)에 더해 ch 값에 넣었다.

 

answer에 ch 값을 더해 처리했다.

 

 

기타

 

문자끼리 연산했을 때, 숫자를 반환한다는 것을 알았다. 또한, 어차피 계속해서 반복해야 할 때는 하나씩 다 할 필요 없이 반복해야 하는 크기만큼 나눠 그 나머지만 진행하면 된다는 것을 깨달았다.