336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

실습시간 연습문제

* 개인과제로 나온 피보나치수에 관한 문제는 생략한다.


4주차 튜터링 시간에 설명하였던 부분을 다시 설명한다. 


1~6번까지 총 6문제로 주어진 것인데 

요약을 하면 369수, 비369수 를 판별하는 문제이다.


369수란? 수가 주어질 때 수의 자리 수에 3, 6, 9 가 포함이 되어있다면 369수라 판정한다. 

비369수란? 369수가 아닌 것을 비369수라 한다. 


그렇다면 이 수를 판별하기 위해서는 각 자리 수를 확인하여 판정을 해야한다. 


사용자 입력으로 수가 주어졌을 때, 369수를 판별하는 방법을 설명한다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
user_input = input()
is369 = False # 초기 상태를 369수인지 판별하기 위해 is369 는 아닌 False로 설정
number = user_input
 
if(number < 0): # 음수인 경우도 고려해야하므로
    number = -number
 
while(number > 0): # user_input 으로 들어온 수가 0보다 크면 확인을 계속진행
    
    identity = number%10 # 한 자리수씩 판별하기 위함
    number = number/10 # 연산을 한 자리수는 삭제
    
    if(identity%3 == 0 and identity != 0):#0이 아니며 3,6,9가 수에 포함되어있는 것을 확인
        is369 = True
        break # 판별이 끝났으므로 while loop를 나간다.
 
if(is369):
    print "입력된 수 %d 는 369수!" % user_input
elif(not is369):
    print "입력된 수 %d 는 비369수!" % user_input
cs


각 부분에 주석을 달아두었다. 

[변수 설명]

user_input ; 사용자가 입력하는 수

is369 ; 369수인지 아닌지 판정하기 위한 변수

number ; 369수인지 판별 연산을 위한 임시변수 사용, user_input을 저장

identity ; 한 자릿 수씩 판별하기 위한 변수.


이것을 함수로 선언하는 방법에 대해서 설명하겠다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
def function_name([parameter1[, parameter2]]):
    '''
    연산을 하여 return
    '''
    return ret
 
# 1 : 인자가 없고, 반환값도 없는 형태
def 함수이름():
    '''
    연산
    '''
 
# 2 : 인자가 존재, 반환값 없음
def 함수이름(인자1):
    '''
    연산
    '''
 
# 3 : 인자들이 존재, 반환값 없음
def 함수이름(인자1, 인자2......):
    '''
    연산
    '''
 
# 4 : 인자가 없음, 반환값 있음
def 함수이름():
    '''
    연산
    '''
    return 반환값
 
# 5 : 인자가 존재, 반환값 있음
def 함수이름(인자1):
    '''
    연산
    '''
    return 반환값 
 
# 6 : 인자들이 존재, 반환값 있음
def 함수이름(인자1, 인자2......):
    '''
    연산
    '''
    return 반환값
cs


함수의 이름을 선언하고 선언하기위한 형태로 def 키워드를 사용하여 선언한다.

그리고 함수에 어떤 인자 형태를 줄지 작성한 후,

반환값이 있는 경우 없는 경우를 설정한다. 

지금 생각나는 것으로 총 6가지 경우가 있다고 생각이 되는데 


is369 판정에 대한 함수를 아래 예시로 작성한다.

1
2
3
4
5
6
7
8
9
10
11
12
def is369_fn(number):
    is369 = False
    if(number < 0):
        number = -number
    while(number > 0):
        identity = number%10
        number = number/10
        if(identity % 3 == 0 and identity != 0):
            is369 = True
            break
    
    return is369
cs


함수의 이름은 is369_fn 이다.

함수의 인자로 number를 받는다.

함수의 내부변수로 is369 변수를 사용하여 주어진 인자를 이용하여 연산 후 연산결과로 마지막에 is369를 반환한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def is369_fn(number):
    is369 = False
    if(number < 0):
        number = -number
    while(number > 0):
        identity = number%10
        number = number/10
        if(identity % 3 == 0 and identity != 0):
            is369 = True
            break
    
    return is369
 
user_input = input()
is369 = is369_fn(user_input)
 
if(is369):
    print "입력된 수 %d 는 369수!" % user_input
elif(not is369):
    print "입력된 수 %d 는 비369수!" % user_input
cs


이전에 def 로 함수를 선언해야 사용을 할 수 있다. 그러므로 이전에 함수를 작성하고 다음에 함수를 사용해야 한다. 

만약 함수를 아래로 내려 작성하게 되면 아직 함수 is369_fn이 선언이 되어 있지 않으므로, NameError 로 아직 선언이 되지 않았다고 에러를 받게 된다.


함수에 대한 더 자세한 내용은

https://docs.python.org/2/tutorial/controlflow.html#defining-functions

을 읽어보길 바란다.


https://docs.python.org/2/tutorial/

문법에 대한 상세내용은 위 주소에 python doc을 확인하여 사용하면 된다. 사용할 것이 필요할 때 doc을 확인하거나 검색을 하여 필요한 것을 찾아보도록 한다.


그리고 1~10000까지 369수를 출력하는 문제도 있었는데 위 함수를 그대로 사용하여 코드를 작성하겠다. 

혹시나 함수를 아직 잘 이해하지 못했다면 함수부분을 for 혹은 while 구문안에 넣어서 구현해도 상관은 없다.

출력이 굉장히 길어지므로 해당 코드에서는 1~50까지만 출력하기로 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
def is369_fn(number):
    is369 = False
    
    while(number > 0):
        identity = number%10
        number = number/10
        if(identity % 3 == 0 and identity != 0):
            is369 = True
            break
    
    return is369
 
for number in range(1,50+1):
    if(is369_fn(number)):
        print number
    
''
#####################
        output 
#####################
3
6
9
13
16
19
23
26
29
30
31
32
33
34
35
36
37
38
39
43
46
49
'''
cs


함수의 결과가 True 혹은 False 이기 때문에 조건문인 if 문의 condition(조건)으로 넣어주어도 된다.

그렇기 때문에 함수에 인자로 for loop의 number 값을 판정하여 해당 수가 369수가 맞다면 출력을 하게 되는 코드이다.


이와 같이 작성하면 1~m번째 까지 수의 합도 계산할 수 있다. 


비369수를 구하기 위한 것은 함수의 결과에 not을 붙여주면 동일하게 구할 수 있으므로 생략한다.


+ 추가

질문을 하여 추가작성합니다.


질문내용) 실습문제 6번에 어떻게 합을 출력을 해야하는지 잘모르겠다고 하였다.

+ 리스트, 함수가 이해가 되지 않았다하여 리스트, 함수를 사용하지 않고 구현한다.


실습문제 6번은 m을 입력받고, 

1) 1부터 시작한 수들 중 1항부터 입력받은 m항까지의 369수의 합

2) 1부터 시작한 수들 중 1항부터 입력받은 m항까지의 비369수의 합을 출력하는 문제이다.

이때 m항은 동시에 입력이 되며, 1~m항까지 수는 369수와 비369수는 다르다.


이를 하기 위해 위에 작성된 코드를 그대로 사용한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
user_input = input()
is369 = False # 초기 상태를 369수인지 판별하기 위해 is369 는 아닌 False로 설정
number = user_input
while(number > 0): # user_input 으로 들어온 수가 0보다 크면 확인을 계속진행
    
    identity = number%10 # 한 자리수씩 판별하기 위함
    number = number/10 # 연산을 한 자리수는 삭제
    
    if(identity%3 == 0 and identity != 0):#0이 아니며 3,6,9가 수에 포함되어있는 것을 확인
        is369 = True
        break # 판별이 끝났으므로 while loop를 나간다.
 
 

cs

코드의 내용은 그대로 이므로 내용은 생략한다. 


이제 해당 코드로 위 문제를 풀어보면 

수의 시작은 1부터 시작하므로, 이를 구현하기 위해서 for loop 혹은 while loop 를 사용할 수 있다.


while loop로 구현을 하면 아래 코드와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
mth = input()
 
sum_is369 = 0 # 369 수의 1항부터 m번째 합까지 저장하는 변수
cnt_is369 = 0 # 369수의 항이 m항에 도달하였는지 판별하기위한 count 변수
 
sum_isnot369 = 0 # 비369 수의 1항부터 m번째 합까지 저장하는 변수
cnt_isnot369 = 0 # # 369수의 항이 m항에 도달하였는지 판별하기위한 count 변
 
step = 1 # 1부터 시작되는 수
while (True):
    is369 = False 
    number = step
    while(number > 0):     
        identity = number%10 # 한 자리수씩 판별하기 위함
        number = number/10 # 연산을 한 자리수는 삭제
    
        if(identity%3 == 0 and identity != 0):
            is369 = True
            break
    print step, is369
    if(cnt_is369 < mth and is369): # 369수 합을 위한 조건
        sum_is369 += step
        cnt_is369 += 1        
 
    if(cnt_isnot369 < mth and not(is369)): # 비369수 합을 위한 조건
        sum_isnot369 += step
        cnt_isnot369 += 1
 
    if(cnt_is369 + cnt_isnot369 == 2*mth): # 종료조건
        break
    step += 1 # 계산후 수+1
 
print sum_is369
print sum_isnot369
 
 
cs

while loop를 무한루프로 사용하여 while문 안에 종료조건을 명시하였다. 

cnt_is369 + cnt_isnot369 == 2*mth 는 두 계산을 끝내면, 두 count 값이 m이 되므로 2*m이 된다. 그러므로 위와 같은 조건을 명시하였고, 다른 조건으로 사용해도 상관없다.

코드는 자기가 작성하기 나름이기 때문에 여러가지 형태로 나올 수 있으므로 위와 같이 작성도 할 수 있구나 라고 이해하면 될 것 같다.


+ Recent posts