반응형
문자열을 입력받았을 때 서로 다른 문자로만 구성되어있는지 확인하는 함수를 제작해보았다.
1. O(n^2)으로 푸는 쓰레기 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def diffall(a,n): for i in range(n): for j in range(n): if i != j and a[i] == a[j]: return False return True a = raw_input() n = len(a) print diffall(a,n) // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
a를 입력받고 n에는 a의 길이를 받고 이중 포문을 통해 i,j 인덱스 체크(사실 필요없다.)와 a[i] == a[j]이면 return false를 그게 아니면 return true를 해주면 된다.
처음에는 어떻게 입력을 받을까 고민을했지만, 생각해보니 2중포문으로 간단히 해결 할 수 있었다.
수기로 풀고있던 문제여서 2중 포문으로 풀어서 제출했는데, 필자는 파이선에서 int arr[300]; 일 때 arr['a']++가 될지 몰랐다.
그런데 지금 와서 해보니 된다.
고로 위의 코드는 아주 쓰레기 코드였던 것이다.
사실상 알고리즘면에서는 위의 코드는 O(n^2)이고, O(n)에 푸는 과정을 다시 기술하려 한다.
2. O(n)에 풀리는 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | def diffall(a,n): b = [0]*300 for i in range(n): b[i] += 1 for i in range(n): if b[i] >= 2: return False return True a = raw_input() n = len(a) print diffall(a,n) // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
위의 코드는 ASCII를 이용한 코드이다.
i는 char형 문자를 하나씩 가지게 되고, b['a']+=1처럼 자신의 아스키부분에 맞게 1씩 들어간다.
그리고 마지막으로 b[i]가 2이상 즉, 두번이상 나온 문자가 있다면 return False 그게 아니면 return True를 해주면 더 쉽게 끝나는 문제이다.
1번처럼 풀어 제출했는데 정말 알고리즘 공부 한사람으로써 민망한 코드인듯하다.
반응형
'Basic > Python' 카테고리의 다른 글
파이썬 딕셔너리 (0) | 2017.07.08 |
---|---|
파이썬 10진수에서 2진수로 변환하는 프로그램 (5) | 2017.07.06 |
파이썬 부르트 포스를 이용한 내림차순 정렬 코드 (0) | 2017.07.05 |
파이썬 str 전체 메소드 설명 및 예제 코드 (0) | 2017.07.04 |
파이썬 파일 입출력 및 기타 내용 (0) | 2017.07.04 |