안녕하세요
개인 문제 풀이이므로 오답이 있을 수 있습니다 오답인 경우에 댓글 꼭 꼭꼭 부탁드립니다
(예전에 풀었던 문제여서 오류가 있는 경우에 꼭 말씀 부탁드리겠습니다!)
4장
01. 주어진 자연수 N에 대해 N이 짝수이면 N!을, 홀수이면 N(시그마)을 구하는 코드를 작성하려 한다. 주어진 코드에서 잘못된 부분을 수정하시오.
[ 주어진 코드 ]
def calculator(N):
if n % 2 == 0:
result = 1
for i in range(1,N):
result = result *i
else:
result = 0
for i in range(1, N):
result = result + i
return result
[ 정답 코드 ]
def calculator(N):
if N % 2 == 0:
result = 1
for i in range(1,N+1):
result = result * i
else :
result = 0
for i in range(1, N+1):
result = result + i
return result
N에 입력된 값을 2로 나눠지는 경우에는 짝수이므로 result를 1부터 n-1번까지 곱하는 연산을 해서 result에 저장해줍니다. result = result * i의 경우 result *= i로도 표현할 수 있습니다.
N에 +1값을 해주는 이유로는 실제 연산을 N-1번까지 연산하기 위함입니다.
홀수의 경우 시그마 연산이므로 플러스로 동일하게 for 문에 N+1을 설정해서 풀어줍니다.
02. 다음 코드의 실행 결과를 쓰시오
fruit = 'apple'
if fruit == 'Apple':
fruit = 'Apple'
elif fruit == 'fruit':
fruit = 'fruit'
else:
fruit = fruit
print(fruit)
[ 정답 ] - apple이 출력된다.
파이썬의 ==의 경우 객체의 값을 비교하는데 fruit 변수 공간안에 Apple도 fruit도 갖고 있지 않으므로 모든 if문에서 통과할 수 없으며 apple이 출력됨
연습문제 7번과 같다.
03. 다음 코드의 실행 결과를 쓰시오.
num = ['12', '34', '56']
for i in num:
i = int(i)
print(num)
[ 정답 ] - ['12', '34', '56'] num안의 인덱싱 값 만큼 출력됩니다.
for 문에서 i = int(i)로 형을 재정의한 것처럼 보이지만 실제로 num 안의 값들이 타입 변환한 것이 아니므로 num 배열은 그대로 갑니다.
04. 다음 코드의 실행 결과를 쓰시오.
number = ["1", 2, 3, float(4), str(5)]
if number[4] == 5 :
print(type(number[0]))
elif number[3] == 4:
print(number[2:-1])
[ 정답 ] - [3, 4.0]의 값을 갖습니다.
이 문제는 첫 줄에 number라는 배열 안에 원소 값들을 인덱싱했습니다.
( 배열의 경우 0번부터 시작합니다. 이 문제의 경우 0, 1, 2, 3, 4번의 총 5개의 배열을 인덱싱한 문제입니다. )
if number[4] == 5 :의 값의 경우 number 4번째 배열의 값이 숫자 5인 경우 참일 때 통과하는 조건입니다.
하지만 배열 4번째의 값은 str(5)로 선언이 되어있습니다.
즉 문자열로 변환된 값을 갖는 배열이므로 숫자 5와 비교할 수 없습니다.
첫 if 문이 거짓이므로 elif 문으로 넘어갑니다.
number의 3번째 배열의 값이 4인 경우에 참인 조건입니다. int형 4를 float형으로 강제 형을 변환했기 때문에 바이트 크기는 커졌지만 4뒤의 소수점 값이 없기 때문에 number[3] == 4:의 조건에서 참이 나옵니다.
이후 print(number[2:-1]의 의미는 배열의 2번째 값과 역순으로 했을 때 1번째 위치에 있는 값을 출력하겠다는 의미입니다. 즉 0, 1, 2, 3, 4번의 배열이므로 2번째 원소 값인 3과 4번부터 역순으로 4 ,3 ,2 ,1 ,0중에 1번째 원소 값을 가져옵니다. 실수형으로 타입 변환 되었기 때문에 4.0값을 가져오는 것입니다. 즉 원소의 위치가 [2:-1]의 의미가2~3번 위치의 값을 인덱싱하는 것 이므로 [3, 4.0]이 됩니다.
05. 다음 코드의 실행 결과를 쓰시오.
num =0
i = 1
while i <8:
if i % 3==0:
break
i +=1
num +=i
print(num)
[ 정답 ] - 5
코드는 i가 3의 배수가 될 때까지 while문을 반복하는 문제입니다.
i가 1일 경우 3으로 나눴을 때 0.333... 값이 나옵니다. 그러므로 if문은 참인 경우만 값을 받기 때문에 i += 1, num += 1연산을 한바퀴 돌아줍니다. 2인 경우에도 같습니다. 그 후 i가 3이 되는 경우 i % 3 ==0의 값이 참이 되면서 break문에 들어가며 종료됩니다.
i += 1값이 의미하는 내용은 i = i + 1연산을 한다는 의미입니다.
num +=의 경우는 num = num + i연산을 하는 의미가 됩니다.
문제에서 i가 3이 될 때 까지 총 2번 num 값에 i 값을 더하게 되는데
i에 1을 증가시킨 값은 i = 2가 됩니다.
num = num + i == num(0) = num(0) + i(2)가 됩니다.
i값이 2인 경우에도 if참이 걸리지 않기 때문에 한 번 더 연산을 수행합니다.
num(2) = num(2) + i(3) => num(5)값이 됩니다. 그러므로 정답의 값이 5가 되는 것입니다.
06. 다음 코드의 실행 결과를 쓰시오.
result = 0
for i in range(5, -5, -2):
if i < -3:
result +=1
else :
result -=1
print(result)
[ 정답 ] - (-5)
range의 함수부터 보면 (시작숫자, 종료숫자, step)으로 나눠지는데 5부터 -5까지 -2만큼씩 연산을 하겠다는 의미로 보면 됩니다.
5 -> 3 i가 -3보다 크므로 result에 -1
3 -> 1 i가 -3보다 크므로 result에 -1
1 -> -1 i가 -3보다 크므로 result에 -1
-1 -> -3 i가 -3보다 크므로 result에 -1
-3 -> -5로 넘어가면서 i가 3 이하가 아니라 미만의 조건이므로 else값을 반환 받으며 -1을 연산
즉 5번의 -1을 연산을 받은 result의 값은 -5가 된다.
07. 다음 코드의 실행 결과를 쓰시오.
fruit = 'apple'
if fruit == 'Apple':
fruit = 'Apple'
elif fruit == 'fruit':
fruit = 'fruit'
else:
fruit = fruit
print(fruit)
[ 정답 ] - apple이 출력된다 연습문제 2번과 같다.
08. 다음 코드의 실행 결과를 쓰시오.
first_value = 0
second_value = 0
for i in range(1, 10):
if i is 5:
continue
first_value = i
if i is 10:
break
second_value = i
print(first_value + second_value)
[ 정답 ] - 0
참인 경우 if문은 실행되는데 continue문과 break문이 연산하기 전에 실행되므로 i값이 첫 값과 두 번째 값에 대입되지 않는다. 그러므로 두 값을 더한 경우 값을 전달받기 전에 끊겨서 초기화 된 0의 값을 그대로 갖는다
09. 다음 코드의 실행 결과를 쓰시오.
num =""
for i in range(10):
if i <= 5 and (i %2) ==0:
continue
elif i is 7 or i is 10:
continue
else :
num = str(i) + num
print(num)
[ 정답 ] - 986531
num의 경우 str형으로 선언되어있다.
if 문의 경우 짝수이면서 i가 5보다 작은 경우는 continue문을 사용해서 다음으로 넘겨준다.
elif의 경우 i가 7인 경우 또는 10인 경우에는 continue문을 이용하여 다음 연산으로 진행한다.
결국 5보다 작은 짝수와 7, 10을 제외한 값을 else문에서 더하게 되는데 str형으로 값을 전달받았기 때문에 덧셈이 아니라 문자를 이어서 작성하는 것과 같이 986531이 된다
10. 다음 함수는 작업의 상태를 나타내는 함수이다. 코드의 실행 결과를 쓰시오.
def work_status(task,worker,day):
rest_task = task
for k in range(day):
if rest_task >0:
rest_task = rest_task-worker
elif rest_task <=0:
print("Task end")
if rest_task > 0:
print("Hire more workers")
work_status(100, 11, 10)
work_status(100, 1, 10)
work_status(100, 9, 10)
work_status(100, 10, 10)
[ 정답 ]
Hire more workers
Hire more workers
work_status(100, 1, 10)과 work_status(100, 9, 10) 두 값이 출력하는 코드가 된다.
11. 다음 코드의 실행 결과를 쓰시오.
score_list = [5, 10, 15, 20, 25, 30]
sum_of_score = 0
i = 0
while i < len(score_list):
if i % 2 ==0 :
sum_of_score += score_list[i]
i +=1
print(sum_of_score)
[ 정답 ] -> 45
i가 score_list값의 길이만큼 연산을 반복 진행한다.
즉 0번부터 5번까지 6번을 반복한다.
i가 짝수인 경우에는 sum_of_score에 socre_list의 i번째 값을 더 해줍니다.
i의 값이 len즉 길이만큼 score_list의 값을 연산하므로 1보다 작을 때 5, 3보다 작을 때 15, 5보다 작을 때 25를 더합니다.
12. 다음 코드의 실행 결과를 쓰시오.
coupon = 0
money = 200000
coffee = 3500
while money > coffee:
if coupon < 4:
money = money - coffee
coupon +=1
else:
money +=2800
coupon =0
print(money)
[ 정답 ] - 2600
money가 coffee보다 값이 큰 경우 계속 반복합니다.
coupon이 4개 미만인 경우 money에서 3500원을 빼줍니다. 4번 반복됩니다.
이후 4번이 넘어가면 money에 2800원을 더해주면서 쿠폰을 초기화합니다.
이후 반복 수행하면서 손으로 이 문제를 푸는 경우 수학 덧셈 뺄셈 문제가 될 것 같습니다.
13. 다음 코드의 변수 a와 b의 숫자를 비교하여 숫자와 자리수가 같으면 ‘strike’, 숫자는 서로 포함하나 자릿수가 다르면 ‘ball’로 카운트하는 프로그램이다. 다음 프로그램의 실행 결과를 쓰시오. 또한, 결과값이 맞지 않는 이유를 쓰고, 올바른 결과값이 나오도록 코드를 수정하시오.
a = "369"
b = "693"
strike = 0
ball = 0
for number in a:
if b.count(number)>1:
if b.find(number) != a.find(number):
strike +=1
else:
ball +=1
print("Strike:",strike, "Ball:",ball)
[ 수정 된 정답 코드 ]
a = "369"
b = "388"
strike = 0
ball = 0
for number in a:
if a.count(number) == b.count(number) :
strike +=1
elif a.count(number) > b.count(number) or a.count(number) < b.count(number) :
if b.find(number) != a.find(number) :
ball +=1
print("Strike:",strike, "Ball:",ball)
[ 답 위의 코드가 맞지 않은 이유 ]
strike와 ball은 0으로 초기화 되어있고 a를 기준으로 b를 비교해서 a에 값이 b와 같은지 혹은 다른지를 스트라이크 또는 볼로 만드는 문제입니다.
위에 수정 전 코드 for문에서는 조건을 보면 b.count의 값이 1보다 큰 경우에 문자열을 찾아서 a와 비교해서 다르면 1을 증가하고 아닌 경우에는 볼을 1증가하는 조건을 줬습니다.
근데 count(number)이 같은 경우에 strike를 올리는 if문을 걸어주고 elif문에 초과하거나 미만의 조건을 걸어주면 주어진 값이 다른 경우의 ball을 사용하면 a와 b의 값이 다른 경우 정확하게 strike와 ball을 측정할 수 있습니다.
14. 다음과 같이 코드를 작성했을 때, 실행 결과로 알맞은 것은?
list_data_a = [1,2]
list_data_b = [3,4]
for i in list_data_a :
for j in list_data_b:
result = i + j;
print(result)
① 20
② 6
③ [13, 14, 23, 24]
④ [4, 5, 5, 6]
⑤ Error
[ 정답 : 2번 ] - 6
i는 리스트 a만큼 j는 b만큼 for문이 돌아가는데 for문을 따로 돌리는 경우에는 인덱스의 1, 2 이므로 2씩 값이 증가되는데 중첩 for문을 사용했으므로 i가 0 -> 1로 한번, 1 -> 2로 변할 때 한번 총 2번 j는 4번을 돌아야 하며 그 횟수 값이 result에 저장되므로 정답이 2번이 된다.
15. 다음과 같이 코드를 작성했을 때, 실행 결과로 알맞은 것은?
list_1 = [[1,2],[3],[4,5,6]]
a,b,c = list_1
list_2 = a + b + c
print(list_2)
① [1, 2, 3, 4, 5, 6]
② [[1, 2], [3], [4, 5, 6]]
③ 21
④ Error
⑤ [[1, 2], [3, 4, 5, 6]]
[ 정답 : 1번 ]
[1, 2, 3, 4, 5, 6]이 나오는 이유는 a, b, c값에 list_1를 인덱싱할 때 배열을 순차적으로 재정의 했다. 그 말은 즉 [1,2], [3]으로 정의된 값이 아닌 [1, 2, 3, 4, 5, 6]으로 배열이 순차적으로 인덱싱되었다는 의미다.
최대한 정답이라 생각할 수 있는 풀이로 개인적으로 푼 것이기 때문에 미숙한 실수 가 있을 수도 있습니다.
실수가 있는 경우에 댓글로 수정요청 부탁드립니다!
'개인 학습용 해설 > 데이터 과학을 위한 파이썬 프로그래밍' 카테고리의 다른 글
데이터 과학을 위한 파이썬 프로그래밍 6장 연습문제 개인풀이 (4) | 2021.02.06 |
---|---|
데이터 과학을 위한 파이썬 프로그래밍 5장 연습문제 개인풀이 (3) | 2021.02.04 |
데이터 과학을 위한 파이썬 프로그래밍 3장 연습문제 개인풀이 (4) | 2020.10.14 |
데이터 과학을 위한 파이썬 프로그래밍 2장 연습문제 개인풀이 (9) | 2020.10.13 |
데이터 과학을 위한 파이썬 프로그래밍 1장 연습문제 개인풀이 (0) | 2020.10.12 |