[백준 C언어] 1475. 방 번호
문제
다솜이는 은진이의 옆집에 새로 이사왔다. 다솜이는 자기 방 번호를 예쁜 플라스틱 숫자로 문에 붙이려고 한다.
다솜이의 옆집에서는 플라스틱 숫자를 한 세트로 판다. 한 세트에는 0번부터 9번까지 숫자가 하나씩 들어있다. 다솜이의 방 번호가 주어졌을 때, 필요한 세트의 개수의 최솟값을 출력하시오. (6은 9를 뒤집어서 이용할 수 있고, 9는 6을 뒤집어서 이용할 수 있다.)
입력
첫째 줄에 다솜이의 방 번호 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수이다.
출력
첫째 줄에 필요한 세트의 개수를 출력한다.

나의 풀이
#include <stdio.h>
int main(void) {
char c;
int arr[10] = { 0 }, max = 0;
while (1) { //방 번호 입력
c = getchar();
if (c =='\n') break;
arr[c - '0']++;
}
//6번, 9번 처리
arr[6] = (arr[6] + arr[9]) % 2 == 0 ? (arr[6] + arr[9])/2 : (arr[6] + arr[9]) / 2 + 1;
arr[9] = 0
for (int i = 0; i < 10; i++) {
if (max < arr[i]) max = arr[i];
}
printf("%d", max);
return 0;
}
입력받은 문자열을 그대로 저장할 필요가 없을 경우
나는 getchar()를 많이 이용한다.
getchar()는 키보드 입력을 한 글자씩 char형태로 가져오는 함수인데
특히 요소별 빈도를 카운트할 때, 출현할 수 있는 요소의 범위를 배열의 크기로 지정해주고
getchar로 받아올 적에 바로 아스키 코드로 변환해버리면 코드가 매우 간편해진다.
같은 맥락에서, arr의 크기를 10으로 선언한 것은
출현할 수 있는 방 번호가 0~9의 범위, 즉 10개 숫자 내에서 나오기 때문이다.
c=getchar();
arr[c-'0']++;
위 코드는 getchar()로 입력받은 char의 개수를 c에 저장하고,
char 형태로 불러온 입력값을 정수로 변환해주기 위해 '0'을 빼준 것이다.
만약 '0'이 입력되었을 경우, getchar는 입력값을 무조건 char형으로 받아오기 때문에
c에는 정수 0이 아닌 문자 '0'의 값(아스키코드 48)이 저장된다.
이를 정수형으로 저장하기 위해 '0'을 빼주는 것이다.
읽어오는 문자가 0일 때마다 arr[c-'0']이 +1되므로
입력이 끝날 때까지 빈도를 누적할 수 있다.
숫자 6, 9는 서로 호환되므로 그에 대한 처리로
6이 사용될 횟수와 9가 사용될 횟수를 더해서 2로 나누어주고, 소숫점이 남았을 때는 올림 처리해준 후
제일 출현 빈도가 높은 숫자의 빈도를 출력하면 끝.