이번 포스트에서는 자바로 알고리즘 문제를 풀기위해서 필요한 자바 문법을 간단하게 정리한다.
[인프런] 자바 알고리즘 문제풀이 의 문제를 풀면서 내용을 참조했다.
1) 문자 찾기
- 한 개의 문자열을 입력받고, 특정 문자를 입력받아 해당 특정문자가 입력받은 문자열에 몇 개 존재하는지 알아내는 프로그램을 작성하세요. 대소문자를 구분하지 않습니다.
ex) Computercooler / c => 2
- 소문자-> 대문자 변환
문자열 : str.toUpperCase()
문자: Character.toUpperCase(ch)
- 대문자 -> 소문자 변환
문자열 : str.toLowerCase()
문자: Character.toLowerCase(ch)
- 문자열 -> 문자 배열 : char[] chArray = str.toCharArray();
- 문자 배열 -> 문자열 : String str = String.valueOf(chArray);
2) 대소문자 변환
- 대문자와 소문자가 같이 존재하는 문자열을 입력받아 대문자는 소문자로 소문자는 대문자로 변환하여 출력하는 프로그램을 작성하세요.
ex) StuDY => sTUdy
- 대문자 구분
가. 문자열 : str.isUpperCase()
나. 문자: Character.isUpperCase(ch)(ch)
- 소문자 구분
가. 문자열 : str.isLowerCase()
나. 문자: Character.isLowerCase(ch)
3) 문장 속 단어
- 한 개의 문장이 주어지면 그 문장 속에서 가장 긴 단어를 출력하는 프로그램을 작성하세요.
문장 속 단어는 공백으로 구분됩니다.
ex) it is time to study => study
- 특정문자열로 나누기 : String[] strArray = str.split("");
- 문자열 길이: int len = str.length();
4) 단어 뒤집기
- N개의 단어가 주어지면 각 단어를 뒤집어 출력하는 프로그램을 작성하세요.
ex) 3 /good/Time/Big => doog/emiT/giB
- 문자열 뒤집기
String str_rev = new StringBuilder(str).reverse().toString();
5) 특정 문자 뒤집기
- 영어 알파벳과 특수문자로 구성된 문자열이 주어지면 영어 알파벳만 뒤집고, 특수문자는 자기 자리에 그대로 있는 문자열을 만들어 출력하는 프로그램을 작성하세요
ex) a#b!GET@S -> S#T!EGb@a
풀이) 왼쪽 자리에 특수문자면 lt++, 오른쪽 자리에 특수 문자면 rt++, 왼쪽 오른쪽 문자이면 lt와 rt 모두++
- 문자열 -> 문자 배열 : char[] chArray = str.toCharArray();
- 문자 배열 -> 문자열 : String str = String.valueOf(chArray);
- 알파벳인지 확인 : boolean isAlpha = Character.isAlphabetic(ch);
6) 중복 문자제거
- 소문자로 된 한개의 문자열이 입력되면 중복된 문자를 제거하고 출력하는 프로그램을 작성하세요. 중복이 제거된 문자열의 각 문자는 원래 문자열의 순서를 유지합니다.
ex) ksekkset -> kset
풀이) 해당 문자의 인덱스 번호를 찾아서 현재 위치가 아니면 삭제한다. => if(str.indexOf(str.charAt(i)==i))
- 앞에서부터 해당 문자의 인덱스 번호 찾기 int num = str.indexOf(ch)
- 뒤에서부터 해당 문자의 인덱스 번호 찾기 int num = str.lastIndexOf(ch)
7) 회문 문자열
- 앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 회문 문자열이라고 합니다. 문자열이 입력되면 해당 문자열이 회문 문자열이면 "YES", 회문 문자열이 아니면 “NO"를 출력하는 프로그램을 작성하세요.
ex) gooG => YES
- 문자열 뒤집기 String str_rev = new StringBuilder(str).reverse().toString();
- 대소문자 무시하고 같은지 비교 boolean isTrue = str.equalsIgnoreCase(tmp)
8) 유효한 팰린드롬
- 앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 팰린드롬이라고 합니다.문자열이 입력되면 해당 문자열이 팰린드롬이면 "YES", 아니면 “NO"를 출력하는 프로그램을 작성하세요. 단 회문을 검사할 때 알파벳만 가지고 회문을 검사하며, 대소문자를 구분하지 않습니다. 알파벳 이외의 문자들의 무시합니다.
ex) found7, time: study; Yduts; emit, 7Dnuof => YES
- 문자열 뒤집기, 대소문자 무시하고 같은지 비교 : 7번 참조
- 알파벳이 아닌 문자 제거 => 알파벳이 아닌 것은 모두 빈칸으로 치환
String str= str.replaceAll("[^A-Za-z]","")
9) 숫자만 추출
- 문자와 숫자가 섞여있는 문자열이 주어지면 그 중 숫자만 추출하여 그 순서대로 자연수를 만
듭니다
ex) g0en2T0s8eSoft => 208
- 8번 참조해서 알파벳 제거 : String str= str.replaceAll("[A-Za-z]","")
- 문자 중 숫자 판단 : boolean a = Character.isDigit(ch)
10) 가장 짧은 문자거리
- 한 개의 문자열 s와 문자 t가 주어지면 문자열 s의 각 문자가 문자 t와 떨어진 최소거리를 출
력하는 프로그램을 작성하세요.
ex) teachermode e => 1 0 1 2 1 0 1 2 2 1 0
풀이)
- 초기 p를 큰 수로 지정
- 왼쪽부터 확인하면서 같으면 p=0로 초기화 다르면 p++ 해서 배열에 넣기
- 다시 p 큰 수로 초기화
- 오른쪽 확인하면서 왼쪽 방향 배열과 비교하면서 최솟값으로 지정
같으면 p=0로 초기화 다르면 arr[i]=Math.min(arr[i],++p)
| 방향 | t | e | a | c | h | e | r | m | o | d | e |
|---|
| 왼쪽 | 100 | 0 | 1 | 2 | 3 | 0 | 1 | 2 | 3 | 4 | 0 |
| 오른쪽 | 1 | 0 | 3 | 2 | 1 | 0 | 4 | 3 | 2 | 1 | 100 |
| 최소값 | 1 | 0 | 1 | 2 | 1 | 0 | 1 | 2 | 2 | 1 | 0 |
public static int[] solution(String str, char ch) {
int[] array = new int[str.length()];
int p = 1000;
for(int i=0; i<str.length(); i++) {
if(str.charAt(i)==ch) {
p=0;
array[i]=p;
}else {
p++;
array[i]=p;
}
}
p = 1000;
for(int i= str.length()-1; i>=0; i--) {
if(str.charAt(i)==ch) {
p=0;
array[i]=p;
}else {
p++;
array[i]=Math.min(array[i], p);
}
}
return array;
}
11) 문자열 압축
- 알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는
문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로 문자열을 압축하는 프로그램을 작성하시
오. 단 반복횟수가 1인 경우 생략합니다.
ex) KKHSSSSSSSE => K2HS7E
풀이)
1. 초기문자 cnt=1
2. 반복문 돌면서 현재 문자와 바로 뒷문자가 같으면 cnt++
3. 뒷문자가 다르고 cnt가 1보다 크면 숫자 추가, 새로운 문자 추가, cnt=1로 초기화
12) 암호
- 비밀편지는 알파벳 한 문자마다 # 또는 *이 일곱 개로 구성되어 있습니다.
- “#*#”를 일곱자리의 이진수로 바꿉니다. #은 이진수의 1로, *이진수의 0으로 변환합니다. 결과는 “1000001”로 변환됩니다.
- 바뀐 2진수를 10진수화 합니다. “1000001”을 10진수화 하면 65가 됩니다.
- 아스키 번호가 65문자로 변환합니다. 즉 아스크번호 65는 대문자 'A'입니다.
ex) 4 / #**###############** => COOL
풀이)
1. 모든 문자의 #은 1로, *은 0으로 바꾼다.
2. 문자열 0~6까지 자른다.
3. 2진수-> 10진수 -> char 문자로 바꾸기
4. 문자열에 0-6까지 삭제하고 7부터 다시 과정 시작
- n부터 끝까지 문자열 자르기 String str1 = str.subString(n)
- 인덱스 s부터 n-1까지 문자열 자르기 String str2 = str.subString(s,n)
- 문자열을 특정 n진수로 숫자로 바꾸기 int num = Integer.parseInt(str,n)
public static String solution(int n, String str) {
String answer="";
str = str.replaceAll("\\#", "1").replaceAll("\\*", "0");
for(int i=0; i<n; i++) {
String temp = str.substring(0, 7);
int num = Integer.parseInt(temp, 2);
char ch = (char)num;
answer+=ch;
str = str.substring(7);
}
return answer;
}