-
231012_JAVAIndividual Learning/Java 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까지의 범위를 사용하기 때문.
좀 더 심도 깊게 이해를 하기 위해... 주말을 투자하기로 했다.
헤멘것에 비해 결과물은 똑같다.
'Individual Learning > Java' 카테고리의 다른 글
231024_Java 7장 (0) 2023.10.24 231021_Java 6장 (0) 2023.10.22 231012_Java예제 (0) 2023.10.17 231002_Java (0) 2023.10.17 231012_Java 10.11 과제물 보충 (0) 2023.10.12