[JAVA] 알고리즘 문제풀이 기초 - 문자열 part.1
String
문자찾기 (1-1)
- 설명 : 한 개의 문자열을 입력받고, 특정 문자를 입력받아 해당 특정문자가 입력받은 문자열에 몇 개 존재하는지 알아내는 프로그램을 작성하세요. 대소문자를 구분하지 않습니다.문자열의 길이는 100을 넘지 않습니다.
-
입력 : 첫 줄에 문자열이 주어지고, 두 번째 줄에 문자가 주어진다. 문자열은 영어 알파벳으로만 구성되어 있습니다.
- 작성답안
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
String str1 = scan.nextLine().toLowerCase();
char ch = scan.nextLine().toLowerCase().charAt(0);
int idx = str1.indexOf(ch);
int cnt = 0;
while (idx>=0){
idx = str1.indexOf(ch, idx+1);
cnt++;
}
System.out.println(cnt);
}
}
- 특징
- 문자열.toLowerCase() : 전체 소문자로 변환
- 문자열..toUpperCase() : 전체 대문자로 변환
- indexOf 사용 익히기
- 문자열.toLowerCase() : 전체 소문자로 변환
대소문자 변환 (1-2)
- 설명 : 대문자와 소문자가 같이 존재하는 문자열을 입력받아 대문자는 소문자로 소문자는 대문자로 변환하여 출력하는 프로그램을 작성하세요.
-
입력 : 첫 줄에 문자열이 입력된다. 문자열의 길이는 100을 넘지 않습니다. 문자열은 영어 알파벳으로만 구성되어 있습니다.
- 작성답안
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Main t = new Main();
Scanner scan = new Scanner(System.in);
String str1 = scan.nextLine();
System.out.println(t.solution(str1));
}
public String solution(String str1h){
String result = "";
for (char ch: str1h.toCharArray()) {
if (Character.isLowerCase(ch)){
result += String.valueOf(ch).toUpperCase();
} else {
result += String.valueOf(ch).toLowerCase();
}
}
return result;
}
}
- 특징
- 문자열.toCharArray() : 문자열 char 배열로 변환 익히기
- 문자열.toCharArray() : 문자열 char 배열로 변환 익히기
문장 속 단어 (1-3)
-
설명 : 한 개의 문장이 주어지면 그 문장 속에서 가장 긴 단어를 출력하는 프로그램을 작성하세요. 문장속의 각 단어는 공백으로 구분됩니다.
-
입력 : 첫 줄에 길이가 100을 넘지 않는 한 개의 문장이 주어집니다. 문장은 영어 알파벳으로만 구성되어 있습니다.
-
출력 : 첫 줄에 가장 긴 단어를 출력한다. 가장 길이가 긴 단어가 여러개일 경우 문장속에서 가장 앞쪽에 위치한 단어를 답으로 합니다.
-
작성답안
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Main t = new Main();
Scanner scan = new Scanner(System.in);
String str1 = scan.nextLine();
System.out.println(t.solution(str1));
}
public String solution(String str1h){
String result = "";
String[] param = str1h.split(" ");
int len = 0;
for (String str: param) {
if(str.length() > len) {
len= str.length();
result = str;
}
}
return result;
}
}
- 특징
- .split 활용 익히기
- .split 활용 익히기
단어 뒤집기 (1-4)
-
설명 : N개의 단어가 주어지면 각 단어를 뒤집어 출력하는 프로그램을 작성하세요.
-
입력 : 첫 줄에 자연수 N(3<=N<=20)이 주어집니다. 두 번째 줄부터 N개의 단어가 각 줄에 하나씩 주어집니다. 단어는 영어 알파벳으로만 구성되어 있습니다.
-
출력 : N개의 단어를 입력된 순서대로 한 줄에 하나씩 뒤집어서 출력합니다.
-
작성답안
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Main t = new Main();
Scanner scan = new Scanner(System.in);
int roof = scan.nextInt();
String[] word = new String[roof];
for(int i=0; i<roof; i++){
word[i] = scan.next();
}
String[] result = t.solution(word);
for (String rst : result){
System.out.println(rst);
}
}
public String[] solution(String[] word){
String result[] = new String[word.length];
for (int i=0; i< word.length; i++){
String param = "";
for (int j=word[i].length()-1; j>=0; j--){
param += word[i].charAt(j);
}
result[i] = param;
}
return result;
}
}
- 풀이답안
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Main t = new Main();
Scanner scan = new Scanner(System.in);
int roof = scan.nextInt();
String[] word = new String[roof];
for(int i=0; i<roof; i++){
word[i] = scan.next();
}
for (String rst : t.solution(word)){
System.out.println(rst);
}
}
public String[] solution(String[] word){
String result[] = new String[word.length];
for (int i=0; i< word.length; i++){
String param = new StringBuilder(word[i]).reverse().toString();
result[i] = param;
}
return result;
}
}
- 특징
- 각각의 배열의 원소를 수동으로 뒤집는 방법을 사용하여 풀이 했으나, StringBuilder 지원메소드 방법을 익혀두는것이 좋음
- String param = new StringBuilder(문자열).reverse().toString();
- StringBuilder를 통해 문자열을 reverse()하고, String 클래스 형식으로 받기위해 다시 toString();
- String param = new StringBuilder(문자열).reverse().toString();
- 각각의 배열의 원소를 수동으로 뒤집는 방법을 사용하여 풀이 했으나, StringBuilder 지원메소드 방법을 익혀두는것이 좋음
특정 문자 뒤집기 (1-5)
-
설명 : 영어 알파벳과 특수문자로 구성된 문자열이 주어지면 영어 알파벳만 뒤집고, 특수문자는 자기 자리에 그대로 있는 문자열을 만들어 출력하는 프로그램을 작성하세요.
-
입력 : 첫 줄에 길이가 100을 넘지 않는 문자열이 주어집니다.
-
출력 : 첫 줄에 알파벳만 뒤집힌 문자열을 출력합니다.
-
작성답안
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Main t = new Main();
Scanner scan = new Scanner(System.in);
String str = scan.next();
System.out.println(t.solution(str));
}
public String solution(String word){
int lt = 0, rt = word.length()-1;
char[] ch = word.toCharArray();
char[] tmp = new char[word.length()];
while (lt<rt){
if(!((ch[lt]>=65 || ch[lt]>=65+32)&&(ch[lt]<=90 || ch[lt]<=90+32))){
lt++;
} else if (!(ch[rt]>=65 || ch[rt]>=65+32)&&(ch[rt]<=90 || ch[rt]<=90+32)){
rt--;
} else {
tmp[lt] = ch[lt];
ch[lt] = ch[rt];
ch[rt] = tmp[lt];
lt++;
rt--;
}
}
return String.valueOf(ch);
}
}
- 풀이답안
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Main t = new Main();
Scanner scan = new Scanner(System.in);
String str = scan.next();
System.out.println(t.solution(str));
}
public String solution(String word){
int lt = 0, rt = word.length()-1;
char[] ch = word.toCharArray();
char[] tmp = new char[word.length()];
while (lt<rt){
if(!Character.isAlphabetic(ch[lt])){
lt++;
} else if (!Character.isAlphabetic(ch[rt])){
rt--;
} else {
tmp[lt] = ch[lt];
ch[lt] = ch[rt];
ch[rt] = tmp[lt];
lt++;
rt--;
}
}
return String.valueOf(ch);
}
}
- 특징
- lt, rt를 사용하여 첫 시작점과, 끝 종료점을 정하고 조건에 일치할 시 한칸씩 당기는 방법으로 진행
- 양 끝점을 동시에 체크하는 만큼 lt<rt라는 조건을 지정해 절반지점까지만 실행하면 됨
- 아스키코드를 사용해 수동으로 알파벳 체크를 하였으나, Character에서 지원하는 isAlphabetic 메소드를 이용하면 훨씬 쉽게 체크 할 수 있음.