kjh2380   2년 전

안녕하세요, 이 문제에 대해서 질문드립니다.

먼저 이 문제는 아스키코드값을 이용하면, 웹 상에서 맞췄습니다!!를 나오게 해결할 수 있는거 같습니다. 그런데, 이 문제의 조건을 확인하면, 숫자는 어떤것이든 상관없고, 갯수만 100개 이하로 조절하고 있습니다. 그렇다는 것은 숫자를 거꾸로 정렬해서 입력해도 같은 답이 나와야하고, 숫자의 자릿수를 상관없이 답이 나와야합니다. 아스키코드값을 이용하면 54321, 12345로 입력해도 답은 15가 나오게 됩니다.

하지만, 두자리 숫자가 포함되면 답이 나오지 않습니다. 즉, 678910과 109876을 입력하게 되면 서로 다른값이 나오게 되고, 그 두값 모두 40이라는 답은 아니게 나옵니다.

이 문제의 조건을 모두 만족시키는 답을 구하려면 숫자를 거꾸로 입력해도 같은 답이 나오되, 숫자의 자릿수에는 제한이 없어야합니다.

그렇다면 문제되는것이, 7891011이 7 8 9 10 11인지 78 9 10 1 1 인지 알수가 없다는 문제가 발생합니다.

저는 그 문제를 이렇게 해결하였습니다. 먼저 숫자들은 연속적으로 나와야합니다. 12345, 23456, 34567, ... 그렇다면 첫번째 숫자만 파악하면 나머지 숫자들은 파악할 수 있습니다.

첫번쨰 숫자의 자릿수를 파악하는 방법은 연속된 숫자의 길이 / 숫자의 갯수 입니다. 예를들면, 89101112라는 5개의 숫자의 연속을 보겠습니다. 숫자의 길이는 8이고, 숫자의 갯수는 5입니다. 즉 8 / 5 = 1이고, 첫번째 자리수는 1자리임을 알 수 있습니다. 그리고 숫자의 길이 - N번째 숫자의 자릿수 / 숫자의 갯수 - 1을 N이 1부터 반복하여 구해주면 모든 자리수를 알 수 있습니다. ( 8 - 1 / 5 - 1 --> 7 / 4 = 1(두번쨰 숫자의 자리수)) ( 7 - 1 / 4 - 1 --> 6 / 3 = 2(세번째 숫자의 자리수)) ( 6 - 2 / 3 - 1 --> 4 / 2 = 2(네번째 숫자의 자리수)) ( 4 - 2 / 2 - 1 --> 2 / 1 = 2(마지막 숫자의 자리수))

입력받은 값을 배열로 정렬하여주면, 첫번째 숫자를 파악할 수 있습니다. 하지만, 또 다른문제가 존재합니다. 바로 숫자가 거꾸로 정렬되어있는지 아닌지입니다. 89101112인지 12111098인지는 입력한 저는 알 수 있지만, 그것을 파악해야만 합니다. 이를 위해서는 다음과 같은 방법을 사용하였습니다.

먼저 숫자가 무엇인지는 모르지만, 한자리 한자리 두자리 두자리 두자리인것은 알 수 있습니다. 따라서 기준을 정해서 숫자 3개를 뽑아냅니다. 즉, 무조건 앞에서 3개를 뽑는다고 합시다. 89101112이면 8 9 10이 뽑힙니다. 12111098이면 1 2 11이 뽑히게 됩니다. 즉 한쪽은 숫자가 1씩 차이를 보이는 일정한 수가 뽑히지만 다른쪽은 전혀 엉뚱한 숫자가 뽑히게 됩니다. 이때 1씩 차이를 보이냐는 if문을 걸어서 차이를 보이면 가장 앞쪽의 한자리 숫자 8이 가장 작은수이고, 8부터 1씩 증가한 5개의 숫자의 합을 구해주면 됩니다. 반대로, 1씩 차이를 보이지 않으면 가장 뒤쪽의 한자리 숫자 8이 가장 작은수이고 역시 8부터 1씩 증가한 5개의 숫자의 합을 구해주면 됩니다.

여기까지가 제가 풀어낸 식입니다. 1씩 차이를 보인다라는 전제가 100% 확실한게 아닌지, 웹상에서는 오답으로 체크가 되고 있는데

제가 풀어낸 방법의 문제가 무엇일까요?ㅠㅠ 혹시 풀어낸 분들은 어떤 방법으로 적용하셨나요??

kks227   2년 전

엄밀한 '숫자'는 한 글자입니다. 글을 글자로 표현하듯, 수를 숫자로 표현합니다.

댓글을 작성하려면 로그인해야 합니다.