The observed PIN (4 kyu)

https://www.codewars.com/kata/5263c6999e0f40dee200059d

4규 문제이기는 하지만, 체감 상으로는 6규 정도되는 문제로 보임.

아래와 같이, 숫자가 배치되어 있고 하나의 숫자를 선택했을 때, 선택된 위치를 기준으로 상하좌우의 십자방향으로 숫자를 관찰할 수 있다고 가정 함.
예를 들어 1을 선택하면, 1과 우측의 2, 하단의 4를 관찰할 수 있고, 5를 선택하면, 2, 4, 5, 6, 8을 관찰할 수 있도고 함.

┌───┬───┬───┐
│   1    │   2    │   3    │
├───┼───┼───┤
│   4    │   5    │   6    │
├───┼───┼───┤
│   7    │   8    │   9    │
└───┼───┼───┘
           │    0   │
           └───┘

복 수의 숫자가 입력되었을 때, 관찰된 숫자로부터 가능한 모든 조합을 찾아내는 문제임.

아래와 같이 답을 작성함.

먼저 get_pins메소드에서
std::vector<std::vector<std::string>> 형태로
숫자를 선택했을 때, 가능한 조합을 vector형태로 가져오게 함.

그리고 combination이라는 메소드를 만들어,
2개의 숫자로부터 가능한 조합 vector 2개를 입력받아, 합치게 함.

#include <string>
#include <vector>

std::vector<std::string> combination(const std::vector<std::string> &lhs, const std::vector<std::string> &rhs)
{
  std::vector<std::string> ret;

  for (int l = 0; l < lhs.size(); ++l)
  {
    for (int r = 0; r < rhs.size(); ++r)
    {
        ret.push_back(lhs[l] + rhs[r]);
    }
  }

  return ret;
}

std::vector<std::string> get_pins(std::string observed)
{
  if (observed.size() == 0)
    return {};

  std::vector<std::vector<std::string>> pattern = {
      {"0", "8"},
      {"1", "2", "4"},
      {"1", "2", "3", "5"},
      {"2", "3", "6"},
      {"1", "4", "5", "7"},
      {"2", "4", "5", "6", "8"},
      {"3", "5", "6", "9"},
      {"4", "7", "8"},
      {"0", "5", "7", "8", "9"},
      {"6", "8", "9"}};

  std::vector<std::string> ret = pattern[observed[0] - '0'];
  for (int s = 1; s < observed.size(); ++s)
  {
    int num = observed[s] - '0';
    ret = combination(ret, pattern[num]);
  }

  return ret;
}

int main()
{
  std::vector<std::string> output = get_pins("369");

  return 0;
}

오류없이 한번에 통과한 특이한 문제였음.

좋은 웹페이지 즐겨찾기