#2503 숫자 야구

princess·2021년 1월 9일
0

알고리즘

목록 보기
2/21

문제 → 영수와 민혁의 대답과 질문은 우리가 알고 있는상태 따라서 컴퓨터는 영수가 생각하고 있을 상황의 수만 맞추면 됨

결국엔 컴퓨터는 우리가 낸 숫자를 맞추고, 지금 현재 몇개로 생각이 정리 되었는지에 대해 출력하는 문제인듯

<방법>

1 리스트를 하나두어서 민혁이가 말하는 모든 경우의 수를 다 저장을 하는것
처음 들어온 수 부터 시작을 해서 전부다 저장을 하는 방법

ex) 123 1 1

  • 1이 스트라이크라고 생각을 하면 2나 3둘 중에 하나를 볼이라고 가정
  • 그러면 '1-2'나 '13-'의 모든 경우의 수를 저장
  • 다음 들어오는 수에서 또 모든 경우의 수를 구해서 이전에 리스트에 저장된 숫자들이랑 겹치는 것들을 저장 나머지는 저장하지 않음

문제점 : 일단 다음 숫자랑 어떻게 비교를 할 것인지, 또한 456 1 1 와 같은 이전 숫자와 다른 것들이 들어오면 비교하는 것이 의미가 없어짐

2 1번과 유사한 방법으로 일단 들어온 숫자들을 모두 리스트를 이용하여 전부 저장을 하는 방법

ex) 4
123 1 1
356 1 0
327 2 0
489 0 1

  • 4개의 리스트를 만들어서 각 경우의 수를 전부 다 각각의 리스트에 저장을 함
  • 그래서 각 리스트 안의 모든 원소들을 비교하여 4개의 리스트에서 공통으로 들어가는 수를 찾아서 경우의 수를 구함

문제점 : 일단 들어오는 입력이 얼마인지 모르기 때문에 리스트를 생성하는 코드를 짜는 문제, 리스트가 너무 많으면 일단 효율이 떨어짐 그리고 앞서 말한 것 처럼 123 1 1 과 456 1 1은 절대 같은 수가 겹칠 수 가 없음

3 2번 처럼 리스트를 전부다 만드는 것이 아니라 2차원 배열로 구현하는 방법

1번과 2번에서 풀리지 않았던 123 1 1과 456 1 1을 생각해 보니, 저렇게 입력이 들어올 수 없다는 것을 생각해 냄 이유는 123 1 1이면 2개의 숫자가 포함이 된다는 것이고 456 1 1이면 또 2개의 숫자가 포함이 된다는 것인데 그럼 총 4개의 숫자가 됨 .. 이것 때문에 한참을 고민함 ...

ex) 4
123 1 1
356 1 0
327 2 0
489 0 1

  • 일단 편의를 위해서 받아온 숫자를 문자열로 변환을 시켜줌
  • 그 번호에 스트라이크가 있다면, 저장하는 방법은 세자리 숫자 중 차례로 자리를 지정하여 볼과 함께 저장하고 자리가 정해지지 않는 자리는 1-9로 자리를 채움 list[0][0][] = 1-2, list[0][1][] = 13-
  • list[4][] 이런 식으로 모두 채워지게 되면 list[0]과 list[1], list[2], list[3] 의 원소들을 비교하여 같은 것들을 다른 리스트에 채움

문제점 : 스트라이크와 볼을 어떤 숫자로 할 것인지 정하는 것이 가장 큰 문제점 → 그리고 모든 스트라이크의 경우의 수를 구현해야됨 예를 들어 스트라이크가 하나일 경우, 두개일 경우 등 모든 경우의 수를 생각해 줘야됨

4 범위를 이용하여 문제를 푸는 방법
brute-force를 이용하는 문제인 것을 알게되었는데, 앞서 내가 생각했던 방법들은 모두 잘 풀어 보려고 했던 방법들이었다는 것을 알게됨 ..

ex) 4
123 1 1
356 1 0
327 2 0
489 0 1

  • 범위의 모든 수를 이용하여 푸는 방법
  • 범위는 123 ~ 987이며, 내가 입력했던 모든 수들과 먼저 비교를 하는데, 비교를 하는 기준은 입력한 스트라이크와 볼의 개수임
  • 일단 범위 안의 수를 차례로 하나하나 입력한 수와 비교를 하는데, 만약 범위 안의 수와 입력수의 자리가 같고 숫자가 같다면 그것은 스트라이크로 받아 들임
  • 만약 숫자는 같지만 자리가 다르다면 볼로 받아들이는데, 이것들을 입력 받은 모든 수와 비교를 하여 스트라이크 수와 볼의 수가 같다면 그것은 생각 할 수 있는 경우의 수로 간주함
profile
성장하는 머신러닝 엔지니어

0개의 댓글