탄탄대로
[Level 1] 핸드폰 번호 가리기 본문
- 문자열 치환 문제
문제
"프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요."
풀이
class Solution {
public String solution(String phone_number) {
String answer = "";
int len = phone_number.length(); //들어온 문자열 전체 길이
int fourLen = len-4; //치환할 문자열 길이
String repStr = "*".repeat(fourLen); //치환할 문자열 길이만큼 * 생성
String fourStr = phone_number.substring(fourLen, len); //문자열 뒤에서 4개 남기고 자르기
answer = repStr + fourStr; //치환할 문자열과 4개 남긴 문자열 합치기
return answer;
}
}
나는 for문을 안 쓰고 싶어서 위와 같이 풀었다.
for문 대신 repeat() 함수를 사용해서 연속적인 문자열을 만들었다.
다른 사람 풀이
class Solution {
public String solution(String phone_number) {
String answer = "";
int len = phone_number.length();
int fourLen = len-4;
String repStr = "*".repeat(fourLen);
StringBuffer sb = new StringBuffer(phone_number);
answer = sb.replace(0, fourLen, repStr).toString();
return answer;
}
}
문자열 치환 검색해보다가 StringBuffer로 치환하는게 있어서 해봤다.
StringBuffer의 replace()를 사용했는데, 이 함수는 지정한 범위를 지정한 문자열로 바꿔준다.
나는 맨처음에 지정한 문자를 해당 구간의 문자 수 만큼 변경해주는지 알고 아래와 같이 했었다.
answer = sb.replace(0, fourLen, "*").toString();
그런데 결과값은 "*1234" 이런 식으로 나왔다. StringBuffer의 replace()는 정한 구간을 지정한 그 문자로 바꾸는 거였다. 그래서 "*"를 반복한 문자열을 넣어줬다.
class Solution {
public String solution(String phone_number) {
String answer = "";
for(int i = 0; i < phone_number.length()-4; i++){
answer += "*";
}
return answer += phone_number.substring(phone_number.length()-4, phone_number.length());
}
}
이렇게 푼 사람도 있었다. 깔끔.
class Solution {
public String solution(String phone_number) {
char[] ch = phone_number.toCharArray();
for(int i = 0; i < phone_number.length()-4; i++){
ch[i] = "*";
}
return String.valueOf(ch);
}
}
배열로 만들어서 풀어낸 사람도 있었다.
repeat()
String 메서드 중 하나로 String 문자열을 파라미터의 주어진 횟수만큼 반복.
자바11에서 새로 추가된 메소드.
파라미터를 0으로 지정하면 빈 문자열.
파라미터를 음수로 지정하면 IllegalArgumentExceptionthrow 에러.
파라미터를 1로 지정하면 문자열 그대로 반환.
내부적으로 Arrays.fill() 및 System.arraycopy() 메소드를 호출해서 새 문자열을 만듦.
[출처: https://www.javastring.net/java/string/java-string-repeat-method]
substring()
문자열을 자를때 사용하는 대표적인 String 메서드.
substring(int index): 앞에서부터 index 전까지 자름. (index 값은 0부터 시작)
//인자값으로 받은 인덱스 값 전까지 자름
String str = "0123456789";
str.substring(5);
//결과: "56789"
String str2 = "자바스트링";
str2.substring(2);
//결과: "스트링"
substring(int beginIndex, int endIndex): beginIndex에서부터 endIndex 전까지의 값을 리턴
String str = "영일이삼사오육칠팔구";
str.substring(2,5);
//결과: "이삼사"
StringBuffer
설명을 인용한다.
아래 출처에 가면 관련 메소드도 참고할 수 있다.
String 클래스의 인스턴스는 한 번 생성되면 그 값을 읽기만 할 수 있고, 변경할 수는 없습니다.
값을 변경하기 위해 덧셈(+) 연산자를 이용해 String 인스턴스의 문자열을 결합하면, 내용이 합쳐진 새로운 String 인스턴스를 생성합니다.
문자열을 많이 결합하면 결합할수록 공간의 낭비뿐만 아니라 속도 또한 매우 느려지게 됩니다.
하지만 StringBuffer 클래스의 인스턴스는 그 값을 변경할 수도 있고, 추가할 수도 있습니다.
StringBuffer 클래스는 내부적으로 버퍼(buffer)라고 하는 독립적인 공간을 가집니다.
버퍼 크기의 기본값은 16개의 문자를 저장할 수 있는 크기이며, 생성자를 통해 그 크기를 별도로 설정할 수도 있습니다. (하지만 인스턴스 생성 시 사용자가 설정한 크기보다 언제나 16개의 문자를 더 저장할 수 있도록 여유 있는 크기로 생성됩니다.)
StringBuffer 인스턴스를 사용하면 문자열을 바로 추가할 수 있으므로, 공간의 낭비도 없으며 속도도 매우 빨라집니다.
이러한 StringBuffer 클래스는 java.lang 패키지에 포함되어 제공됩니다.
불변 클래스(immutable class)와 가변 클래스(mutable class)
String 클래스와 같이 인스턴스가 한 번 생성되면 그 값을 변경할 수 없는 클래스를 불변 클래스(immutable class)라고 합니다.
반대로 StringBuffer 클래스와 같이 자유롭게 인스턴스의 값을 변경할 수 있는 클래스를 가변 클래스(mutable class)라고 합니다.
[출처: http://www.tcpschool.com/java/java_api_stringBuffer]
toCharArray()
String 메소드
문자열을 한 글자씩 쪼개서 char타입의 배열에 집어넣어주는 '친절한' 메소드.
※ 반대로 char형 배열을 합쳐서 하나의 String(문자열)로 만들 수 있다.
char[] charArr = {'a', 'b', 'c', 'd'};
String str = new String(charArr);
valueOf()
String 메소드.
다양한 타입의 변수를 String 형태로 바꿔주는 메소드.
※ String.valueOf()의 인자로 char 배열을 전달하면 문자열로 변환된 String 객체가 생성된다.
★ char 배열을 문자열로 만드는 방법
여기서만해도 2개의 방법이 나왔다.
① String str = new String(ch);
② String.valueOf(ch);
StringBuffer.append()를 사용해서도 문자열로 변형할 수 있고,
public void charArrayToString3() {
char[] charArray = { 'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd' };
StringBuilder sb = new StringBuilder();
for (char ch : charArray) {
sb.append(ch);
}
String str = sb.toString();
System.out.println(str);
}
Stream으로도 문자열로 변형할 수 있다.
Character[] charArray = { 'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd' };
Stream<Character> charStream = Arrays.stream(charArray);
String str = charStream.map(String::valueOf).collect(Collectors.joining());
System.out.println(str);
[출처: https://codechacha.com/ko/java-convert-chararray-to-string/]
[문제 출처: 프로그래머스]
'코딩테스트' 카테고리의 다른 글
[Level 1] 평균 구하기 (0) | 2022.07.18 |
---|---|
[Level 1] 하샤드 수 (0) | 2022.07.13 |
[Level 1]행렬의 덧셈 (0) | 2022.07.08 |
[Level 1] x만큼 간격이 있는 n개의 숫자 (0) | 2022.07.08 |
[Level 1] 직사각형 별 찍기 (0) | 2022.07.07 |