[오늘의 문제] 파이썬 반복문, 자료구조

shlim55·2025년 11월 4일

코딩테스트

목록 보기
167/223

1. 과일 가격 출력하기

문제 설명:

과일 이름이 담긴 리스트가 주어집니다. for문을 사용하여 각 과일을 순서대로 출력하되, "N번째: 과일이름" 형식으로 출력하세요. (N은 1부터 시작)

입력 예시:

입력 없음

출력 예시:

1번째: 사과
2번째: 바나나
3번째: 포도
4번째: 오렌지

내가 작성한 코드문

fruits = ["사과", "바나나", "포도", "오렌지"]
for i in range(len(fruits)):
    print(f"{i+1}번째: {fruits[i]}")

2. 구구단 출력하기

문제 설명:

사용자로부터 2~9 사이의 숫자를 입력받아, 해당 단의 구구단을 출력하세요.
range 함수를 사용하여 1부터 9까지 반복하세요.

입력 예시:

5

출력 예시:

5 x 1 = 5
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45

내가 작성한 코드문

num = int(input("2~9사이 숫자를 입력하세요: "))

for i in range(1, 10):
    print(f"{num} X {i} = {num*i}")

3. 카운트다운

문제 설명:

사용자로부터 숫자를 입력받아, 해당 숫자부터 0까지 카운트다운을 출력하세요. 0이 되면 "발사!"를 출력하고 종료합니다.

입력 예시:

5

출력 예시:

5
4
3
2
1
0
발사!
내가 작성한 코드문
num = int(input("숫자를 입력하세요: "))

while num >= 0:
    print(num)
    num -=1

print("발사!")

4. 좌표 관리

문제 설명:

서울, 부산, 대구 세 도시의 좌표를 튜플로 저장하세요. 각 좌표는 (위도, 경도) 형태입니다. 사용자로부터 도시 이름을 입력받아 해당 도시의 좌표를 출력하세요.

입력 예시:

부산

출력 예시:

부산의 좌표: (35.1796, 129.0756)
위도: 35.1796
경도: 129.0756

내가 작성한 코드문

seoul = (37.5665, 126.9780)
busan = (35.1796, 129.0756)
daegu = (35.8714, 128.6014)
tp = tuple(zip(seoul, busan, daegu)) 
print(tp)
area = input("지역을 입력하세요: ")
if area == "서울":
    print(f"{area}의 좌표: {tp[0][0], tp[1][0]}")
    print(f"위도: {tp[0][0]}")
    print(f"경도: {tp[1][0]}")
elif area == "부산":
    print(f"{area}의 좌표: {tp[0][1], tp[1][1]}")
    print(f"위도: {tp[0][1]}")
    print(f"경도: {tp[1][1]}")
else:
    print(f"{area}의 좌표: {tp[0][2], tp[1][2]}")
    print(f"위도: {tp[0][1]}")
    print(f"경도: {tp[1][1]}")

zip으로 3개의 튜플을 하나로 묶었다.

다른 사람의 풀이

seoul = (37.5665, 126.9780)
busan = (35.1796, 129.0756)
daegu = (35.8714, 128.6014)

city = input()

if city == "서울":
    coord = seoul
elif city == "부산":
    coord = busan
else:
    coord = daegu

print(f"{city}의 좌표 {coord}")
print(f"위도: {coord[0]}")
print(f"경도: {coord[1]}")

zip을 안써도 되는 풀이다.

더 간결하고 정말 이렇게 해도 된다.
seoul, busan 이렇게만 받아도 튜플을 출력할 수 있다.

5. 전화번호부 만들기

문제 설명:

3명의 이름과 전화번호를 입력받아 딕셔너리에 저장하세요. 그 후 사용자로부터 이름을 입력받아 해당 이름의 전화번호를 출력하세요. 이름이 없으면 "등록되지 않은 이름입니다."를 출력하세요.

입력 예시:

김철수
010-1234-5678
이영희
010-2345-6789
박민수
010-3456-7890

이영희

출력 예시:

이영희의 전화번호: 010-2345-6789

입력 예시:

김철수
010-1234-5678
이영희
010-2345-6789
박민수
010-3456-7890

홍길동

출력 예시:

등록되지 않은 이름입니다.

내가 작성한 코드문

a,b,c = list(map(str, input("이름을 입력하세요: ").split()))
x,y,z = list(map(str, input("전화번호를 입력하세요: ").split()))
name = a,b,c
phone = x,y,z

dic = dict(zip(name, phone))

find_name = input("이름을 입력하세요: ")
print(find_name)
if find_name in dic:
    print(dic[find_name])
else:
    print("등록되지 않은 이름입니다.")

input().split을 쓴 방법이다. 오늘 배운거 한번 써보고 싶었다.

다른 사람의 풀이

phone_book = {}
for i in range(3):
    name = input()
    phone = input()
    phone_book[name] = phone

search = input()

if search in phone_book:
    print(f"{search}의 전화번호 {phone_book[search]}")
else:
    print("등록되지 않은 이름입니다.")

반복문을 통한 인풋을 하고 키가 딕셔너리에 있을시 딕셔너리의 키와 값을 출력

6. 재고 관리 시스템 (딕셔너리 + 반복문)

문제 설명:

상품명을 key, 재고 수량을 value로 하는 딕셔너리가 주어집니다.

  • 전체 재고를 출력하세요.
  • 재고가 10개 미만인 상품을 찾아 "부족" 표시와 함께 출력하세요.
  • 전체 재고의 총 합계를 출력하세요.

입력 예시:

입력 없음

출력 예시:

=== 전체 재고 현황 ===
노트북: 15개
마우스: 8개
키보드: 12개
모니터: 5개
헤드셋: 20개

=== 재고 부족 상품 ===
마우스: 8개 (부족)
모니터: 5개 (부족)

총 재고: 60개

내가 작성한 코드문

inventory = {
    "노트북": 15,
    "마우스": 8,
    "키보드": 12,
    "모니터": 5,
    "헤드셋": 20
}

print("=== 전체 재고 현황 ===")
for i in inventory:
    print(f"{i}: {inventory[i]}개")

print("=== 재고 부족 상품 ===")
for i in inventory:
    if inventory[i] < 10:
        print(f"{i}: {inventory[i]}개 (부족)")

count = 0
for i in inventory.values():
    count += i
print("")
print(f"총 재고: {count}개")

다른 사람의 풀이

inventory = {
    "노트북": 15,
    "마우스": 8,
    "키보드": 12,
    "모니터": 5,
    "헤드셋": 20
}

total = 0
for product, quantity in inventory.items():
    print(f"{product}: {quantity}개")

for product, quantity in inventory.items():
    total += quantity
    if quantity < 10:
        print(f"{product}: {quantity}개 (부족)")
print(f"총 재고: {total}개")

반복문을 두개만 썼으며 두번째 반복문에서 total값도 계산하며 .items()로 키, 밸류값 두개를 출력한다.

7. 짝수/홀수 분류

문제 설명:

1부터 20까지의 숫자 중에서 짝수만 출력하되, 10 이상인 짝수는 "큰 짝수: N"으로, 10 미만인 짝수는 "작은 짝수: N"으로 출력하세요.

입력 예시:

입력 없음

출력 예시:

작은 짝수: 2
작은 짝수: 4
작은 짝수: 6
작은 짝수: 8
큰 짝수: 10
큰 짝수: 12
큰 짝수: 14
큰 짝수: 16
큰 짝수: 18
큰 짝수: 20

내가 작성한 코드문

for i in range(1, 21):
    if i % 2 == 0 and i >= 10:
        print(f"큰 짝수: {i}")
    if i % 2 == 0 and i < 10:
        print(f"작은 짝수: {i}")

다른 사람의 풀이

for num in range(1, 21):
    if num % 2 == 0:
        if num >= 10:
            print(f"큰 짝수: {num}")
        else:
            print(f"작은 짝수: {num}")

이중 조건문을 쓴 풀이 짝수이면서, 10 이상이다, 미만이다 이것을 좀더 간결하게 쓴 코드문.

8. 업다운 게임

문제 설명:

정답 숫자를 미리 정해두고(예: 42), 사용자가 숫자를 입력할 때마다 "Up" 또는 "Down" 힌트를 주세요. 정답을 맞추면 "정답입니다! N번 만에 맞추셨습니다."를 출력하고 종료하세요.

Hint: while문 + break

입력 예시:

정답: 42

50
30
40
42

출력 예시:

Down!
Up!
Up!
정답입니다! 4번 만에 맞추셨습니다.

내가 작성한 코드문

# 원하는 정답 숫자를 하나 정하세요!
answer = int(input("정답: "))

count = 1
while True:
    usr = int(input("숫자를 입력하세요: "))
    if usr > answer:
        print("Down!")
        count += 1
    elif usr < answer:
        print("Up!")
        count += 1
    else: 
        print(f"정답입니다! {count}번 만에 맞추셨습니다.")
        break

다른 사람의 풀이

# 원하는 정답 숫자를 하나 정하세요!
answer = 42
count = 0

while True:
    guess = int(input("숫자를 입력하세요: "))
    count += 1
    
    if guess == answer:
        print(f"정답입니다! {count}번 만에 맞추셨습니다.")
        break
    elif guess > answer:
        print("Down!")
    else:
        print("Up!")

count를 인풋 입력하고 나서 한번 +1 되게 했다.
더 간결해보임

9. ATM 시뮬레이션

문제 설명:

초기 잔액 100,000원으로 시작하는 ATM 프로그램을 while문 무한 루프와 break를 활용하여 만드세요. 각 메뉴에 해당하는 번호를 입력 받고:

  1. 현재 잔액 조회
  2. 입금: 입금액을 추가로 입력받습니다. (잔액에 추가)
  3. 출금: 출금액을 추가로 입력받습니다. (잔액에서 차감) (잔액 부족 시 에러 메시지)
  4. 종료

"4"를 입력하면 프로그램을 종료합니다.

입력 예시:

1
2
50000
1
3
30000
1
4

출력 예시:

=== ATM ===
1. 잔액 조회
2. 입금
3. 출금
4. 종료
선택: 1
현재 잔액: 100000원

선택: 2
입금액: 50000
입금 완료! 현재 잔액: 150000원

선택: 1
현재 잔액: 150000원

선택: 3
출금액: 30000
출금 완료! 현재 잔액: 120000원

선택: 1
현재 잔액: 120000원

선택: 4
ATM을 종료합니다.

내가 작성한 코드문

print("=== ATM ===")

print("1. 잔액 조회")
print("2. 입금")
print("3. 출금")
print("4. 종료")

money = 100000

while True:
    num = int(input("번호를 입력하세요: "))
    
    if num == 1:
        print(f"선택: {num}")
        print(f"현재 잔액: {money}")
    elif num == 2:
        print(f"선택: {num}")
        money += int(input("입금을 합니다: "))
        print(f"입금완료! 현재 잔액: {money}")
    elif num == 3:
        print(f"선택: {num}")
        money -= int(input("출금을 합니다: "))
        print(f"출금완료! 현재 잔액: {money}")
    elif num == 4:
        print(f"선택: {num}")
        print("종료합니다.")
        break

while True 무한루프가 아닌
조건문을 달고 4번을 누를시 종료 되게 하는 방법도 있음.

다른 사람의 풀이

balance = 100000
print("\n=== ATM ===")
print("1. 잔액 조회")
print("2. 입금")
print("3. 출금")
print("4. 종료")
while True:
    choice = input("선택: ")
    
    if choice == "1":
        print(f"현재 잔액: {balance}원")
    
    elif choice == "2":
        amount = int(input("입금액: "))
        balance += amount
        print(f"입금 완료! 현재 잔액: {balance}원")
    
    elif choice == "3":
        amount = int(input("출금액: "))
        if amount > balance:
            print(f"잔액이 부족합니다. (현재 잔액: {balance}원)")
        else:
            balance -= amount
            print(f"출금 완료! 현재 잔액: {balance}원")
    
    elif choice == "4":
        print("ATM을 종료합니다.")
        break
    
    else:
        print("올바른 번호를 선택해주세요.")

잔액 부족할때 출금 안되게 하는 경우 추가

elif num == 3:
        print(f"선택: {num}")
        withdraw_amount = int(input("출금을 합니다: "))
        if money >= withdraw_amount:
            money -= withdraw_amount
            print(f"출금완료! 현재 잔액: {money}")
        else:
            print(f"잔액이 부족합니다. (현재 잔액: {money}원)")

이런식으로 리팩토링 하기

미니 프로그램: 온라인 투표

문제 설명:

3명의 후보자에 대한 투표를 진행합니다.

  • 3명의 후보자 이름을 입력받고, 각 후보의 득표수를 0으로 초기화하세요.
  • 10명의 투표자가 투표를 진행합니다. 후보 이름을 입력받아 득표수를 증가시키세요.
  • 등록되지 않은 이름을 입력하면 무효표로 카운트하세요.
  • 투표 종료 후 각 후보의 득표수를 출력하세요.
  • 가장 많은 표를 받은 후보를 찾아 당선자로 발표하세요.

Hint: 후보자에 대한 득표수를 딕셔너리로 만드세요! {후보자:득표수}

입력 예시:

김철수
이영희
박민수

김철수
이영희
김철수
박민수
이영희
김철수
이영희
최지은
김철수
이영희

출력 예시:

=== 투표 결과 ===
총 투표자: 10명
유효 투표: 9표
무효 투표: 1표

=== 후보별 득표 현황 ===
김철수: 4표
이영희: 4표
박민수: 1표

=== 당선자 발표 ===
김철수 후보가 당선되었습니다! (득표수: 4표)

내가 작성한 코드문

# 1단계: 3명의 후보자 입력받기
x, y, z = input("이름을 입력하세요: ").split()
person = {}
person[x] = 0
person[y] = 0
person[z] = 0
print(person) 

# 2단계: 10명의 투표 진행
count = 0
for i in range(10):
    name = input()
    if name in person:
        person[name] += 1
        print(name)
        count += 1
    else:
        pass
    
# 3단계: 투표 결과 출력
print("=== 투표 결과 ===")
print(f"총 투표자: 10명")
print(f"유효 투표: {count}표")
print(f"무효 투표: {10 - count}표")


# 4단계: 후보 별 득표 현황 출력
print("=== 후보 별 득표 현황 ===")
print(f"{x}: {person[x]}표")
print(f"{y}: {person[y]}표")
print(f"{z}: {person[z]}표")

# 5단계: 당선자 찾기 및 출력
max = 0
winner = ""
for i, j in person.items():
    if j > max:
        max = j
        winner = i
print("=== 당선자 발표 ===")
print(f"{winner}후보가 당선되었습니다! (득표수:{person[winner]}표)")       

다른 사람의 풀이

# 1단계: 3명의 후보자 입력받기
candidates = {}

for i in range(3):
    name = input()
    candidates[name] = 0
# 2단계: 10명의 투표 진행
invalid_votes = 0
for i in range(10):
    vote = input()

    if vote in candidates:
        candidates[vote] +=1
    else:
        invalid_votes += 1

# 3단계: 투표 결과 출력
print(f"총 투표자: 10명")
print(f"유효 투표: {10 - invalid_votes}표")
print(f"무효 투표: {invalid_votes}표")
# 4단계: 후보 별 득표 현황 출력
for name, votes in candidates.items():
    print(f"{name}: {votes}표")
# 5단계: 당선자 찾기 및 출력
max_votes = 0
winner = ""

for name, votes in candidates.items():
    if votes > max_votes:
        max_votes = votes
        winner = name

print(f"{winner} 후보가 당선되었습니다! (득표수: {max_votes}표)")

후보자 입력을 반복문으로 하고,
무효표라는 변수까지 만들어서 카운트 했다.
그 다음 유효표 = 10 - 무효표로 표시한점이 달랐다.

투표 결과 출력도 반복문 .item()을 활용해서
후보와 득표를 출력하고,

마지막에 당선자와 득표수도 딕셔너리내 밸류값이 아닌
max_votes로 출력해낸것이 달랐다.

profile
A Normal Programmer

0개의 댓글