[백준/초보자] 10809번 - 알파벳 소문자 비교 (java)

팥빵·2025년 5월 19일

Baekjoon

목록 보기
11/49

>>문제 바로가기<<

단어 S가 주어지고, 각각의 알파벳이 몇번째 자리에 위치하는지를 표시하는 문제이다.

#방법1

키 포인트는 알파벳 소문자로만 주어져있다는 것이다.
단어 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();
    }
}


#방법2

두 번째 방법을 사용하기 위해 알아둬야 하는 정보가 두 가지 있다.

  1. StringBuilder sb = new StringBuilder();

StringBuilder는 말 그대로 String을 Build하는 기능으로써,

문자열을 효율적으로 수정 할 수 있도록 돕는 mutable(변경 가능한) 문자열 클래스이다.

String은 immutable로써, 문자열이 바뀔때마다 객체가 새로 생겨나는 반면에,
StringBuilder는 문자열이 바뀌면 객체 안에서 수정된다.


  1. 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();
    }
}

맞았습니다!!

profile
반갑습니다

0개의 댓글