문제: Encryption
난이도: Medium
문제 설명
다음의 암호화 방식으로 영어 문자열을 암호화해야 한다. 먼저, 문자열에서 띄어쓰기를 제거하고 그 문자열의 길이를 L이라 한다. 그 후 문자들은 행과 열이 다음의 제약을 가진 격자 안에 적힌다.
L을 내림한 값 ≤행 ≤열 ≤ L을 올림한 값
예를 들어, 문장 s = have a nice day는 havaniceday로 변환되고, L=12, L 은 3과 4 사이의 값이므로 행이 3, 열이 4인 격자 안에 쓰여져서 다음과 같게 된다.
have
anic
eday
이 격자에 쓰인 문자를 왼쪽부터 세로로 읽고 각각의 덩어리를 띄어쓰기를 하면 암호화가 완료된다.
hae and via ecy
단, 행 ×열 ≥ L 이어야 하고, 이를 만족하는 가장 작은 영역을 사용해야 한다.
문제 해결
소스 코드
static String encryption(String s) {
String noSpace = s.replaceAll(" ", "").trim();
int len = noSpace.length();
int row = (int)Math.floor(Math.sqrt(len));
int column = (int)Math.ceil(Math.sqrt(len));
List<String> cutStr = new ArrayList<String>();
StringBuffer buff = new StringBuffer("");
if(row * column < len) {
row++;
}
for(int i = 0; i < row; i++) {
if((i * column + column) > len) {
cutStr.add(noSpace.substring(i * column));
} else {
cutStr.add(noSpace.substring(i * column, i * column + column));
}
}
for(int i = 0; i < column; i++) {
for(int j = 0; j < cutStr.size(); j++) {
if(i < cutStr.get(j).length()) {
buff.append(cutStr.get(j).charAt(i));
}
}
buff.append(" ");
}
return buff.toString();
}
해설
띄어쓰기 없애기, 행과 열 구하는 법은 문제에서 설명한 대로 구현하면 된다.
띄어쓰기를 없앤 문자열을 열의 크기만큼 잘라내어 배열이나 리스트에 저장하고, 이 배열이나 리스트에서 각 요소의 n번째 문자만 뽑아내어 합치고 띄어쓰기 한 칸 추가하는 것을 반복하면 해결된다.
'해커랭크(Problem Solving)' 카테고리의 다른 글
The Time in Words (0) | 2019.10.20 |
---|---|
Save the Prisoner! (0) | 2019.10.20 |
Beautiful Days at the Movies (0) | 2019.10.13 |
Picking Numbers (0) | 2019.10.02 |
Extra Long Factorials (0) | 2019.10.02 |