[백준] 10809번 : 알파벳 찾기 - JAVA(자바)

Life is ninanino·2022년 11월 9일
0

[백준] JAVA

목록 보기
32/37
post-thumbnail

https://www.acmicpc.net/problem/10809


입력한 단어에 포함되어 있는 경우에는 처음 등장하는 위치
포함되어 있지 않은 경우에는 -1를 출력하라고 한다
알파벳 소문자는 a부터 z까지 있다.
이것들이 처음 등장하는 위치를 공백으로 구분해서 출력하라고 되어 있다.
단어의 첫 번째 글자는 0번째 위치, 두 번째 글자는 1번째 위치로 출력한다
b 0번째기 때문에 0, a는 1번째, c는 포함 되어 있지 않기 때문에 -1, d도 -1,
e는 세 번째기 때문에 2, f,g,h,i 는 -1를 리턴한다
j는 4번째, k 3번째 ,l,m는 -1,n는 7번째, o는 5번째에 나타난다
p,q,r,s,t,u,v,w,x,y,z는 없으므로 -1을 출력한다

b가 1이고 a가 0이야? 라고 하면 헷갈릴 수 있는데
출력값은 입력한 문자열의 알파벳의 위치를 나타내는 것이다.
a,b,c, ... , x,y,z 를 순서대로 놨을때
배열은 0번부터 시작하기 때문에 a는 1, b는 0이 출력되는 것이다

더 그리기 귀찮아서 예시로 몇가지만 그렸다. 문자열에 포함되어 있지 않으면 그 자리에 -1를 출력한다.

내가 헷갈렸던 이유는 이전에 연습용으로 풀었던 문제에서
배열에 알파벳을 담는 문제였다.

package main.week2;// @ author ninaaano

public class mission2_1 {
    public static void main(String[] args) {
        // 문자 배열을 만들어 A-Z 까지 배열에 저장하고 이를 다시 출력하기
        // 아스키 65번부터 90번까지

        char[] charArr = new char[26];
        for(int i=0; i<charArr.length; i++){
            charArr[i]= (char) (65+i);
        }
        for(int i=0;i <charArr.length; i++){
            System.out.print(charArr[i]);
        }

    }
}

이 문제를 활용해서 맨 처음엔 똑같이 배열에 알파벳을 넣고 비교를 하면 되지 않을까?해서 charArr == 입력받은 문자열을 비교하고 맞으면 i, 아니면 -1를 출력하라했더니 전부 -1이 출력이 되었다. 배열과 입력값의 비교를 어떻게 할지 고민하다가 char형으로 선언되어있던 배열을 int로 변경하고 내용물을 전부 -1로 초기화했다.

++정답코드

package 백준;// @ author ninaaano

import java.util.Scanner;

// baekjoon

public class b_10809 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String userInput = sc.nextLine();

        int[] charArr = new int[26];

        for(int i=0; i<charArr.length; i++){
            charArr[i]= -1;
        }

        for(int i = 0; i<userInput.length(); i++){
            char c = userInput.charAt(i);

            if(charArr[c-97] == -1){
                charArr[c-97] = i;
            }
        }
        for (int index : charArr){
            System.out.print(index+" ");
        }

    }
}

String으로 입력받은 userInput값을 char형으로 변환해주는데 charAt()을 사용했다.
charAt은 ()안에 숫자를 넣어줘야하는데
for문의 바깥에서 숫자를 지정해버리면 한글자만 저장이 되기 때문에
for문으로 입력받은 userInput의 길이만큼 검사를 하면 된다.
char형을 int타입 변수에 넣게되면 문자와 대응되는 아스키코드 값으로 저장된다.
charArr는 int타입의 배열이기 때문에 ch는 아스키코드로 들어간다.
알파벳 a는 97이므로 c에서 97을 빼주면 i의 값을 찾을 수 있다.
출력할 때 별 생각없이 charArr를 출력해주고 정답으로 입력했는데
출력형식이 [ ]이 아니라 공백이 있는 출력 형식이여서 int 변수에 배열의 값을 담아주고 출력했다.


좀 더 간단하게 문제를 해결하는 방법도 있다.
for문은 거의 int i=0; 부터 시작해서 길이만큼 증가시키거나 감소시키는 방법이 있는데, for문엔 char형도 담을 수 있다.

++정답코드2

package 백준;// @ author ninaaano

import java.util.Scanner;

public class b_10809 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String userInput = sc.nextLine();

        for(char i = 'a'; i<='z'; i++){
            System.out.print(userInput.indexOf(i)+" ");
        }
    }
}

char i의 값을 a부터 z까지 순회한다.
이때 indexOf를 사용해서 userInput값에 char로 입력받은 i의 값이 있는지 확인하면 된다.

indexOf(String str)
문자열 중 입력받은 문자가 있으면 해당 문자 위치 (Index) 값을 리턴하고 문자가 없으면 -1을 리턴한다. 문자열 조회는 0부터 시작한다
참고 : https://jamesdreaming.tistory.com/82

굉장히 간단하게 문제를 풀 수 있다.

profile
백엔드 프로그래밍을 공부하고 있습니다. AWS, 클라우드 환경에 대해 관심이 많습니다.

0개의 댓글