(백준)10809번 알파벳 찾기 풀기

DevSeoRex·2022년 12월 7일
0
post-thumbnail

오늘 푼 문제의 요지는, 문자열을 입력받고, 문자열의 각자리가 a~z까지 어느 곳에 속하는지, 또 속한다면 몇번째 자리에 위치해 있는지를 출력하는 문제이다.

Step1. Scanner 생성과 알파벳을 배열에 담기

가장 먼저 든 생각이 문자열을 입력받아서, String 클래스의 charAt() 메서드를 이용하면, 문자열을 한자리씩 잘라서 char형으로 서로 비교하는 것이기 때문에 a부터 z까지의 알파벳을 char 배열인 arr에 담아주었다.

Scanner sc = new Scanner(System.in);
		char[] arr = { 'a', 'b', 'c', 'd', 'e', 
        'f', 'g', 
        'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 
        'p', 'q', 'r', 's',
				't', 'u', 'v', 'w', 'x', 'y', 'z' };

Step2. 결과로 출력된 문자열을 계속 누적할 result를 초기화하고, 같은 값이 나온적이 있는지 여부를 검사해줄 boolean 배열을 선언하기

boolean[] boolArr = new boolean[26];
String[] result = new String[26];

일치하는 위치가 있다면 인덱스를 출력하고, 없다면 -1을 출력해야 하는데 결과를 계속 출력한다면,
만약 7자리 문자열을 비교하면 총 비교횟수는 26 x7 = 189번 반복해야 한다.
그렇다면 중복도 생길 수 있고 문자열이 같은 알파벳으로 이어져 있는 경우 예)baekjoon('o'가 두개 이어짐)에 혼선을 빚을수가 있다.
따라서 알파벳마다 같은 값이 나온적이 있는지를 기록할 boolean 타입의 boolArr 배열을 선언하고,
알파벳마다 결과값을 문자열로 저장할 배열 result를 선언하였다.

Step3. result배열과 boolArr배열에 기본 값 담기

아까 예를 든것과 같이 baekjoon 처럼 중복된 문자가 연속된다면, 'o'가 인덱스 0부터 시작하면 5가 반환되어야 하는데 5가 입력된 상태로, 다음 문자인 o를 검사하면 5가 6으로 바뀌게 된다.

따라서 boolean 값을 줘서, boolean 값이 false일때만 result에 결과를 담고 아니면 넘어가게 해서 해당 문자가 나온 가장 첫번째 인덱스만 담게 하였다.

result에는 "-1 "을 기본값으로 줘서, 값이 같은 경우의 수가 나올때만 인덱스 값으로 덮어쓰도록 작성하였다.

맞으면 인덱스를, 틀리면 -1을 일일이 입력해서 if~else로 구현하였더니, 맨 마지막 인덱스 기준에서는 해당 문자를 제외하고, 아까 일치했던 문자의 인덱스까지 -1로 덮어써버리는 부작용이 있었기 때문이다.

for (int i = 0; i < result.length; i++) {
			result[i] = "-1 ";
			boolArr[i] = false;
		}

Step4. 값을 검사하여 result에 값을 담기

for (int i = 0; i < str.length(); i++) {
		for (int j = 0; j < arr.length; j++) {	
			if(str.charAt(i) == arr[j] && boolArr[j] == false) {
				result[j] = (i + "") + " ";
				boolArr[j] = true;
				}					
			}
		}

입력받은 문자열의 길이만큼 for문을 반복하고, 해당 for문 안에서 알파벳의 개수 (26) 만큼 이중 for문으로 반복을 해준다.
조건은 str.charAt(i) == arr[j] && boolArr[j] == false 일때 값을 바꾸도록 하였다. 이것을 풀이하면,
문자열을 한자리씩 잘라서 만든 char배열의 특정 인덱스에 있는 문자와 알파벳 배열 arr에 있는 문자와 일치하고, 한번도 일치한 적이 없고 이번에 처음 일치한 값에 대해서 result에 인덱스인 i값을 담아준다.

값을 담을때는 i는 숫자이므로 "" 문자열과 더해주고, 한칸씩 띄어서 출력하여야 하므로, "i " 와 같이 값이 들어가게 하였다.

Step5. 출력

result에 담긴 결과값들을 for문으로 하나씩 뽑아내어 출력해준다. 한줄로 나란히 출력해야 하므로,
println() 대신 print()를 사용하였다.

for (int i = 0; i < result.length; i++) {
			System.out.print(result[i]);
		}

전체 코드

package Ch9;

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		char[] arr = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
				't', 'u', 'v', 'w', 'x', 'y', 'z' };
		boolean[] boolArr = new boolean[26];
		String[] result = new String[26];
		String str = sc.next();
		for (int i = 0; i < result.length; i++) {
			result[i] = "-1 ";
			boolArr[i] = false;
		}
		for (int i = 0; i < str.length(); i++) {
			for (int j = 0; j < arr.length; j++) {
				if (str.charAt(i) == arr[j] && boolArr[j] == false) {
					result[j] = (i + "") + " ";
					boolArr[j] = true;
				}

			}
		}

		for (int i = 0; i < result.length; i++) {
			System.out.print(result[i]);
		}
	}

}

0개의 댓글