숫자야구 만들기
와.... 문제를 보자 말자 정말 어렵다고 생각이 들었다..
숫자야구를 만드는 게임을 하는건 쉬운편인데 반대로 맞춘걸 바탕으로 남은 정보를 알려주는 것을 만들어야 한다.
이걸.... 머리가 깨지는 문제라는 생각이 팍 들었다.
이렇게 나와 있는 문제에서 내가 답을 도출 하는 것인데
예를 들어보면 내가 문제를 4번을 통해서 답을 받았는데 여기서 내가 시도 해 볼 수 있는 남은 경우의 수는 무엇이 있는지
알려주는 로봇은 만든다는 느낌으로 해야한다...
결국 문제를 봐도 답이 떠오르지 않아서 나는 해답지를 보았는데...
봐도 이해를 하는데 엄청 오래 걸렸다.
나는 이걸 사람에 비유를 해서 생각을 했습니다.
1부터 9까지 중복이 없는 3자리의 번호로 하나씩 부여를 받은사람이 있는데.
내가 명단을 불러서 번호를 가져오고 번호를 하나씩 꺼내서 사람들의 몸에 적인 번호를 비교를 하는데
3개 중에 하나라도 같은 번호가 있으면 일단 명단에 올리고 그중에서 자리까지 같으면 스트라이크 1회 추가
자리는 다르다면 볼 1회 추가를 하는 식으로 가고 마지막에 내가 넣었던 정보는 1스트라이크 1볼이라고 칠때 같은
전과 기록이 있는 애들은 살려주고 전과기록이 둘중 하나라도 다르면 목을 쳐서 죽인다.
그러면 죽어버린 사람의 자리는 비어지게 되고 뒤에 있던사람들이 한칸씩 앞으로 당겨오는데.
컴퓨터의 반복문상 1번 다음은 2번자리에 검사를 하게 되는데
2번이 죽어 3번이 2번자리로 가게 되고 다음 순서상 3번자리에 검사를 하게 되면 4번이 검사를 맞게 되어버린다.
이런 문제를 없애기 위해서 사살 명단을 만들고 오늘 죽인 사람을 카운트로 넣어준다. 그러면 2번이 죽음으로써
1번의 자리는 뒤로 밀러라라고 넣어주고 3번 반복문에 2번 자리를 검사하므로 3번을 검사할 수 있게 된다..
이렇게 검사를 계속 해서 모든 리스트를 검사하면 생존자 명단이 생겨나고 계속 반복을 하면서
마지막까지 살아남은 사람의 명단을 올리면 남은 경우의 수가 나오게 된다.
from itertools import permutations
# 횟수 입력
n = int(input())
# 번호 3개를 가지고 있는 사람들 모조리 가져오기
num = list(permutations([1, 2, 3, 4, 5, 6, 7, 8, 9], 3))
# 반복문 진입 n번
for count in range(n):
# 숫자 입력 받기
test, strike, ball = map(int, input().split())
# 번호 모두 뜯어서 문자로 바꾸고 리스트에 넣기
test = list(str(test))
# 리스트 오류 방지용
remove_cnt = 0
# 전체 사람 명단 모두 검사 받기
for i in range(len(num)):
# 볼 스트라이크 초기화
s_cnt = b_cnt = 0
# 리스트가 삭제가 되면 그만큼 뒤로 물려서 사용하기 위해서
i -= remove_cnt
# 각 숫자의 번호를 하나씩
for j in range(3):
# 문자로 바뀐 번호를 다시 숫자로 바꾸기
test[j] = int(test[j])
# 내가 적은 번호 j번 자리가 3자리 번호안에 있는지?
if test[j] in num[i]:
# 있다면 3자리 안에 있으면서도 j번 째의 자리가 목록에서 가져온 것에도 j번째 자리에 있는가? 있으면 스트라이크
if j == num[i].index(test[j]):
s_cnt += 1
# 같은 자리는 아니라면 볼
else:
b_cnt += 1
# 반복문을 통과 하고 나온 값이 볼 스트라이크와 일치하면 살여주기 다르면 죽이기
if s_cnt != strike or b_cnt != ball:
# 죽여
num.remove(num[i])
# 죽여 버렸으니 빈칸을 다시 뒤로 돌려야지
remove_cnt += 1
# 살아 남은 자의 수
print(len(num))
여기 문제에서 새롭게 배운것은
튜터님 특강
완전탐색 및 그리디 알고리즘!
재귀함수
함수안에 함수가 반복이 되는 함수!
재귀함수를 만들때에는 기저 사례(base case)라는 마지막이 되는 결과 값을 만들어 주어야 한다.
그렇지 않으면 함수는 무한이 돌게 되기 때문에 이 부분을 가장먼저 계산을 해주어야 한다.
그리디 알고리즘
강의를 듣고 나니 문제를 푸는 방법의 노하우를 알게 된거 같아서 좋았습니다.
그러나 여전히 문제는 어려운 것 같네요ㅕ...ㅠㅠ
billyhyunjun/sparta (github.com)
오늘의 문제 풀이를 깃허브에 저장해서 올렸습니다!
숫자야구가 제일 어려웠어...
'AI 코딩 교육 TIL' 카테고리의 다른 글
2024-03-07 AI 코딩 TIL (0) | 2024.03.07 |
---|---|
2024-03-06 AI 코딩 TIL (1) | 2024.03.06 |
2024-03-04 AI 코딩 TIL (0) | 2024.03.04 |
2024-02-29 AI 코딩 TIL (1) | 2024.02.29 |
2024-02-28 AI 코딩 TIL (0) | 2024.02.28 |