· 문제 설명
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 AB는 1만큼 밀면 BC가 되고, 3만큼 밀면 DE가 됩니다. z는 1만큼 밀면 a가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
· 제한 조건
s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
s의 길이는 8000이하입니다.
n은 1 이상, 25이하인 자연수입니다.
· 입출력 예
s | n | result |
AB | 1 | BC |
z | 1 | a |
a B z | 4 | e F d |
· Thinking 1
1. 공백을 제거한 string값을 일단 만들고 (공백에 해당하는 index는 저장)
2. z를 밀면 다시 a로 돌아오게끔.. z인덱스 이상일때 다시 돌아오도록
3. 소문자는 소문자 / 대문자는 대문자
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
class Solution {
public String solution(String s, int n) {
String result = "";
ArrayList<String> alphabet = new ArrayList<String>(Arrays.asList("A", "B", "C", "D", "E", "F", "G", "H", "I",
"J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"));
ArrayList<String> input = new ArrayList<String>(Arrays.asList(s.split("")));
ArrayList<String> answer = new ArrayList<String>();
int[] index = new int[input.size()];
int[] spaceIndex = new int[input.size()];
int[] lowerIndex = new int[input.size()];
for (int i = 0; i < input.size(); i++) {
for (int j = 0; j < alphabet.size(); j++) {
if (input.get(i).equalsIgnoreCase(alphabet.get(j))) {
index[i] = j;
if (Character.isLowerCase(input.get(i).charAt(0)) == true) {
lowerIndex[i] = 1;
}
} else if (input.get(i).equals(" ")) {
spaceIndex[i] = i;
}
}
}
for (int i = 0; i < index.length; i++) {
index[i] = index[i] + n;
if (index[i] > 25) {
index[i] = index[i] - 26;
}
}
for (int i = 0; i < index.length; i++) {
if (spaceIndex[i] != 0) {
answer.add(" ");
} else if (lowerIndex[i] == 1) {
answer.add(alphabet.get(index[i]).toLowerCase());
} else {
answer.add(alphabet.get(index[i]));
}
}
Iterator<String> it = answer.iterator();
while (it.hasNext()) {
result += it.next();
}
return result;
}
}
- 정확성 : 84.6
- 시작 값이 공백인 경우를 생각하지 않음
- lowercase와 마찬가지로 공백인 경우도 해당 index에 1값을넣고 1값일때에 따라 처리
· 완성 코드
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
class Solution {
public String solution(String s, int n) {
String result = "";
ArrayList<String> alphabet = new ArrayList<String>(Arrays.asList("A", "B", "C", "D", "E", "F", "G", "H", "I",
"J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"));
ArrayList<String> input = new ArrayList<String>(Arrays.asList(s.split("")));
ArrayList<String> answer = new ArrayList<String>();
int[] index = new int[input.size()];
int[] spaceIndex = new int[input.size()];
int[] lowerIndex = new int[input.size()];
for (int i = 0; i < input.size(); i++) {
for (int j = 0; j < alphabet.size(); j++) {
if (input.get(i).equalsIgnoreCase(alphabet.get(j))) {
index[i] = j;
if (Character.isLowerCase(input.get(i).charAt(0)) == true) {
lowerIndex[i] = 1;
}
} else if (input.get(i).equals(" ")) {
spaceIndex[i] = 1;
}
}
}
for (int i = 0; i < index.length; i++) {
index[i] = index[i] + n;
if (index[i] > 25) {
index[i] = index[i] - 26;
}
}
for (int i = 0; i < index.length; i++) {
if (spaceIndex[i] == 1) {
answer.add(" ");
} else if (lowerIndex[i] == 1) {
answer.add(alphabet.get(index[i]).toLowerCase());
} else {
answer.add(alphabet.get(index[i]));
}
}
Iterator<String> it = answer.iterator();
while (it.hasNext()) {
result += it.next();
}
return result;
}
}
· 다른 사람의 풀이
class Solution {
public String solution(String s, int n) {
String result = "";
n = n % 26;
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (Character.isLowerCase(ch)) {.
ch = (char) ((ch - 'a' + n) % 26 + 'a');
} else if (Character.isUpperCase(ch)) {
ch = (char) ((ch - 'A' + n) % 26 + 'A');
}
result += ch;
}
return result;
}
}
- 진짜 비효율적으로 코드를 짜는구나 내가..ㅎ;;
ch = (char) ((ch - 'a' + n) % 26 + 'a')
-> ch - 'a' : 초기 소문자 아스키코드값
-> ch - 'a' + n : n만큼 밀리는거니까 n을 더함
-> (ch - 'a' + n) % 26 : 이게 소문자니까 소문자 범위 내에서만 이루어져야되기 때문에...!
-> ((ch - 'a' + n) % 26 + 'a') : 마지막에 a를 더해주는것도 같은 이유임
· 문제 출처
https://programmers.co.kr/learn/courses/30/lessons/12926
'Algorithm > Programmers' 카테고리의 다른 글
예산 (0) | 2019.05.31 |
---|---|
약수의 합 (0) | 2019.05.31 |
수박수박수박수박수박수? (0) | 2019.05.31 |
소수 찾기 (0) | 2019.05.31 |
서울에서 김서방 찾기 (0) | 2019.05.31 |
댓글