1157번: 단어 공부
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
www.acmicpc.net
알파벳이 대소문자로 이루어져있고 가장 많이 나온 글자를 출력하는 문제이다.
배열의 인덱스가 대문자의 아스키코드가 된다면 글자가 몇개가 나올지를 배열에 넣을 수 있을것이다.
즉, 예를 들어 s라는 배열이 있고 단어에 a가 2개가 나왔다면 s[65]==2가 된다.
배열의 인덱스를 대문자로 만들기 위해서 입력받은 문자열에 대해 toupper함수를 사용하면 된다.
주의해야 될것이 있다.
처음에 문제를 풀 때 for문에서 조건부분에 strlen(str)을 썼다. 그랬더니 시간초과가 발생하였다.
시간초과가 발생하는 이유는 strlen함수가 길이가 n인 배열의 길이를 구할때 n번 돌아가면서 길이를 구해내야해서 for문을 도는것까지 가정하면 n제곱이 되어서 시간초과가 나는것이다.
따라서 시간초과를 방지하기 위해 for문 전에 변수에 strlen(str)을 넣는다.
최종코드는 다음과 같다.
배열을 두개 사용하였다. 하나는 문자열을 입력받을 배열, 하나는 문자의 개수를 counting할 배열.
문자의 개수를 카운팅할 배열(s)는 대문자의 아스키코드가 인덱스가 되기 때문에 크기를 91로 설정하였다.
max에는 많이 나온 글자의 개수, chr에는 그 글자의 아스키 코드가 들어간다.
글자의 개수가 같은 경우(최대의 글자수라는 가정하에)에는 ?를 출력해야 된다. 따라서 max와 같다면 chr에 ?의 아스키 코드 63을 넣는다.