
단어 S가 주어지고, 각각의 알파벳이 몇번째 자리에 위치하는지를 표시하는 문제이다.
키 포인트는 알파벳 소문자로만 주어져있다는 것이다.
단어 S의 i번째 알파벳 c와 실제 알파벳 순서 j를 비교하는 수식은 아래와 같이 주어진다.
if(c - 'a' == j) { (j번째 배열에 i를 대입) }
c는 단어 S의 i번째 알파벳이고, j는 알파벳 순서이다.
주의해야 할 점은, 평소처럼 c - '0'을 사용하면 안 된다는 것이다.
c - '0'은 "문자 형태의 숫자"를 "정수형으로 바꿀때" 사용하는 기법이고,
주어진 문제는 알파벳 소문자. 즉, 'a'(97)~'z'(122)까지의 범위이므로
c - 'a'를 사용해야 한다.
ex. 'a' - 'a' = 0
ex. 'b' - 'a' = 1
따라서 이를 활용한 최종적인 코드는 아래와 같다.
import java.io.*;
class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String S = br.readLine();
int[] array = new int[26]; // a~z까지 26개
for(int i=0; i<26; i++){
array[i] = -1; // 모든 공간 -1로 초기화
}
for(int i=0; i<S.length(); i++){
char c = S.charAt(i);
for(int j=0; j<26; j++){
if((c - 'a') == j){
if(array[j] == -1){ // 중복 알파벳 방지
array[j] = i;
}
}
}
}
for(int i=0; i<26; i++){
bw.write(array[i] + " ");
}
bw.flush();
br.close();
bw.close();
}
}
두 번째 방법을 사용하기 위해 알아둬야 하는 정보가 두 가지 있다.
StringBuilder sb = new StringBuilder();
StringBuilder는 말 그대로 String을 Build하는 기능으로써,
문자열을 효율적으로 수정 할 수 있도록 돕는 mutable(변경 가능한) 문자열 클래스이다.
String은 immutable로써, 문자열이 바뀔때마다 객체가 새로 생겨나는 반면에,
StringBuilder는 문자열이 바뀌면 객체 안에서 수정된다.
String.indexOf(char);
위 메소드는 대상이 되는 String 문자열에 char이 해당되면 그 자리에 맞는 숫자를 반환하고, 해당 문자가 문자열에 없으면 자동으로 -1을 반환하는 메소드이다.
정말 이 문제에 찰떡인 메소드 기능이다. 이 메소드 기능에서 문제의 영감을 받지 않았나 싶을 정도다.
위 두가지 기능을 이용하여 설계한 코드는 아래와 같다.
import java.io.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
String S = br.readLine();
for (char c = 'a'; c <= 'z'; c++) { // char='a'부터 'z'까지
sb.append(S.indexOf(c)).append(" ");
// sb 객체에 계속해서 문자열을 수정해나가는 형태 : "mutable"
// 문자열 S에서 c가 몇번째 순서에 있는지 자동 작성. 없으면 -1을 반환
// 반환 후엔 " "으로 띄어쓰기
}
bw.write(sb.toString()); // String으로 변환
bw.flush();
br.close();
bw.close();
}
}
맞았습니다!!