본문 바로가기
CS/알고리즘

[코드트리 novice mid] 완전탐색 - 숫자 카운트

by alphaca202 2023. 11. 12.

* 자리마다 숫자를 정하는 완전탐색

 

<내 풀이법>

1. 전체 숫자를 다 돌면서 카운트를 기록

2. 기록한 카운트 중에 정답 카운트랑 맞는 숫자 딕셔너리에 기록

3. 딕셔너리 카운트가 n인 숫자만 고르기

 

<중간에 헤맨 이유>

1. 카운트 세는 조건문 설정을 잘못함. 

- c1, c2를 바꿔서 카운트 함. 

- k 일 때 if b_arr.index(k) == 1이라고 잘못 입력해서 잘못 카운트함

 

2. 마지막에 n_arr 가 4일때를 세라고 해서 틀림

# 입력
n = int(input())

def check(i, j, k, b_arr):
    c1 = 0
    c2 = 0
    if i in b_arr:
        if b_arr.index(i) == 0:
            c1 += 1
        else:
            c2 += 1
    if j in b_arr:
        if b_arr.index(j) == 1:
            c1 += 1
        else:
            c2 += 1
    if k in b_arr:
        if b_arr.index(k) == 2:
            c1 += 1
        else:
            c2 += 1
    return c1, c2



n_arr = {}
for _ in range(n):
    b, a1, a2 = tuple(map(int, input().split()))
    b_arr = list(map(int, list(str(b))))
    for i in range(1, 10):
        for j in range(1, 10):
            for k in range(1, 10):
                if i != j and j != k and k != i:
                    c1, c2 = check(i, j, k, b_arr)
                    if c1 == a1 and c2 == a2:
                        num = ''.join(list(map(str, [i, j, k])))
                        if num in n_arr:
                            n_arr[num] += 1
                        else:
                            n_arr[num] = 1


cnt = 0
for key in n_arr:
    if n_arr[key] == n:
        cnt += 1

print(cnt)

 

<더 좋은 코드를 위해>

딕셔너리를 따로 만들 필요 없이 바로바로 체크하도록 하면 메모리랑 시간을 아낄 수 있다. 

# 변수 선언 및 입력
n = int(input())
arr = [
	tuple(map(int, input().split()))
	for _ in range(n)
]

# 모든 숫자를 다 만들어 봅니다. (백의 자리수가 i, 십의 자리수가 j, 일의 자리수가 k)
cnt = 0
for i in range(1, 10):
	for j in range(1, 10):
		for k in range(1, 10):
			# 같은 수가 있는지 확인합니다.
			if i == j or j == k or k == i:
				continue
			
			# 해당 숫자가 정답일때, 모든 입력에 대해 올바른 답이 나왔는지 확인합니다.
			successed = True
			for a, num_cnt1, num_cnt2 in arr: # n개의 입력된 숫자에 대해서 
				# x : a[q]의 백의 자릿수, y : 십의 자릿수, z : 일의 자릿수
				x = a // 100
				y = a // 10 % 10
				z = a % 10
				
				# cnt1 : 1번 카운트, cnt2 : 2번 카운트
				cnt1 = 0
				cnt2 = 0
				if x == i:
					cnt1 += 1
				if y == j:
					cnt1 += 1
				if z == k:
					cnt1 += 1
				if x == j or x == k:
					cnt2 += 1
				if y == i or y == k:
					cnt2 += 1
				if z == i or z == j:
					cnt2 += 1

				# 만약 카운트 수가 다르다면 해당 숫자는 정답이 될 수 없습니다.
				if cnt1 != num_cnt1 or cnt2 != num_cnt2:
					successed = False
					break # 정답이 될 수 없으니 그냥 break
			
			if successed: # n개가 다 통과라면 cnt += 1
				cnt += 1
    
print(cnt)