문제

알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.

출력

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, … z가 처음 등장하는 위치를 공백으로 구분해서 출력한다.

만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다. 단어의 첫 번째 글자는 0번째 위치이고, 두 번째 글자는 1번째 위치이다.

내가 생각한 풀이

package if02;

import java.util.Scanner;

public class five {
	public static void main (String[] args) {
			
		Scanner scan = new Scanner(System.in);
		String str = scan.nextLine();
		
		//입력한 문자열를 문자별로 배열화 함
		char[] ch =  new char[str.length()];
		for(int i=0; i<ch.length; i++) {
			ch[i] = str.charAt(i);
		}
		
		//소문자 아스키코드 97~122 반복
		for(int i=97; i<=122; i++) {
			int count = 0;

			for(int j=0; j<ch.length; j++) {
				//문자열배열중에 일치하는 알파벳 있으면 자릿수 출력
				if(((char)i)==ch[j]) {
					System.out.print(j+" ");
				} else {
					++count;
					//26번(알파벳)돌동안 없으면 -1 출력
					if(count==ch.length) {
						System.out.print("-1 ");
					}
				}
			}
		}
		
	}
}

정석 풀이

위와 같이 풀이 해 동일한 정답이 나오도록 구현하기는 하였으나
여러가지 면에서 비효율적이고 좋지않은 코드임이 느껴져 다른 사람들의 풀이를 확인했고
역시나 먼 길을 돌았음을 느꼈다.
이에 공부한 코드를 추가로 첨부한다.

package if02;

import java.util.Scanner;

public class Main {
	public static void main (String[] args) {
		
		//알파벳 26자리를 먼저 -1로 셋팅
		int[] alp = new int[26];
		for(int i=0; i<alp.length; i++) {
			alp[i] = -1;
		}
		
		Scanner scan = new Scanner(System.in);
		String str = scan.nextLine();
		
		//문자열을 문자별로 나눔
		for(int i=0; i<str.length(); i++) {
			char ch = str.charAt(i);
			
			// 문자의 셋팅값이 -1일때만(첫단어일때만)
			if(alp[ch-'a']==-1) {
				// 자릿수로 바꿈
				alp[ch-'a'] = i;
			} 
			
			/* 
			알파벳 26개를 0부터 시작하는 배열에 담아두었기에
			97(a)를 빼면 현 문자가 어느 알파벳배열에 담겼는지 알수있음
			*/   
		}
		
		for(int num : alp) {
			System.out.print(num+" ");
		}
		
	}
}

Updated: