https://www.acmicpc.net/problem/1718
1718번: 암호
Vigenere cipher이라는 암호화 방법은 암호화하려는 문장 (평문)의 단어와 암호화 키를 숫자로 바꾼 다음, 평문의 단어에 해당하는 숫자에 암호 키에 해당하는 숫자를 더하는 방식이다. 이 방법을 변
www.acmicpc.net
접근 과정
1. 어떤 문제로 이해 했는가? 그리고 문제의 제약 조건은?
암호화 키와 평문이 주어졌을 때, 암호문을 구하여라
암호문을 생성할 때는 Vigenere cipher이라는 암호화 방법을 사용한다.
암호화하려는 문장 (평문)의 단어와 암호화 키를 숫자로 바꾼 다음, 평문의 단어에 해당하는 숫자에 암호 키에 해당하는 숫자를 더하는 방식이다. 이 방법을 변형하여 평문의 단어에 암호화 키에 해당하는 숫자를 빼서 암호화하는 방식을 생각해 보자.
시간제한 : 2초
평문 : 알파벳, 공백문자로 구성
평문의 길이 : 30000자 이하
2. 나의 방식대로 문제를 재정의 하자.
해당 문제는 암호화 키를 기준으로 평문의 알파벳이 몇번째 뒤의 문자인지를 계산하는 문제이다.
3. 어떤 알고리즘과 자료구조를 사용할 것인가?
암호문[i] = a + (평문 - 암호화키) 의 방식으로 계산한다.
4. 어떻게 계산할 것인가?
1) 입력
BufferedReader
StringBuilder
2) 시간 복잡도 계산
O(n)
5. 주의할 점은 무엇인가?
6. 풀이 과정
import java.io.*;
import java.util.*;
public class q1718 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
String rock = br.readLine();
StringBuilder output = new StringBuilder();
Integer inputIndex = 0;
Character cha;
for (int i = 0; i < input.length(); i++) {
inputIndex = i % rock.length();
if (input.charAt(i) == ' ') {
output.append(" ");
} else {
if('a' + (input.charAt(i) - rock.charAt(inputIndex) - 1) > 'z'){
cha = (char) ('a' + (input.charAt(i) - rock.charAt(inputIndex) - 27));
}else if('a' + (input.charAt(i) - rock.charAt(inputIndex) - 1) < 'a'){
cha = (char) ('a' + (input.charAt(i) - rock.charAt(inputIndex) + 25));
} else {
cha = (char) ('a' + (input.charAt(i) - rock.charAt(inputIndex) - 1));
}
output.append(cha);
}
}
System.out.println(output.toString());
br.close();
}
}
7. 개선점
'코딩테스트' 카테고리의 다른 글
[프로그래머스] 매칭 점수 (0) | 2022.11.28 |
---|---|
[백준 7662번] 이중 우선순위 큐 (0) | 2022.01.12 |
[백준 9489번] 2xn 타일링 (0) | 2022.01.12 |
[백준 20365번] 2xn 타일링 (0) | 2022.01.11 |
[백준 1668번] 트로피 진열 (0) | 2022.01.11 |