반복문 확인문제 풀이_01

김세포·2022년 6월 27일

Study Memo

목록 보기
3/6

혼자 공부하는 파이썬 4강: 반복문

📌 04-3 확인문제 02.

리스트를 조합해 하나의 딕셔너리로 만들기

key_list = ["name", "hp", "mp", "level"]
value_list = ["기사", 200, 30, 5]
character = {}

print(character)
실행결과
{'name': '기사', 'hp': 200, 'mp': 30, 'level': 5}

📝 정답

key_list = ["name", "hp", "mp", "level"]
value_list = ["기사", 200, 30, 5]
character = {}

for i in range(0, len(key_list)):
    character[key_list[i]] = value_list[i]

print(character)

보기로 준 두 리스트의 길이가 같기 때문에 길이로 범위를 정해서 반복문을 돌리면 된다. character[key_list[i]] 는 딕셔너리 character 안에 키를 넣는 부분이고, value_list[i]는 키 값을 넣는다고 생각하면 된다.


📌 04-3 확인문제 03.

1부터 숫자를 하나씩 증가시키면서 더하는 경우, 몇을 더할 때 1000을 넘는지와 그때의 값을 출력하기
ex) 1, 1 + 2 = 3, 1 + 2 + 3 = 6, ...

# 10000이 넘는 경우를 구한 예시
limit = 10000
i = 1

print("{}를 더할 때 {}을 넘으며 그때의 값은 {}입니다.".format(i-1, limit, sum_value))
실행결과
141를 더할 때 10000을 넘으며 그때의 값은 10011입니다.

📝 정답

limit = 1000
i = 1
sum_value = 0

while sum_value < limit:
    sum_value += i
    i += 1

print("{}를 더할 때 {}을 넘으며 그때의 값은 {}입니다.".format(i-1, limit, sum_value))
실행결과
45를 더할 때 1000을 넘으며 그때의 값은 1035입니다.

몇 번을 반복하면 되는지 알고 있는 경우엔 for문, 지금 문제처럼 얼마나 반복해야 할 지 모를 땐 while문 사용.
sum_value가 limit보다 작을 때까지 반복하는 거라 limit보다 커지는 순간 반복종료 후, 출력.


📌 04-3 확인문제 04.

1~100의 숫자를 다음과 같이 계산한다고 했을 때, 값이 최대가 되는 경우의 숫자를 구하기
ex) 1 x 99, 2 x 98, 3 x 97, 4 x 96 ... 98 x 2, 99 x 1

max_value = 0
a = 0
b = 0

print("최대가 되는 경우: {} * {} = {}".format(a, b, max_value))
실행결과
최대가 되는 경우: 50 * 50 = 2500

📝 정답

max_value = 0
a = 0
b = 0

for i in range(1, 99+1):
    j = 100 - i
    
	#최댓값 구하기
    if max_value < i * j:
        max_value = i * j
        a = i
        b = j

print("최대가 되는 경우: {} * {} = {}".format(a, b, max_value))

i가 1부터 99까지 범위의 수로 차례대로 실행되며 조건문에서 max_value의 값이 계속 변경되다가 최댓값에서 더 큰 수가 없기 때문에 변경되지 않고 종료된다.
풀어서 쓰면,

i가 1일 때,
max_value < 1 x 99 → 여기서 max_value값이 아직 0이기 때문에
max_value = 1 x 99 → max_value값이 99로 변경된다.
i가 2일 때,
99(max_value) < 2 x 98 → 여기서 max_value값이 더 적기 때문에
99(max_value) = 2 x 98 → max_value값이 196으로 변경된다.
i가 3일 때,
196 < 3 x 97
196 = 3 x 97
.
.
.

이런 식으로 진행된다고 보면 된다. 그리고 더 변경될 수 없을 때(더 큰 수가 나올 수 없을 때) 반복이 종료 되며 a와 b의 값에 최댓값이 나온 수가 들어가게 된다.


📌 04-4 확인문제 02.

1~100 사이의 숫자 중 2진수로 변환했을 때 0이 하나만 포함된 숫자와 그 숫자들의 합을 구하기

output = 

for i in     ?     :
    print("{} : {}".format(i, "{:b}".format(i)))
print("합계 :", sum(output))
실행결과
2 : 10
5 : 101
6 : 110
11 : 1011
13 : 1101
14 : 1110
23 : 10111
27 : 11011
29 : 11101
30 : 11110
47 : 101111
55 : 110111
59 : 111011
61 : 111101
62 : 111110
95 : 1011111
합계 : 539

📝 정답

output = [number for number in range(1, 100+1) if "{:b}".format(number).count("0") == 1]

for i in output:
    print("{} : {}".format(i, "{:b}".format(i)))
print("합계 :", sum(output))

'count()'는 매개변수에 있는 문자열이 주어진 전체 문자열에 몇 개가 있는지 세어주는 함수이다.
리스트 컴프리헨션을 사용해서 쓰게 되면 output에 반복문과 조건문을 한 줄의 코드로 쓸 수 있다.

List Comprehensions : 반복문과 조건문을 대괄호'[ ]' 안에 넣는 형태를 사용해서 리스트를 생성하는 파이썬의 특수한 구문이다.

리스트 컴프리헨션을 풀어서 코드를 재작성 하면,

output = 0 #합계를 내기 위한 변수

for number in range(1, 100+1):
#1부터 100까지의 수(= number)를 반복
    if "{:b}".format(number).count("0") == 1:
    #2진수로 변경 되었을 때 0이 한 개인 10진수(= number)를 구하는 조건
        print("{} : {:b}".format(number, number))
        output += number
        #0인 output에 위의 조건에 해당하는 number를 반복되면서 더함
print("합계 : {}".format(output))

이러한 내용이 된다. output은 합계를 내기 위한 변수로 두고, number가 1~100까지의 수로 반복이 되면서 if 조건을 충족 후, 출력. 출력 후에는 아까 변수로 둔 output에 number가 추가로 더해지며 최종 반복이 끝났을 때 합계로 출력되게 된다.

🌼 2진수, 8진수, 16진수로 변환하는 코드

# 10진수를 2진수로 변경
>>> "{:b}".format(10)
'1010'  # --> 변환 했을 때 따옴표로 둘러싸여 있다면 문자열 자료형

# 2진수를 10진수로 변경
>>> int("1010", 2)
10

# 10진수를 8진수로 변경
>>> "{:o}".format(10)
'12'

# 8진수를 10진수로 변경
>>> int("12", 8)
10

# 10진수를 16진수로 변경
>>> "{:x}".format(10)
'a'

# 16진수를 10진수로 변경
>>> int("10", 16)
16
profile
이제서야 겨우 만들어진 개발세포

0개의 댓글