알고리즘/문자열

[백준알고리즘] 문자열 - 10809번 알파벳 찾기 문제

Fenderblue 2022. 7. 12. 21:12

쉽지만 놓치고 간 부분들이 있던 문제.

.length를 해놓고 오류표시선이 뜨길래 왜지??저번에도 잘만 썼는데..했는데

length()와 length의 차이를 염두에 두고 있지 않아서 그랬다.

length()는 배열 길이를 구하는 함수, length는 문자열의 길이를 구하는 함수라는 차이가 있다!

반대로 적어놓음..length()가 문자열 길이 구하는 함수, length는 배열길이 구하는 함수

 

예제로 입출력을 해보고 이상한점이 있었다.

package Level6;

import java.util.Arrays;
import java.util.Scanner;

public class fineAlphabet {
    public static void main(String[] args) {
        int[] alpIndex = new int[26];   //a~z까지의 26크기의 배열 생성
        Arrays.fill(alpIndex, -1);  //-1로 배열 초기화
        Scanner sc = new Scanner(System.in);
        String S = sc.next();   //단어 S 입력받기
        int alpNum;     //a는 0, b는 1,,
        for (int i = 0; i < S.length(); i++) {  //헷갈리지말자 문자열길이는 .length(), 배열길이는 .length (이건 괄호없음)
            //배열의 0번째부터 a를 나타내고, 해당 자리에 index를 할당
            alpNum = S.charAt(i) - 97;  //문자열의 맨 앞의 문자에서 97을 빼면 해당하는 순번의 배열 번호이다
            alpIndex[alpNum] = i;
        }

        for (int i : alpIndex) {
            System.out.print(i + " ");
        }
    }
}

위와같이 나머지들은 다 백준에서의 예시와 같은데 알파벳 o의 자리가 5가 아니라 6으로 나왔다.

다른건 다 괜찮은데 왜 이것만 다르게 나올까 싶었는데 baekjoon이라는 알파벳에서 o가 중복이 되어 있어

제일 마지막에 위치한 o의 인덱스가 배열값으로 들어갔던 것이다. 따라서 제일 처음에 등장한 위치인 5번째가 아닌 6번째가 되었다.

처음 등장하는 위치를 알아내는것이 문제의 요구사항이기 때문에 코드를 수정해야만 했다.

다른 방법도 있겠으나 나는 단순히 for문에서 i의 초기값을 문자열의 크기+1로 시작, 0까지 반복하는것으로 바꿨다.

for (int i = S.length() - 1; i >= 0; i--) {  //헷갈리지말자 문자열길이는 .length(), 배열길이는 .length (이건 괄호없음)
    //배열의 0번째부터 a를 나타내고, 해당 자리에 index를 할당
    alpNum = S.charAt(i) - 97;  //문자열의 맨 앞의 문자에서 97을 빼면 해당하는 순번의 배열 번호이다
    alpIndex[alpNum] = i;
}

요렇게

그러면 문자열 뒤에서부터 앞에로 순서가 가기 때문에 결과적으로 가장 앞에 나타난 문자의 순서가 기록되게 된다.

 

또는 for문을 그렇게 수정하는 대신 for문 내부에 if문으로 alpIndex의값이 ==-1일때에만 배열에 값이 들어가도록

조건을 추가하는 방법도 있겠다.

앗 근데 까먹고 반영하지 않은 문제 요구조건이 있다..

단어의 길이는 100을 넘지 않으며...

자바에서는 문자열을 string으로 받을수밖에 없는데 이걸 어떻게 100으로 제한하지?의문이 든다.다른 사람의 자바 코드를 봐도 해당 부분에 대한 답을 얻진 못했다.패스..

 

자바를 사용해서 푼 다른 사람의 코드를 보다가 깜짝 놀랐다.

코드가 엄청 간단했다..한 5줄 됐나?

핵심은 indexOf라는 함수였다. 대충 해당 문자의 인덱스를 찾아서 반환해주는 함수구나..하긴 했는데

없을경우 -1이 나오도록은 어떻게 한건지 의문이었다.

찾아보니

indexOf() 는 특정 문자나 문자열이 앞에서부터 처음 발견되는 인덱스를 반환하며 찾지 못했을 경우 -1을 반환한다.

라고 한다..와우

그 사람의 코드를 보니 indexOf() 괄호안에 97 ~ 122의 숫자가 차례로 들어가 찾도록 해놨던데

그러면 그 숫자가 char로 알아서 변환되어서 string의 문자 하나하나와 비교가 되는건가...??

indexOf(int ch) : 유니코드표의 값을 사용, 원하는 문자의 위치를 찾는다.

그런가보다.. 앞으로 유용하게 잘 써봐야겠다.