반응형

문자열을 입력받았을 때 서로 다른 문자로만 구성되어있는지 확인하는 함수를 제작해보았다.



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
 
 
= raw_input()
= 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
 
 
= raw_input()
= 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번처럼 풀어 제출했는데 정말 알고리즘 공부 한사람으로써 민망한 코드인듯하다.












반응형