백준 1475 - 방 번호 (java)

J·2022년 9월 10일
0

알고리즘 문제풀이

목록 보기
1/21

문제 정리


방 번호를 0, 1, 2, 3, 4, 5, 6, 7, 8, 9로 표현하려고 한다
0~9가 한 세트이고 6과 9는 돌려서 사용할 수 있다

주어진 방 번호를 최소한의 숫자 세트를 이용해서 표현하는것이 이 문제의 목표이다

입력

방 번호

출력

숫자를 만드는 최소한의 숫자 세트 수

idea 정리


각 숫자의 사용 횟수중 최대값 == 필요한 최소한의 숫자 세트 수
6,9는 합쳐서 카운팅해 주는것이 필요하다

6, 9의 개수가 나올 수 있는 경우는
1. 둘 다 짝수 개수
2. 둘 다 홀수 개수
3. 둘 중 하나만 홀수 개수

인데 1, 2는 둘을 합치면 짝수가 되고
3은 결국 홀수가 되니
짝수가 되는 경우와 홀수가 되는 경우로 나눌 수 있다

분기점을 나누지 않고 한꺼번에 표현하려면
나누기 연산과 나머지 연산을 같이 써주면 해결 가능하다

6, 9를 만들기 위한 최소 세트 수 = (6cnt + 9cnt)/2 + (6cnt + 9cnt)%2

알고리즘 구성


  1. 필요한 숫자의 개수를 배열에 카운팅
  2. 6과 9의 카운팅은 나누기 연산과 나머지 연산을 이용해 6에 몰아준다
  3. 배열에 저장된 최대값을 구한다

구현


//방 번호
public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		String input = br.readLine();
		int[] numCnt = new int[10];		//0~9
		
		for(int i=0,size=input.length(); i<size; i++) {
			int value = input.charAt(i)-'0';
			numCnt[value]++;      //숫자를 몇번 쓰는지 카운팅
		}
		
		int sixNineSum = numCnt[6] + numCnt[9];
		numCnt[9] = 0;    //6에다 몰아줄거니 9는 초기화
		sixNineSum = sixNineSum/2 + sixNineSum%2;    //6, 9를 한번에 표시
		numCnt[6] = sixNineSum;
		
		int max = Integer.MIN_VALUE;
		
		for(int i=0; i<10; i++) {
			if(max < numCnt[i]) {         
				max = numCnt[i];      //배열의 max값이 최소 세트 수
			}
		}
		
		bw.write(max + "");
		bw.flush();
		bw.close();
		br.close();
	}
}

결과


0개의 댓글