Seungyeon.Jung 2023. 10. 12. 23:02

아직 아스키 코드값을 매치하는게 잘 되지 않는다.

더보기
아스키 코드를 좀 더 제대로 이해할 필요가 있다.

덕분에 'counts[alphabet - 'a']++;' 를 이해하는데 조금 시간이 오래 걸린 것 같다.

아무튼 이해는 됐는데... 첫 번째 시도는 a~z 를 한번 비교한 뒤, A~Z를 비교해서 else if 문이 쓰였다.

참고로 char는 문자 데이터 유형을 나타내는데... 데이터 유형의 종류에 대해 알아둬야 할 것 같다.

package Assignment;

public class Training_1012_5 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// 기존의 과제물을 응용해서 알파벳 대소문자를 구분하지 않고 a 부터 z 까지 for 문을 응용해 개수를 구해보자.
		// a부터 z까지 하나하나 지정할 수도 있지만 효율이 좋지 않다.
		// 아스키 코드를 이용해서 자동으로 a~z까지 개수를 구하게 끔 해보자... 
		
		String little = "Once when I was six years old I saw a magnificent picture in a book,"
		+ "called True Stories from Nature, about the primeval forest."
		+ "nIt was a picture of a boa constrictor in the act of swallowing an animal. Here is a copy of the drawing. ";
		
		int[] counts = new int[26]; // a~z까지 알파벳을 저장할 배열 
		
		for (int i = 0; i < little.length(); i++) { 
			char alphabet = little.charAt(i);
			// little.length() 을 통해 String little 의 문장을 읽어들임.
			// i 를 0으로 초기화 한 뒤, 읽어들인 문장을 i에 부여함
			// 문장의 길이만큼 반복... 반복하는 이유는 문자열의 문자에 하나씩 접근하기 위함
			// 읽어들인 문자를 변수 alphabet 에 할당 
			
			if (alphabet >= 'a' && alphabet <= 'z') {
				// if문을 이용해서 alphabet에 할당된 소문자 a~z를 확인

			counts[alphabet - 'a']++; 
			//알파벳 배열에서 소문자 아스키 a 코드값을 빼고, 알파벳 갯수 카운팅을 위해 counts (알파벳을 저장한 배열) 에 1씩 증가
			// 입력된 문자열에서 'a'가 1번 나타난 경우, 'counts' 배열의 0번 인덱스 값을 증가한다.

			// counts[0]++ 은 a 를 1번 증가함을 의미, counts[1]++ 은 b를 1번 증가함을 의미... 
			// 'alphabet - 'a' 는 검사중인 문자 alphabet 의 아스키 코드값에서 'a'의 아스키 코드값을 뺌. 
			
			// 만약 a 알파벳 개수를 셀 경우, a의 아스키 코드값은 97 이므로 [alphabet - 97]이 되고 이는 a를 의미함.
			// 즉 counts[alphabet - 97]++ 는 counts 배열에 저장된 a를 1 증가함을 의미.

			} else if (alphabet >= 'A' && alphabet <= 'Z') { 
				//if에 해당되지 않는 나머지 (대문자)를 판별, alphabet에 할당된 A~Z를 확인
				
			counts[alphabet - 'A']++; 
			//알파벳 배열에서 대문자 아스키 A 코드값을 뺀 뒤 counts (알파벳을 저장한 배열) 에 1씩 증가
			}
			}
			for (int i = 0; i < 26; i++) { //알파벳은 26개이므로 26번 반복
			char letter = (char) ('a' + i); // 아스키 a 코드 값에 i를 더한 뒤 char 형식으로 변환, letter에 저장
			System.out.println(letter + " 는 ... " + counts[i] + " 개"); //개수 출력 
			}
		}
	}

불필요한 설명은 모두 빼고, A~z 까지 한꺼번에 비교해볼 수 있도록 좀 더 수정해봤다.

왜인지 오류가 뜬다. 왜 오류인지는 모르겠다... 위에꺼는 되는데 아래꺼는 안 된다... 왜일까?? 

package Assignment;

public class Training_1012_5 {

	public static void main(String[] args) {
	String little = "Once when I was six years old I saw a magnificent picture in a book,"
	+ "called True Stories from Nature, about the primeval forest."
	+ "nIt was a picture of a boa constrictor in the act of swallowing an animal. Here is a copy of the drawing. ";
    
		int[] counts = new int[26]; 
		for (int i = 0; i < little.length(); i++) { 
		char alphabet = little.charAt(i);
        
		if ((alphabet >= 'a' && alphabet <= 'z') || (alphabet >= 'A' && alphabet <= 'Z')) {
			counts[alphabet - 'a']++; 
			} 
		}
		for (int i = 0; i < 26; i++) { 
			char letter = (char) ('a' + i); 
			System.out.println(letter + " 는 ... " + counts[i] + " 개"); 
		}
	}
}

구글링과 인공지능의 도움을 받아서 해결했다.

counts 배열의 인덱스를 계산할 때, 음수 값이 나타나서 배열의 범위를 벗어나 오류가 일어났었다.

package Assignment;

public class Training_1012_6 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		String little = "Once when I was six years old I saw a magnificent picture in a book,"
				+ "called True Stories from Nature, about the primeval forest."
				+ "nIt was a picture of a boa constrictor in the act of swallowing an animal. Here is a copy of the drawing. ";
		
		int[] counts = new int[52]; // 대문자와 소문자 알파벳을 모두 저장할 배열
		
		for (int i = 0; i < little.length(); i++) { 
		    char alphabet = little.charAt(i);
		    
		    if ((alphabet >= 'a' && alphabet <= 'z') || (alphabet >= 'A' && alphabet <= 'Z')) {
		        if (alphabet >= 'a' && alphabet <= 'z') {
		            counts[alphabet - 'a']++; // 소문자 알파벳
		        } else {
		            counts[alphabet - 'A' + 26]++; // 대문자 알파벳
		        }
		    }
		}
		for (int i = 0; i < 26; i++) { //알파벳은 26개이므로 26번 반복
            char letter = (char) ('a' + i); // 아스키 a 코드 값에 i를 더한 뒤 char 형식으로 변환, letter에 저장
            System.out.println(letter + " 는 ... " + counts[i] + " 개"); //개수 출력
		}
	}
}

 

if ((alphabet >= 'a' && alphabet <= 'z') || (alphabet >= 'A' && alphabet <= 'Z')) 을 통해 알파벳을 확인을 했지만, 
counts[alphabet - 'a']++; 에서 배열의 인덱스를 계산할 때 음수값이 나타나 배열의 범위를 벗어나 오류가 일어났었다... 잘 이해가 되지 않지만 인덱스 계산 부분이 문제였음.

인덱스를 계산하는 부분을 소문자와 대문자 알파벳을 따로 구분해서 계산할 수 있도록 했을 때 문제없이 해결 되었다. 대문자 인덱스를 계산할 때  26을 붙이는 이유는 26 부터 51까지의 범위를 사용하기 때문. 

 

좀 더 심도 깊게 이해를 하기 위해... 주말을 투자하기로 했다.

 

헤멘것에 비해 결과물은 똑같다.