<문제 제시>
<문제설명>
문자열 s가 매개변수로 주어집니다.
s에서 한 번만 등장하는 문자를 사전 순으로 정렬한 문자열을
return 하도록 solution 함수를 완성해보세요.
한 번만 등장하는 문자가 없을 경우 빈 문자열을 return 합니다.
<예시 입출력>
<문제 해결 과정>
두 번 이상 등장하는 문자를 제외한 문자를 "사전 순"으로 정렬해야하는 문제이다.
알파벳을 찾는 알고리즘이나, 특정 문자가 얼마나 등장하는지 최빈값을 찾는 문제에서
// 알파벳 개수만큼 배열을 만든다, 알파벳 위치에 해당하는 문자가 등장하면 인덱스를 1증가시킨다
int[] alphabet = new int[26];
이처럼 미리 알파벳 크기만큼의 정수형 배열을 선언 후 풀이를 시작한다.
선언된 배열의 값들을 모두 0으로 초기화시키고, 등장하는 문자에 해당하는 인덱스를 카운트 시킨다.
// 핵심코드
// 알파벳 소문자만 사용되므로 아스키코드를 이용하여 -97을 해주어 해당문자의 위치값을 구함
for(int i = 0; i < s.length(); i++) {
alphabet[s.charAt(i) - 97] += 1;
}
for(int i = 0; i < alphabet.length; i++) {
// 한번만 등장한 문자이면 배열의 카운트가 1이므로,
if(alphabet[i] == 1) {
// 다시 해당문자를 아스키코드만큼 더해서 char 형변환으로 저장한다.
answer += (char)(i + 97);
}
}
입력받은 문자열의 문자 별로 판단을 하는데, ( -97 ) 을 해주어 소문자 아스키코드를 구한다.
배열에 해당 인덱스를 카운트 시키고,
다른 반복문에서 1만 누적된 값들을 찾아 answer에 (char)(i + 97) 로
-97을 해준것처럼 i에서 +97을 한 후 문자 자료형 (char)으로 형변환하여 answer에 누적시킨다.
<전체코드>
package programmers.Lv0;
public class once_char {
public static String solution(String s) {
String answer = "";
// 알파벳 개수만큼 배열을 만든다, 알파벳 위치에 해당하는 문자가 등장하면 인덱스를 1증가시킨다
int[] alphabet = new int[26];
// 모든 값을 0으로 초기화
for(int i = 0; i < alphabet.length; i++) {
alphabet[i] = 0;
}
// 핵심코드
// 알파벳 소문자만 사용되므로 아스키코드를 이용하여 -97을 해주어 해당문자의 위치값을 구함
for(int i = 0; i < s.length(); i++) {
alphabet[s.charAt(i) - 97] += 1;
}
for(int i = 0; i < alphabet.length; i++) {
// 한번만 등장한 문자이면 배열의 카운트가 1이므로,
if(alphabet[i] == 1) {
// 다시 해당문자를 아스키코드만큼 더해서 char 형변환으로 저장한다.
answer += (char)(i + 97);
}
}
return answer;
}
public static void main(String[] args) {
String s = "abcabcadc";
System.out.println(solution(s));
}
}
아스키코드를 이용해서 알고리즘을 풀어보았는데, 비슷한 개념으로 최빈값을 찾는 알고리즘이나, 해당 문자를 배열의 어느 부분에 저장해야하는지의 처리 등을 알 수 있었다.
문제링크)
https://school.programmers.co.kr/learn/courses/30/lessons/120896
'Algorithms > 프로그래머스' 카테고리의 다른 글
[프로그래머스] '치킨 쿠폰' - Java (0) | 2023.05.13 |
---|---|
[프로그래머스] '문자열 계산하기' - Java (0) | 2023.05.13 |
[프로그래머스] '캐릭터의 좌표' - Java (0) | 2023.05.12 |
[프로그래머스] '가까운 수' - Java (0) | 2023.05.11 |
[프로그래머스] '중복된 문자 제거' - Java (0) | 2023.05.11 |