[BOJ] 차량 번호판1 - 16968번

이나영·2021년 11월 23일
0

알고리즘

목록 보기
1/17
post-thumbnail

🍭 "차량 번호판1" - 16968번 B1

🎃문제설명

상도시의 차량 번호판 형식이 주어졌을 때, 가능한 차량 번호판의 개수를 구해보자.

  • 번호판에 사용할 수 있는 숫자는 0, 1, 2, ..., 8, 9이다.
  • 사용할 수 있는 문자는 a, b, c, d, ..., y, z이다.
  • 차량 번호판의 형식은 최대 4글자이고, c와 d로 이루어진 문자열로 나타낼 수 있다.
  • c는 문자가 위치하는 자리, d는 숫자가 위치하는 자리이다.
  • 같은 문자 또는 숫자가 연속해서 2번 나타나면 안 된다.

예를 들어, 형식이 "cd"이면, a1, d4, h5, k4 등이 가능하다. 형식이 "dd"인 경우에 01, 10, 34, 69는 가능하지만, 00, 11, 55, 66은 같은 숫자가 2번 연속해서 불가능하다.

입력

첫째 줄에 차량 번호판의 형식이 주어진다. 형식은 길이가 4보다 작거나 같으며, c와 d로만 이루어져 있다.

출력

첫째 줄에 가능한 차량 번호판의 개수를 출력한다.

💾입출력 예

입력출력
dd90
cc650
dcdd23400

알고리즘 분류

  • 수학
  • 조합론
  • 브루트 포스

🌟문제 이해 및 풀이계획

✏️브론즈1이라 만만하게 보고 생각없이 풀었더니.. 못풀었다.. 난 수레기야ㅏ...
✏️(전체 모든 경우 수 - 중복되는 경우 수) 이렇게 접근해서 풀었고, 예제가 맞았길래 잘 풀었다고 생각했는데 cccc 인 경우에는 cc/cc, c/cc/c 와 같이 생각해야할 경우의 수가 많다는 것을 놓쳤다. 처음 생각했던 코드는 단순히 같은 문자or숫자가 나오면 *1을 해주고 넘어가는 식이었는데 완전 틀렸다. 결과도 틀림..
✏️결국 도저히 풀이가 떠오르지 않아 강의를 봤는데 내가 너무 전체에서 빼는 것에만 박혀 정말 단순하게 풀 수 있는 방법을 생각하지 못했다.


✍🏻내 코드1 - 오답코드

package BOJ;

import java.util.Scanner;

/*
 * 2021.11.23 daily algo/commit
 */

public class boj_16968 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String licenseNumber = sc.next();
		makePlate(licenseNumber);
		
		sc.close();
	}
	
	public static void makePlate(String licenseNumber) {
		char kind = licenseNumber.charAt(0);
		int total = 1;
		int same = 1;
		if(kind == 'c') { // 첫번째 자리
			total *= 26;
			same *= 26;
		}else {
			total *= 10;
			same *= 10;
		}
		
		for(int i=1; i<licenseNumber.length(); i++) {
			if(kind != licenseNumber.charAt(i)) {
				if(licenseNumber.charAt(i) == 'c') {
					same *= 26;
				}
				else {
					same *= 10;
				}
			}
			kind = licenseNumber.charAt(i);
			
			if(licenseNumber.charAt(i) == 'c') {
				total *= 26;
			}
			else {
				total *= 10;
			}
		}
		
		if(total == same) System.out.println(total);
		else System.out.println(total - same);
	}

}

✏️입력받은 번호판의 0번째 종류를 kind에 저장한 뒤 다음 순서가 같은지, 틀린지 / c인지 d인지 모든 경우를 따져서 경우의 수를 곱했다.


✍🏻내 코드2 - 정답코드

package BOJ;

import java.util.Scanner;

/*
 * 2021.11.23 daily algo/commit
 */

public class boj_16968 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String licenseNumber = sc.next();
		int answer = 1;
		
		char kind = licenseNumber.charAt(0);
		if(kind == 'c') {
			answer *= 26;
		}
		else {
			answer *= 10;
		}
		
		for(int i=1; i<licenseNumber.length(); i++) {
			if(kind == licenseNumber.charAt(i) && licenseNumber.charAt(i) == 'c') {
				answer *= 25;
			}
			else if(kind == licenseNumber.charAt(i) && licenseNumber.charAt(i) == 'd') {
				answer *= 9;
			}
			else if(kind != licenseNumber.charAt(i) && licenseNumber.charAt(i) == 'c') {
				answer *= 26;
			}
			else if(kind != licenseNumber.charAt(i) && licenseNumber.charAt(i) == 'd') {
				answer *= 10;
			}
			
			kind = licenseNumber.charAt(i);
		}
		
		System.out.println(answer);
		
		sc.close();
	}
}

강의내용

✔️index를 이용해서 이전 문자와 비교하는 것 같은데 소스코드 이해가 잘 안된다.. ㅠㅠ 열심히 이해해 봐야겠다..

  • 차랑 번호판 전부를 구해야 할 때 아래 코드를 이용한다. 하지만 전부를 구할 필요가 없으면 조합으로(위처럼) 간단하게 구하면 된다.

✔️삼항연산자는 잘 안쓰게 되는데 이용하면 코드의 길이를 줄일 수 있을 것 같다. 삼항연산자를 이용하는 습관을 길러야겠다.

char start = (s.charAt(index) == 'c' ? 'a' : '0');
char end = (s.charAt(index) == 'c' ? 'z' : '9');
profile
소통하는 백엔드 개발자로 성장하기

0개의 댓글