Duplicate Numbers

일전에 뭐 게임 회사에서 본 간단한 퀴즈 테스트 입니다.

0~9까지의 문자로 된 숫자를 입력 받았을 때, 이 입력 값이 0~9까지의 숫자가 각각 한 번 씩만 사용된 것인지 확인하는 함수를 구하시오.

  • sample inputs: 0123456789 01234 01234567890 6789012345 012322456789

  • sample outputs: true false false true false

no duplicates
+1 sample output에서 두 번째꺼는 01234니까 0~9사이의 숫자가 각각 하나씩 사용되어서 true 아닌가요?? 아니면.... 0~9까지 모든 숫자가 나와야 하는건가요??? - SPJung, 2015/12/31 10:44 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

84개의 풀이가 있습니다. 1 / 9 Page

python 2.7.8입니다. 입력값을 sorting해서 0123456789 와 비교하는 방법을 썼습니다.

n = [''.join(sorted(x)) for x in raw_input().split()]
for x in n:
    print "true" if x=="0123456789" else "false",
와, 무릎을 탁쳤네요! - 디디, 2016/03/19 14:42 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
insertion = input()

palette = []
for i in range(0, len(insertion)):
    palette.append(int(insertion[i]))

contrast = list(set(sorted(palette)))

if palette == contrast:
    print("true")
else:
    print("false")

파이썬의 set함수를 활용하면 중복된 원소를 모두 단일화할 수 있으므로, 그렇게 정리된 리스트가 원래의 숫자 입력을 리스트로 만든 것과 동일한가를 판가름하는 구조로 짜 보았습니다.

파이썬의 set이라는 함수가 특이하군요. 중복 제거해서 비교한다는 아이디어도 좋구요. ㅋ - 임 정구, 2015/09/17 09:13 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

파이썬 2.7.6 입니다.

print map(lambda n:len(set(n))==10 and len(n) ==10 ,"0123456789 01234 01234567890 6789012345 012322456789".split())

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

파이썬입니다.

input = "0123456789 01234 01234567890 6789012345 012322456789 1111111111"
for ca in input.split():
    check = [0 for i in range(10)]
    for s in ca:
        check[int(s)] += 1
    print sum(check) == 10 and all(check)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

c# 입니다.

     private void Form1_Load(object sender, EventArgs e)
    {
        String inputs = "0123456789 01234 01234567890 6789012345 012322456789";


        String[] Split_input = inputs.Split(' ');
        foreach (String s in Split_input)
        {
            if (Check_NUM(s))
                Console.Write("true ");

            else
                Console.Write("false ");
        }
    }




    private bool Check_NUM(String number)
    {
        List<Char> List_input = new List<Char>();
        char[] data = number.ToCharArray();

        foreach (Char d in data)
        {
            if (List_input.Contains(d))
                return false;

            List_input.Add(d);
        }

        if (List_input.Count == 10)
            return true;

        return false;

    }

공백을 나눈 후 String을 Char 배열로 쪼개서 넣은다음 list클래스의 contain으로 값이 들어있는지 비교를 해보았습니다.

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

파이썬입니다.

def only_one(string):
    num_set = set(string) # 중복 제거
    if len(string) == len(num_set) == 10:   # 중복 제거 한 후의 갯수와 같고 그 갯수가 10이라면
        return "true"
    else:
        return "false"

input_string = "0123456789 01234 01234567890 6789012345 012322456789"
for s in input_string.split(" "):
    print(only_one(s), end=' ')
셋을 생각했었는데, 기존의 자기와 비교한는 것은 생각을 못했네요 훌륭하십니다 - 디디, 2016/03/19 14:45 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def Check(s):
  a = []
  for i in range(10):
    a.append(0);  
  for c in s :
    if c not in str( range(10) ) :
      return False
    a[int(c)]+=1
  for i in range(10):
    if ( a[i] != 1 ) :
      return False
  return True

s = "0123456789 01234 01234567890 6789012345 012322456789"

for s1 in s.split() :  
  print Check(s1) and "true" or "false" ,
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

C#

        private bool checkCount(string test)
        {
            char[] array = test.ToCharArray();

            int max =
                (from t in array
                 group t by t into g
                 select g.Count()).Max();

            return max > 1 ? false : true;
        }

이렇게 하면 중복은 발라낼 수 있는데 빠진 숫자가 있는지 체크가 안 될꺼 같아서 static private bool checkCount(string test) { char[] array = test.ToCharArray(); int max = (from t in array group t by t into g select g.Count()).Max(); int cnt = (from t in array group t by t into g select g.Count()).Count(); return ( max == 1 && cnt == 10) ? true : false; } static void Main(string[] args) { string s = "0123456789 01234 01234567890 6789012345 012322456789"; foreach (string ss in s.Split() ) Console.WriteLine( ss + " " + ( checkCount(ss) ? "true" : "false" ) ); } 이렇게 고쳐봤습니다. 개인적으로 from select 이런 식의 C#구문 처음 써보는데 편하군요. - Kim JungRae, 2015/09/16 15:55 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
import math

str_inputVal=input("input :")
num_inputTrans=int(str_inputVal)
#자리수 계산용 코드
num_digit=int(math.log10(num_inputTrans))+1
set_mem=set()

for i in range(num_digit):
    set_mem.add(num_inputTrans%10)
    num_inputTrans=int(num_inputTrans/10)

if set_mem.__len__()==10:
    print("입력된 값에는 0~9까지 모두 있습니다.")
else:
    print("입력된 값에는 0~9 중 "+str(10-set_mem.__len__())+"개가 부족합니다.")

윗 분과 같이 set은 중복을 허용치 않는다는 것을 이용하여 제작하였습니다.

중간의 math.log10()부분은 입력받은 수의 자릿수를 구하기 위해 만든 부분입니다.

자릿수를 이용해서 for문으로 회전시켜 각 자릿수를 set 에 저장한 후 set의 크기를 이용해서 빠진 숫자가 있는지 확인하는 방식입니다.

참고로 이 방법에서 string으로 받은 문자열을 integer로 변환하는 과정이 있어 0으로 시작할 경우에는 0을 제외하게 됩니다. 만약 제일 처음 0을 무시하게 하고싶지 않다면 인풋을 받은 후 바로 앞이 "0"인지 확인하고 그후 set에 0을 집어넣으면 됩니다. 만약 0이 앞부분에 2개 이상이더라도 이 문제는 중복을 확인하는 문제임으로 무시해도 상관없다 생각합니다.

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

C# 박재우님의 아이디어를 차용해서 새로 짜 보았습니다.

        private bool checkCount2(string test)
        {
            char[] array = test.ToCharArray();
            return Enumerable.SequenceEqual(array, array.Distinct().ToArray<char>());
        }

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

※ 풀이작성 안내
  • 본문에 코드를 삽입할 경우 에디터 우측 상단의 "코드삽입" 버튼을 이용 해 주세요.
  • 마크다운 문법으로 본문을 작성 해 주세요.
  • 풀이를 읽는 사람들을 위하여 풀이에 대한 설명도 부탁드려요. (아이디어나 사용한 알고리즘 또는 참고한 자료등)
  • 작성한 풀이는 다른 사람(빨간띠 이상)에 의해서 내용이 개선될 수 있습니다.
목록으로
코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.

no duplicates x 1

언어별 풀이 현황
전 체 x 84
java x 10
python x 44
javascript x 2
cpp x 8
기 타 x 8
cs x 8
objectivec x 1
php x 2
ruby x 1