백준[1157] 알파벳개수의 최대값(Java) {상세 알고리즘}
2023. 3. 30. 02:30ㆍ백준문제풀이
문법하나하나 상세하게 정리한 공부과정을 그대로기술했다.
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오
대소문자 구분 x
의사코드 :
1. 알파벳 대소문자 구분없이 입력
2. for문을 돌면서 배열안에 각각 알파벳의 인덱스 를 반환(getAlphabetCount 함수 선언으로 이용 )
3. 그 각각의 갯수를 카운트하고(count) = > 각각의 알파벳변수
4.가장 많이 사용된 변수 (maxCount)를 반환해서 대문자로 출력
public class Main {
public static int[] getAlphabetCount(String str){
int[] count = new int [26]; //알파벳 26개를 입력받게됨 count 배열안에 집어넣는다
//★★★ 키포인트 : 입력받은 알파벳을 반환하는 코드 ★★★★
for( int i = 0; i <str.length(); i++){ //str로 입력받은 변수의 길이만큼 ,
char ch = str.charAt(i); //하나의 문자열 입력받음 str로 선언후 문자 ch 에 입력 시킴
if( 'A'<= ch &&ch <= 'Z'){ //만약 대문자 A~Z 값을 동시에 만족 시키면 ,
count[ch-'A']++; // 대문자를 반환 입력받은 ch에서 대문자 A를 뺀값 , 입력받은 해당문자 카운트
}else count[ ch - 'a']++; // 소문자를 반환 입력받은 ch에서 소문자 a를 뺀값 , 입력받은 해당문자 카운트
}
return count; //카운트배열을 반환 => String str로 받은값 count로 반환 => 알파벳(26개 중한개)
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// String str = sc.next().toUpperCase(); // 소문자들을 대문자로 바꾼 형태로 출력
String str = sc.next(); // 여기 변수 a 에 알파벳을 대소문자구분없이 입력받게됨
int [] count = getAlphabetCount(str); // 정수형배열 count 선언 , 오른쪽에있는 함수를 통해 반환된 count(알파벳의갯수) 를
//배열로 선언후 집어넣음
for (int i = 0; i < 26; i++) { //알파벳중에 ,
if(count[i]>0 ) { // 알파벳 배열의 갯수가 1이상 나오면, ( 입력한숫자 = 1이상나오게됨)
System.out.println((char) ('A' + i) + ": " + count[i]); //해당문자의 갯수 출력
}
}
//키포인트 ★★★
// "?" 로 maxCountValue(가장많은 알파벳)을 미리설정해놓고 조건을건뒤 maxCountValue가 바뀌게되면 maxCountValue를 재정의함으로써 대문자,소문자등으로출력
// 대문자, 소문자등으로 출력할때 자주쓰는 구문
// maxCountValue= (char)('A'+i); "A부터시작해서 0씩늘려가며 대문자로전환" 을 형변환하면 결국에 그숫자에맞는 대문자가됨
int maxCount=-1; // -1로 선언한 이유 : 최대값을 갱신할떄 아무문제가없음, max count 변수의역할: 알파벳의 최대갯수, 최소한번은 갱신이됨
char maxCountValue ='?'; //maxcount를 처음부터 '?' 로 설정한뒤에 , maxcount를 숫자로표현할때만 (char) 형변환해서 'A' + i 해서 사용
for(int i = 0; i<26;i++){ //카운트배열= 26까지있음 count의[i]에 대해서 가장큰알파벳보다 큰지 비교를진행 = 최대값을 구할 수 있음(갱신되는값)
if(count[i]>maxCount){ //이때까지(새로) 입력받은 배열 > 가장 많이 카운트된 배열 라면,
maxCount = count[i]; // 새로 입력받은 배열이 가장많이 카운트된 배열보다 커지기때문에 갱신시킴 count[i] > maxCount
maxCountValue= (char)('A'+i); // 새로갱신될때마다 정수로 선언된 맥스카운트를 해당 알파벳으로 변형
}else if ( count[i]== maxCountValue){ //알파벳(26개 중한개) 가 만약 가장큰 갯수 와 같다면 가장큰 갯수 = '?' 가 됨
maxCountValue = '?';
}
}
System.out.println((char)(maxCountValue)); // 대문자A를 더하게되면 A로부터 maxCountValue만큼 떨어진(0~26) 알파벳이 출력됨
// char 형변환 해줘야 그값만큼 알파벳으로 출력
}
}
'백준문제풀이' 카테고리의 다른 글
백준 [18108] 서기년도 (Java) (0) | 2023.04.12 |
---|---|
백준 [10430] 나머지계산 (C++) (0) | 2023.04.12 |
백준 10171 고양이 (C언어) (2) | 2023.04.07 |
백준 1008번 문제 (C++) (0) | 2023.04.07 |
백준[1919] 애너그램 (Java) {상세 알고리즘} (0) | 2023.03.30 |