TIL

내일배움캠프 본캠프 2일차 - 프로그래머스 파이썬 문제 풀기

수현조 2024. 11. 26. 21:14

파이썬 라이브러리 강의를 듣다가
어느 순간, 어..? 나 그냥 타자 연습 하고 있잖아..? 하는 생각이 들었다..

사전캠프에서 강의를 듣긴 했지만, 아직 체화가 되지 않아서
구문만 봐도 이해가 안되는데 Numpy와 Pandas의 많은 기능까지 추가하려니
밑 빠진 독에 물 붓기 같은 느낌이랄까..?

그래서 사전캠프 때의 파이썬 문제를 풀어보기로 했다!

랜덤한 닉네임 생성하는 문제였는데,

  1. 사용자는 최소 27가지 이상의 닉네임 중 하나를 랜덤으로 print 할 수 있습니다. (아래의 키워드를 사용해주세요!)
    • 기철초풍, 멋있는, 재미있는
    • 도전적인, 노란색의, 바보같은
    • 돌고래, 개발자, 오랑우탄

난, 이 문제를 보자 마자 '모르겠는데' 그랬다.
기초는 어디있나요? 없어요.

그래서 또 지피티한테 물어봤다...
지피티는 아주 빠르게 코드를 짜 주었고,
나는 그 코드에서 모르는 것들을 물어보았다..😭

일단 지피티가 코드 짜준 거...

난 사태의 심각성을 깨달았다.

그렇다. 난 f-string이 뭔지 모르고 있었다.

내가 모르는 것을 잘 가르쳐 주는 gpt

오늘 알게 된 것들을 적으려면 좀 길다.

f-string의 기본 문법

  • 문자열 앞에 f 또는 **F**를 붙여 사용합니다.
  • 중괄호 {} 안에 변수나 표현식을 넣어 문자열에 삽입합니다.
 

name = "Alice
age = 25 

# f-string을 사용한 문자열 포매팅
greeting = f"My name is {name} and I am {age} years old."
print(greeting)   # 결과: My name is Alice and I am 25 years old.

딱 봐도 f string이 더 간결하고 읽기가 쉽다

정리

  • f-string은 문자열에 변수와 표현식을 포함할 때 가장 간단하고 효율적인 방법입니다.
  • Python 3.6 이상에서 사용 가능하며, 직관적이고 가독성이 좋아 많이 사용됩니다.

 

그리고 정말 정말 그냥. 이 왕초보를 위한 파이썬을. 계속 공부해야겠다고 생각해서...
하나 하나 다시 읽으면서 실습하기 시작했다.

1.2.1 연습 문제: 파일 크기 계산

문제

파일을 다운로드할 때의 평균 속도(average rate)를 r이라 하고, 다운로드하는 데 걸린 시간(time)을 t라고 할 때, 다운로드한 파일의 용량은 r×t로 계산할 수 있습니다.

다운로드 속도가 초당 800kB이고 다운로드하는 데 걸린 시간이 110초라고 할 때, 다운로드한 파일의 크기는 몇 MB일까요? 단, 1MB=1000kB로 계산합니다.

여기서 난 또 헤매고 말았따..
도와줘 지피티야~~~~

# 주어진 값
r =
800 # 다운로드 속도 (kB/s)
t =
110 # 다운로드 시간 (초) # 파일 크기 계산
file_size_kb = r * t
# 파일 크기 (kB)
file_size_mb = file_size_kb /
1000 # 파일 크기 (MB)
print(f"다운로드한 파일의 크기는 {file_size_mb} MB입니다.")

어떻게 계산하는지는 당연히 알아도 쓰려고 하니까 아무 것도 떠오르지가 않는 경험을 했다.
그리고 지피티가 알려준 답을 보니까... 할만한데? 싶어, 다음 문제를 봤다.

1.6.1 연습 문제: 제곱

문제

사용자에게 정수를 입력받아, 그 수의 제곱을 계산해 출력하는 파이썬 스크립트를 작성하세요.

내가 쓴 답보다 예쁜 지피티의 답을 보라.

# 사용자에게 정수 입력 받기
num = int(input("정수를 입력하세요: ")) # 입력받은 정수의 제곱 계산
square = num ** 2 # 결과 출력
print(f"{num}의 제곱은 {square}입니다.")

 
근데...여기서 square가 왜 나오지.... 스퀘어는 네모잖아... 모지...그래서 물어봤더니..
네모도 맞지만 제곱으로 쓰인댄다... 부족한 영어실력 다 들켰다
 
아 됐고. 알겠어. 다음문제 고고!

2.1.1 연습 문제: 입력받은 숫자만큼 반복하기(while)

문제

input()으로 사용자로부터 정수를 한 개 입력받아, 그 숫자를 숫자 크기만큼 반복해서 출력하는 파이썬 스크립트를 작성하세요.
이 때 출력 앞에 공백을 한 칸 주어서, 입력과 출력이 구분되게 합니다.
단, while 문을 사용하세요.

문제는 공백을 한 칸 주라고 하는데, 출력된 예시는 줄바꿈 처리가 되어있었다.

그래서 두개 다 했다.

 # 공백 한 칸 준 것
num = int(input("정수를 입력하세요: ")) # 사용자로부터 정수를 입력받기
# 초기값 설정
count = 1 # 1부터 시작해서 num까지 반복 #
while문을 이용해 입력받은 숫자를 반복 출력
print("출력:", end=" ") # 출력 앞에 공백 추가
while count <= num: # count가 num보다 작거나 같은 동안 반복
    print(num, end=" ") # 입력된 숫자를 출력
    count += 1

 

# 줄바꿈 처리
# num = int(input("정수를 입력하세요: "))
count =
1 # 반복 횟수를 추적하는 변수 초기화
print("출력:") while count <= num: # count가 num 이하일 때까지 반복
print(num) # num을 출력 count += 1 # count를 1씩 증가

 

사실 그냥 출력 뒤의 ,end=" "가 있나 없나의 차이였다.
난 몰랐지만...

 

2.1.2 연습 문제: 제곱표(while)

문제

정수를 한 개 입력받아, 1부터 입력받은 수까지 각각에 대해 제곱을 구해 프린트하는 프로그램을 작성해 보세요.
단, while 문을 사용하세요.

출력이 별로 맘에 안든다.. 어려워 보인다.

 

잘 해냈다. 훗

til쓰기 귀찮아졌냐고? 조금 맞다.

다음문제 ㄱㄱ

2.1.3 연습 문제: 얌체공

문제

고무 공을 100 미터 높이에서 떨어뜨리는데, 이 공은 땅에 닿을 때마다 원래 높이의 3/5 만큼 튀어오릅니다. 공이 열 번 튈 동안, 그때마다 공의 높이를 계산합니다.
round() 함수를 사용해서, 다음과 같이 소수점 아래 네 자리까지 출력해 보세요.

와... 근데 이건 진짜 앞이 깜깜하더라

수치스러운 나의 질문

문제점

  1. num 값이 업데이트되지 않음:
    • num은 공이 튀어오를 때마다 원래 높이의 3/5(0.6)로 줄어들어야 하지만, 코드에서는 num 값을 업데이트하지 않고 있습니다.
  2. print() 구문에 잘못된 쉼표 사용:
    • Python 3에서는 print() 구문에서 쉼표(,)를 사용할 수 없습니다. 필요 없는 쉼표를 제거하세요.
  3. 루프 조건 오류:
    • i는 0부터 시작하여 10까지 총 11번 반복해야 하므로 i <= 10은 올바릅니다. 그러나 첫 번째 계산에서 num 값을 출력해야 하는 요구사항에 따라 초기 높이도 포함되어야 합니다.
  4. 소수점 계산 결과를 반올림하지 않음:
    • 출력값을 반올림하려면 round() 함수를 사용해야 합니다.

 

# 초기 높이 설정
num = 100

# 초기값 설정
i =
1 # 1번 튕기는 것부터 시작

while i <= 10:
    num = num *
0.6    # 높이를 3/5로 줄이기.
    print(f"{i} {round(num, 4)} ") # 소수점 4자리로 반올림하여 출력
    i += 1

 

이제 f"이것도 알고, 그래도 괜찮다 발전하고 있다 뭐 그런 생각을 했다.
print가 i 앞에 있냐 뒤에 있냐 이것도 헷갈려서 여러 번 봤다. ㅎ..

다음문제 ㄱ

2.2.1 연습 문제: 숫자 읽기(1~3)

문제

input()을 사용해 사용자로부터 입력받은 숫자를 한글로 출력하는 프로그램을 작성하세요. 단, 사용자는 1 이상 3 이하의 정수 중 하나를 입력한다고 가정합니다.

예) 입력 : 1 / 출력 : 일
     입력 : 2 / 출력 : 이
     입력 : 3 / 출력 : 삼

이건 처음에 아 이건 할 수 있지 ㅎ 하면서 풀었는데..

틀렸대서 바로 지피티 찾아감

응... 비교 연산자가 ==였지 =이 아니라...

고침ㅎ

다른 사람들이 댓글에 엄청 잘 풀어놨길래 지피티 보여주니까 리스트를 사용한 거라고 그러고, 리스트에 대해서도 공부했다.

천사 지피티

그랬다.ㅎ 지피티는 천사다.

Tip: 잘하려면 작은 목표부터!

  1. 작은 코드부터 시작:
    • 한 번에 복잡한 걸 하려 하지 말고, 간단한 조건문부터 연습해 보세요.
  2. 문제를 쪼개기:
    • "내가 지금 뭘 하고 싶은지"를 생각하고 그걸 한 줄씩 구현해 보세요.
  3. 다른 사람 코드 보고 배워도 OK!:
    • 다른 사람 코드 보는 건 아주 좋은 학습 방법이에요. 대신, 그걸 스스로 바꿔보는 연습도 해보세요.

마음가짐

  • 못하는 게 당연합니다.
    처음부터 잘하는 사람은 없어요. 배우고 있는 지금이 성장하는 과정이에요!
  • 비교하지 말고 자신과 비교하세요.
    오늘 배운 것들이 어제보다 조금이라도 늘었다면, 이미 잘하고 계신 거예요.

어려운 점이 있으면 언제든 물어보세요! 항상 도와드릴게요. 같이 배우는 거니까요! 🚀😊

 

구래구래...

다음문제 ㄱㄱ

2.2.2 연습 문제: 나이에 따른 세대 구분 (1)

문제

input()으로 사용자의 나이를 입력받은 후, 다음 표의 어느 세대에 속하는지 출력하세요. 입출력 문구는 자유롭게 지으면 됩니다.

 

사실 좀 자신만만하게 풀었는데

아 자꾸 틀렸다함 ㅠㅠ
난 밀레니얼 세대란다

int(input()) int 빼먹어서!!!!!!!

근데 좀 정답은 좀 달랐다.

프린트가 한 번 밖에 없는 모습
우리집 지피티는 천사여 천사

작성한 코드와의 차이점

  1. gen 변수 도입:
    • 답안 코드에서는 gen이라는 변수를 사용해 세대 이름을 저장합니다.
    • 이 방식은 가독성을 높이고, 조건에 따라 처리된 결과를 한 번만 출력하는 장점이 있습니다.
    • 작성한 코드에서는 조건마다 print()를 호출했기 때문에 출력 로직이 중복되었습니다.
  2. 가독성 향상:
    • 조건마다 세대 이름을 변수 gen에 저장한 뒤, 마지막에 한 번만 출력합니다.
    • 코드가 길어졌을 때 출력 부분이 한 곳에 모여 있으면 유지보수가 더 쉬워집니다.

비슷한 점

  • 논리 구조는 똑같이 작동합니다.
  • 정수 변환을 추가한 부분도 동일합니다.

코드 작성 능력 피드백

  1. 굉장히 잘 하셨어요!
    작성하신 코드는 답안 코드와 거의 동일한 논리를 가졌고, 작은 차이만 있었어요.
  2. 개선 포인트를 생각하신다면:
    • 중복된 코드를 줄이기 위해 gen 같은 변수를 사용하는 방식을 활용하면 더 간결하고 유지보수가 쉬운 코드를 작성할 수 있습니다.
  3. 결론적으로:
    • 답안 코드와 거의 같은 수준입니다. 앞으로는 "가독성"이나 "효율성"을 고민하면서 발전하면 금방 능숙해질 거예요!

정리

"나도 근접했어"라는 생각이 정확합니다! 😊 지금 이미 훌륭한 코드를 작성하셨고, 약간의 수정만으로 답안 코드와 동일한 결과를 얻을 수 있었어요. 앞으로도 자신감을 가지고 하나씩 해보세요. 정말 잘하고 계십니다! 🚀👏

추가 질문이 있다면 언제든 물어보세요! 😊

 

따숩다 따수워

그럼 gen=None이라고 한 게 변수로 둔다는 거야?

맞아요! 😊 **gen = None**은 변수를 초기화하는 과정이에요. 이 변수를 **"세대 이름을 저장하기 위한 공간으로 사용"**하려고 미리 정의해 둔 겁니다.

  • gen = None: gen이라는 변수를 초기화하고, 조건문에서 값을 할당하기 전까지는 비어 있는 상태로 둔다는 뜻이에요.
  • 이를 통해 코드를 더 깔끔하고 유지보수하기 쉽게 만들 수 있습니다.

혹시 다른 부분도 궁금하다면 편하게 물어보세요! 😊

 

응 다음 문제 ㄱㄱ

2.2.3 연습 문제: 단위 기호

문제

1. 백만 이상의 숫자를 입력받았을 때 1~10만자리 숫자를 생략하고 ‘M’을 붙여서 출력하게 코드를 수정해 보세요.

2. 성공했다면, 그 이상도 구현해 보세요(10의 승수 단위 참조).

유일하게 한 번에 성공함 ㅋㅋ
저는 칭찬에 굶주려 있어요

 

다음 문제 ㄱㄱ

2.2.4 연습 문제: 양수만 덧셈하기

문제

input()으로 사용자로부터 입력받은 정수를 계속 더해나가다가, 음수가 입력되면 중단하고 그 전까지 계산한 값을 출력하는 파이썬 스크립트를 작성하세요.

입력:

1
2
3
-1

출력:

6

예 2

입력:

50
60
70
-100

출력:

180

어 이게 복붙이 되네

아무튼

바로 멍충미 폭발함

맞아요! 반복적으로 입력을 처리하고, 음수가 입력되었을 때 중단하려면 while 문을 사용하는 것이 적합합니다.
아래에 문제를 해결할 수 있는 코드를 작성해드릴게요.

result = 0 # 결과를 저장할 변수
while True: # 무한 루프
    num =
int(input("정수를 입력하세요: ")) # 사용자로부터 정수 입력받기
    if num < 0: # 음수가 입력되면 중단
        break
    result += num # 양수라면 결과에 더함
print(f"총합: {result}")

오키오키

아홉시다 빨리 해

2.2.5 연습 문제: 윤년 판별하기

문제

윤년은 역법을 실제 태양년에 맞추기 위해 여분의 하루 또는 월을 끼우는 해입니다. 현재 사용하는 그레고리력의 윤년 규칙은 다음과 같습니다.

  1. 서력 기원 연수가 4로 나누어 떨어지는 해는 윤년으로 한다. (1988년, 1992년, 1996년, 2004년, 2008년, 2012년, 2016년, 2020년, 2024년, 2028년, 2032년, 2036년, 2040년, 2044년 ...)
  2. 서력 기원 연수가 4, 100으로 나누어 떨어지는 해는 평년으로 한다. (1900년, 2100년, 2200년, 2300년, 2500년...)
  3. 서력 기원 연수가 4, 100, 400으로 나누어 떨어지는 해는 윤년으로 둔다. (2000년, 2400년...)
    출처: 위키백과

이 규칙을 나타내는 흐름도를 그려보았습니다.1

이 규칙에 따라, 연도를 나타내는 정수를 입력으로 받아서 윤년인지 아닌지 출력하는 프로그램을 작성해 보세요.

나 이거 보고 뇌가 잠시 멈추는 것 같았다.

지피티한테 윤년을 쉽게 설명해달라고 해서 이해했다.(머리가 좀 좋지 않은 것 같다)

내가 태어난 해는 평년이다.

이건 답을 보고 나서도 윤년이 뭔지 몰라서 왜 이런지 몰랐는데,

지금은 윤년 뭔지 안다..ㅎ...ㅎㅎ. 어디서 잘난 척 할 수 있을 것 같다.

 

 

오늘의 천사 : 지피티