티스토리 뷰
숫자 야구
문제 설명
숫자 야구 게임이란 2명이 서로가 생각한 숫자를 맞추는 게임입니다.
각자 서로 다른 1~9까지 3자리 임의의 숫자를 정한 뒤 서로에게 3자리의 숫자를 불러서 결과를 확인합니다. 그리고 그 결과를 토대로 상대가 정한 숫자를 예상한 뒤 맞힙니다.
* 숫자는 맞지만, 위치가 틀렸을 때는 볼 * 숫자와 위치가 모두 맞을 때는 스트라이크 * 숫자와 위치가 모두 틀렸을 때는 아웃
예를 들어, 아래의 경우가 있으면
A : 123 B : 1스트라이크 1볼. A : 356 B : 1스트라이크 0볼. A : 327 B : 2스트라이크 0볼. A : 489 B : 0스트라이크 1볼.
이때 가능한 답은 324와 328 두 가지입니다.
질문한 세 자리의 수, 스트라이크의 수, 볼의 수를 담은 2차원 배열 baseball이 매개변수로 주어질 때, 가능한 답의 개수를 return 하도록 solution 함수를 작성해주세요.
제한사항
-
질문의 수는 1 이상 100 이하의 자연수입니다.
-
baseball의 각 행은 [세 자리의 수, 스트라이크의 수, 볼의 수] 를 담고 있습니다.
입출력 예
baseball | return |
[[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]] |
2 |
이 숫자야구 문제는 우리가 평소 생각하던 답인 숫자를 도출해야하는 숫자야구와는 다르다.
이 문제는 몇몇 대답을 보고 가능한 숫자들의 후보의 수를 리턴해야하는 문제다.
처음 걸러지기 전의 숫자들은 [1,2,3] 부터 [9,8,7]로, 생각보다 많지 않기 때문에 완전탐색을 이용해도 효율적으로 답을 도출해낼 수 있을 것이다.
일단 all_num 함수로 순열을 이용하여 [1,2,3] 부터 [9,8,7] 까지 중복 없는 숫자 세트들을 생성하였다.
check_guess(guess, num) 함수에서는, guess로 들어오는 것은 baseball 입력값들이 하나하나 들어온다. 그러면 guess[1]은 입력으로 주어진 스트라이크 개수이고 guess[2]는 볼 개수이다. 입력으로 주어진 스트라이크, 볼은 각각 guess_s, guess_b에 저장한다.
그리고 num에는 [1,2,3] 에서 [9,8,7] 숫자가 들어온다.
num을 가지고 직접 guess[0]의 숫자와 비교하여 실제 strike, ball 개수를 계산한다. 이 과정을 노가다로 아래처럼 구현할 수도 있고, 주석처리된 곳처럼 for문과 if문을 이용할 수도 있다.
이렇게 직접 계산한 strike, ball 개수와 주어진 guess_s, guess_b 개수가 같다면 True을 리턴, 다르다면 False을 리턴한다
마지막 solution 함수에서는 all_num에서 생성한 모든 숫자들을 완전탐색으로 돌면서, baseball의 모든 케이스에서 True가 나온 숫자들의 개수를 센다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
from itertools import permutations
def all_num(): #123-987
numbers=list(range(1,10))
all_number=list(permutations(numbers, 3))
return all_number
def check_guess(guess,num):
# baseball에 주어진 s,b수와 실제 s,b수 비교해서 같으면 T, 다르면 F 반환
guess_num=[int(i) for i in str(guess[0])]
guess_s=guess[1]; guess_b=guess[2]
strike,ball=0,0
if guess_num[1]==num[1]:
strike+=1
if guess_num[2]==num[2]:
strike+=1
if guess_num[0]==num[0]:
strike+=1
if guess_num[0]==num[1] or guess_num[0]==num[2]:
ball+=1
if guess_num[1]==num[2] or guess_num[1]==num[0]:
ball+=1
if guess_num[2]==num[0] or guess_num[2]==num[1]:
ball+=1
'''위의 노가다 방법이 싫으면 아래 방법 사용
for i in range(3):
if guess_num[i]==num[i]:
strike+=1
continue
if guess_num[i] in num:
ball+=1
print(guess_num,"내가 구한 s,b=",strike, ball,"주어진 s,b=",guess_s,guess_b)
'''
if guess_s==strike and guess_b==ball:
return True
else :
return False
def solution(baseball):
all_numbers=all_num() #(1,2,3)~(9,8,7)
answer=0
for num in all_numbers:
flag=True
for guess in baseball:
if check_guess(guess, num)==False:
flag=False
if flag==True: #baseball의 모든 케이스에서 True가 나왔을 경우 answer+1
answer+=1
return answer
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
'알고리즘, 코딩테스트 > 프로그래머스 문제풀이' 카테고리의 다른 글
[파이썬] 프로그래머스 Level.2 | 해시 | 전화번호 목록 (0) | 2020.02.12 |
---|---|
[파이썬] 프로그래머스 Level.1 | 해시 | 완주하지 못한 선수 (0) | 2020.02.12 |
[파이썬] 프로그래머스 Level.1 | 완전탐색 | 모의고사 (0) | 2020.01.29 |
[파이썬] 프로그래머스 Level.4 | 이분탐색 | 징검다리 (0) | 2020.01.29 |
[파이썬] 프로그래머스 Level.3 | 이분탐색 | 입국심사 (0) | 2020.01.29 |
- Total
- Today
- Yesterday
- easycode
- partyrock앱
- easycode chatGPT
- SpacewBetween
- 술자리병돌리기게임
- partyrock
- ChatGPT
- 정적 웹사이트 배포
- vscode easycode
- aws생성형ai
- S3 403 forbidden
- 코딩테스트
- partyrock사용볍
- S3배포
- PYTHON
- 파이썬
- React native 작동 원리
- 정적 웹페이지 배포
- 생성형AI
- 병돌리기구현
- genaiapp
- partyrock생성
- BOJ
- 백준
- 티스토리챌린지
- AWSBedrock
- 알고리즘
- awsgenai
- 오블완
- partyrock무료
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |