일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Android
- androidstudio
- bitmap
- BOJ
- Canvas
- CS
- Database
- DBeaver
- DP
- Ecilpse
- Eclipse
- firebase
- git
- github
- GooglePlayServices
- gradle
- IDE
- IntelliJ
- java
- json
- kotlin
- level2
- linux
- mariadb
- MYSQL
- Paint
- permission
- python
- Sorting
- sourcetree
Archives
will come true
[프로그래머스 / Level1] 시저 암호 (Java) 본문
728x90
문제
https://programmers.co.kr/learn/courses/30/lessons/12926
*시저암호 : 어떤 문장의 각 알파벳을 정해진 거리만큼 일어서 다른 알파벳으로 바꾸는 암호화 방식
기존 코드 (성공)
class Solution {
public String solution(String s, int n) {
String answer = "";
String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
String lower = "abcdefghijklmnopqrstuvwxyz";
String[] strArr = s.split("");
for(int i = 0; i < strArr.length; i++){
int idx = 0;
if(upper.contains(strArr[i])){
idx = upper.indexOf(strArr[i]) + n;
answer += (idx >= upper.length()) ? upper.charAt(idx - upper.length()) : upper.charAt(idx);
}else if(lower.contains(strArr[i])){
idx = lower.indexOf(strArr[i]) + n;
answer += (idx >= lower.length()) ? lower.charAt(idx - lower.length()) : lower.charAt(idx);
}else{
answer += strArr[i];
}
}
return answer;
}
}
- 미리 대/소문자용 문자열을 선언해두고, String객체의 charAt(int index)메서드를 통해 한 글자씩 가져오는 방식
- 문자열을 미리 선언해둬야 하는 수고로움이 있으며, 대소문자 전환이 프로그래밍적이지 못 하다.
- 대문자일 경우/ 소문자일 경우 수행되는 코드 블록이 비슷함. (=중복 코드)
학습 내용
A. 대·소문자 여부 판단
Character 클래스의 static 메소드 사용
메서드 | 설명 |
boolean isAlphabetic(int codePoint) | 주어진 문자가 알파벳인지 체크 |
boolean isUpperCase(char ch) | 주어진 문자가 대문자인지 체크 |
boolean isLowerCase(char ch) | 주어진 문자가 소문자인지 체크 |
public class CharCaseTest {
public static void main(String[] args) {
char ch = 'A';
System.out.println(Character.isAlphabetic(ch)); //true
System.out.println(Character.isUpperCase(ch)); //true
System.out.println(Character.isLowerCase(ch)); //false
ch = 'a';
System.out.println(Character.isAlphabetic(ch)); //true
System.out.println(Character.isUpperCase(ch)); //false
System.out.println(Character.isLowerCase(ch)); //true
}
}
B. 대표적인 대·소문자 전환 방법
- String 인스턴스 메서드 toUpperCase(), toLowerCase() 사용
- Char 타입 변수에 +32, -32 연산 수행 (아래 ASCII 코드표 A~Z, a~z 값 참고)
C. Char타입 문자에서 알파벳 순번 얻기
코드표에서 A~Z, a~z 알파벳은 순차적으로 코드가 정해져있다. A(65), B(66), C(67),.... Z(91)
이런 순차성 덕분에 특정 알파벳 문자에서 -'A'(-65)또는 -'a'(-97)을 하면 해당 문자의 순번을 알 수 있다.
ex) 'C' - 'A' = 67 - 65 = 2
'Z' - 'A' = 91 - 65 = 26
문자가 char타입 정수일 때도 -'0'(-48)을 해서 int타입 정수로 변환한 수 있다.
ex) '5'-'0' = 53 - 48 = 5
개선 코드 (성공)
public String solution(String s, int n) {
String answer = "";
n = n % 26; //n이 26(알파벳 개수)를 넘을 경우 대비
char[] chArr = s.toCharArray();
for(char ch : chArr){
if(Character.isUpperCase(ch)){
ch = (char)(((ch - 'A' + n) % 26) + 'A'); //ch+n 값이 26을 넘을 경우 대비 (대/소문자 구간 벗어나지 않게)
}else if(Character.isLowerCase(ch)){
ch = (char)(((ch - 'a' + n) % 26) + 'a');
}
answer += ch;
}
return answer;
}
728x90
'Algorithm' 카테고리의 다른 글
[프로그래머스 / Level1] 문자열 다루기 (Java) (0) | 2021.10.30 |
---|---|
[프로그래머스 / Level1] 소수 찾기 (Java) (0) | 2021.10.30 |
[프로그래머스 / Level1] 이상한 문자 만들기 (Java) (0) | 2021.10.26 |
[프로그래머스 / Level1] 정수 제곱근 판별 (Java) (0) | 2021.10.25 |
[프로그래머스 / Level1] 콜라츠 추측 (Java) (0) | 2021.10.24 |
Comments