String 타입으로 대입을 하거나 += 연산을 수행하니 비효율성이 굉장히 높다.
class Solution {
public String solution(String new_id) {
String answer = "";
new_id = step1(new_id);
System.out.println(new_id);
new_id = step2(new_id);
System.out.println(new_id);
new_id = step3(new_id);
System.out.println(new_id);
new_id = step4(new_id);
System.out.println(new_id);
new_id = step5(new_id);
System.out.println(new_id);
new_id = step6(new_id);
System.out.println(new_id);
new_id = step7(new_id);
System.out.println(new_id);
answer = new_id;
return answer;
}
public String step1(String id){
//대문자를 소문자로 치환
id = id.toLowerCase();
return id;
}
public String step2(String id){
//소문자, 숫자, 빼기, 밑줄, 마침표를 제외한 모든 문자 제거
int i;
String edit = "";
char current;
for(i = 0; i < id.length(); i++){
current = id.charAt(i);
if(Character.isLetter(current))
{
edit += current;
}
else if(Character.isDigit(current)){
edit += current;
}
else if(current == '-' || current == '_' || current == '.'){
edit += current;
}
}
return edit;
}
public String step3(String id){
//마침표가 2번 이상 연속된 부분을 하나의 마침표로 치환
String edit = "";
int i;
for(i = 0; i < id.length(); i++){
if(edit.length() == 0){
edit += id.charAt(i);
}
else if(id.charAt(i) == '.' && edit.charAt(edit.length() - 1) == '.'){
continue;
}
else{
edit += id.charAt(i);
}
}
return edit;
}
public String step4(String id){
//마침표가 처음이나 끝에 위치하면 제거
if (id == null || id.length() == 0 || id.equals(".")) {
return "";
}
// 마침표가 처음이나 끝에 위치하면 제거
if(id.charAt(0) == '.') {
id = id.substring(1); // 첫 번째 문자가 마침표일 경우 제거
}
if(id.charAt(id.length() - 1) == '.') {
id = id.substring(0, id.length() - 1); // 마지막 문자가 마침표일 경우 제거
}
return id;
}
public String step5(String id){
if(id.length() == 0){
id = "a";
}
return id;
}
public String step6(String id){
//길이가 16자면 첫 15개 문자까지만 반환
//만약 제거 후 마침표가 위치하면 마침표 제거
if(id.length() >= 16){
id = id.substring(0, 15);//index 0~14까지 15개//15는 포함 안됨
if(id.charAt(14) == '.'){//마지막 문자가 .이라면
id = id.substring(0, 14);//0부터 13까지 14개 //13은 포함 안됨
}
}
return id;
}
public String step7(String id){
//길이가 2자 이하면 마지막 문자를 길이가 3이 될때까지 반복
char last;
if(id.length() <= 2){
last = id.charAt(id.length() - 1);
while(id.length() < 3){
id += last;
}
}
return id;
}
}
StringBuilder 타입으로 전환하니 시간이 크게 줄었다. 근데 다른 사람들 풀이를 보니 객체 메서드로 바꿔서 푸는게 더 멋있어 보인다.
또한 replaceAll()이라는 메서드를 사용하는데 나는 사용해본적이 없다.
class Solution {
public String solution(String new_id) {
String answer = "";
new_id = step1(new_id);
System.out.println(new_id);
new_id = step2(new_id);
System.out.println(new_id);
new_id = step3(new_id);
System.out.println(new_id);
new_id = step4(new_id);
System.out.println(new_id);
new_id = step5(new_id);
System.out.println(new_id);
new_id = step6(new_id);
System.out.println(new_id);
new_id = step7(new_id);
System.out.println(new_id);
answer = new_id;
return answer;
}
public String step1(String id){
// 대문자를 소문자로 치환
return id.toLowerCase();
}
public String step2(String id){
// 소문자, 숫자, 빼기, 밑줄, 마침표를 제외한 모든 문자 제거
StringBuilder edit = new StringBuilder();
for (int i = 0; i < id.length(); i++) {
char current = id.charAt(i);
if (Character.isLetterOrDigit(current) || current == '-' || current == '_' || current == '.') {
edit.append(current);
}
}
return edit.toString();
}
public String step3(String id){
// 마침표가 2번 이상 연속된 부분을 하나의 마침표로 치환
StringBuilder edit = new StringBuilder();
for (int i = 0; i < id.length(); i++) {
if (edit.length() == 0 || id.charAt(i) != '.') {
edit.append(id.charAt(i));
} else if (edit.charAt(edit.length() - 1) != '.') {
edit.append(id.charAt(i));
}
}
return edit.toString();
}
public String step4(String id) {
// 빈 문자열일 경우 처리
if (id.isEmpty()) {
return "";
}
// 마침표가 처음이나 끝에 위치하면 제거
if (id.charAt(0) == '.') {
id = id.substring(1);
}
if (id.length() > 0 && id.charAt(id.length() - 1) == '.') {
id = id.substring(0, id.length() - 1);
}
return id;
}
public String step5(String id){
// 빈 문자열이면 "a"를 추가
return id.isEmpty() ? "a" : id;
}
public String step6(String id){
// 길이가 16자면 첫 15개 문자까지만 반환, 마침표가 있으면 마지막에 제거
if (id.length() > 15) {
id = id.substring(0, 15);
if (id.charAt(14) == '.') {
id = id.substring(0, 14);
}
}
return id;
}
public String step7(String id){
// 길이가 2자 이하면 마지막 문자를 길이가 3이 될때까지 반복
StringBuilder sb = new StringBuilder(id);
char last = sb.charAt(sb.length() - 1);
while (sb.length() < 3) {
sb.append(last);
}
return sb.toString();
}
}
replaceAll()
메서드는 Java에서 문자열을 처리할 때 유용하게 사용되는 메서드로, 정규 표현식(Regex)을 사용하여 문자열 내에서 특정 패턴을 찾아 다른 문자열로 교체하는 기능을 합니다.
String result = originalString.replaceAll(String regex, String replacement);
모든 공백을 제거하기:
String str = "Hello World!";
String result = str.replaceAll(" ", "");
System.out.println(result); // 출력: HelloWorld!
숫자만 제거하기:
String str = "abc123def456";
String result = str.replaceAll("[0-9]", "");
System.out.println(result); // 출력: abcdef
여러 개의 공백을 하나로 줄이기:
String str = "Hello World !";
String result = str.replaceAll("\\s+", " ");
System.out.println(result); // 출력: Hello World !
\\s+
는 하나 이상의 공백 문자(스페이스, 탭 등)를 찾는 정규 표현식입니다.특정 문자열을 다른 문자열로 교체하기:
String str = "Hello World";
String result = str.replaceAll("World", "Java");
System.out.println(result); // 출력: Hello Java
replaceAll()
은 정규 표현식을 사용하므로, 특수 문자가 포함된 문자열을 교체할 때는 이 문자를 이스케이프(escape)해야 할 수 있습니다..
(마침표)는 정규 표현식에서 모든 문자를 의미하므로, 이를 문자 그대로 사용하려면 \\.
으로 이스케이프해야 합니다.String str = "Hello. World.";
String result = str.replaceAll("\\.", ""); // 마침표 제거
System.out.println(result); // 출력: Hello World
replaceAll()
과 replace()
의 차이replaceAll()
은 정규 표현식을 사용하여 문자열을 교체합니다.replace()
는 정규 표현식을 사용하지 않으며, 단순히 지정된 문자열을 교체합니다.String str = "apple apple apple";
String result1 = str.replaceAll("apple", "orange"); // 모든 "apple"을 "orange"로 교체
String result2 = str.replace("apple", "orange"); // 동일하게 모든 "apple"을 "orange"로 교체
replace()
는 단순 문자열 교체에 사용할 수 있고, replaceAll()
은 더 복잡한 패턴을 찾고 교체하는 데 유용합니다.