어제 힘겹게 문제를 풀다가 학습일지를 못썼다. 뒤늦게 쓰는 중이라 다시 보면 까먹었을까봐 조금 걱정이 되는데ㅋㅋㅋㅋ 일단 어제 실습 문제를 풀면서 막혔던 부분이랑 어떻게 풀었는지를 기록해보려고 한다.
1. 임의의 11개의 수(정수)를 배열에 저장하고 11번째 데이터가 해당 배열에 존재(index위치)하는지를 검색하기
1) 숫자를 쉼표를 찍어가면서 11개를 입력받는다.
2) 11번째 숫자를 기억한다.
3) 숫자를 오름차순 정렬한다.
4) 11번째 숫자가 새롭게 들어간 위치를 찾아 인덱스를 출력한다.
여기서 막혔던 부분. 정렬하고 인덱스 찾는 함수 다 만들어 놓고, 출력시키는 print문 안에 계속 {number}을 넣어버렸던 것!! 함수에 들어가는 변수인 number를 출력하는 것이 아니라, 함수를 실행했을 때 나오는 값(return) 자체를 넣어야 한다. number이 아니라 searching(numbers, target) 자체를 넣으면 된다.
def selection_sort(numbers):
for i in range(len(numbers)-1):
for j in range(i+1, len(numbers)):
if numbers[i] > numbers[j]:
temp = numbers[i]
numbers[i] = numbers[j]
numbers[j] = temp
return numbers
def searching(numbers, target):
for indexnumber in range(len(numbers)):
if numbers[indexnumber] == target:
return indexnumber
return -1
numbers=input().split(",") #1, 3, 10, 4, 66, 30, 52, 41, 5, 111, 2
numbers=list(map(int, numbers))
print("입력 받은 리스트:", numbers)
target = int(numbers[10])
print("target:", target)
selection_sort(numbers)
print("오름차순 정렬한 리스트:", numbers)
searching(numbers, target)
print(f"{target}의 인덱스값은 {searching(numbers, target)}입니다.")
이렇게 하면 이런 식으로 작동한다.
입력 받은 리스트: [1, 3, 10, 4, 66, 30, 52, 41, 5, 111, 8]
target: 8
오름차순 정렬한 리스트: [1, 3, 4, 5, 8, 10, 30, 41, 52, 66, 111]
8의 인덱스값은 4입니다.
2. 터널 통과하기 문제
어떤 차의 높이는 170cm이다. 이 차가 목적지에 도착하기 위해서는 3개의 터널을 차례대로 지나게 된다. 터널 의 높이가 차의 높이보다 같거나 낮다면 차는 터널과 충돌하여 사고가 날 것이다. 3개 터널의 높이가 공백으로 구분되어 주어졌을 때 터널을 무사히 잘 통과하면 “PASS”를 출력하고, 사고가 난다면 “CRASH”를 출력해 보자. (단, 터널의 높이는 모두 정수이다.)
1) 터널 3개의 높이를 숫자로 인풋을 받는다.
2) 터널 높이를 자동차의 높이와 비교한다. -> 터널이 n개라면, n번 비교할 수 있도록 for문 사용
3) 터널 높이가 자동차보다 높으면 pass를 출력한다.
4) 높지 않으면 crash를 출력하고 끝낸다.
tunnel=input("터널의 높이를 입력해주세요(공백으로 구분): ").split(" ")
tunnel=list(map(int, tunnel))
print(f"첫 번째 터널: {tunnel[0]}, 두 번째 터널: {tunnel[1]}, 세 번째 터널: {tunnel[2]}")
car=170
print(f"자동차의 높이는 {car} 입니다.")
for tunnelheight in tunnel:
if tunnelheight >= car:
print("Pass!")
else:
print("Crash!")
break
3. 길동이는 월, 수, 금, 일요일에 아르바이트를 한다. 요일의 번호를 입력해서 그 날이 아르바이트 가는 날이면 “oh my god”를 출력하고, 쉬는 날이라면 “enjoy”를 출력하는 프로그램을 작성해 보자. 입력하는 요일 번호는 아래와 같다. 월요일(1), 화요일(2), 수요일(3), 목요일(4), 금요일(5), 토요일(6), 일요일(7)
def workday(today):
week = {1: "Monday", 2: "Tuesday", 3: "Wednesday", 4: "Thursday", 5: "Friday", 6: "Saturday", 7: "Sunday"}
workday = [1, 3, 5, 7]
if today in workday:
return "OMG!"
else:
return "Enjoy!"
today=int(input("오늘의 요일 번호는?"))
print(f"오늘은 {week[today]}입니다.")
print(workday(today))
4. 영희는 시간을 되돌리는 타임머신을 만들고 싶은 사람이다. 영희는 일단 30분 전으로 돌아가는 타임머신부터 설계하려고 한다. 공백으로 나누어진 시간을 입력하여 정확히 30분 전의 시간을 출력하는 프로그램을 작성해 보자.
나는 이걸 if문을 계속 써서 만들었는데, 더 간단한 방법도 있었다!
def timemachine(thistime):
hour = int(thistime[0])
min = int(thistime[1])
if hour == 00:
if min < 30:
hour = 23
min = min + 30
elif min >= 30:
hour = 00
min = min - 30
elif hour != 00:
if min < 30:
hour = hour - 1
min = min + 30
elif min >= 30:
hour = hour
min = min - 30
return hour, min
thistime=list(input().split(" "))
hour = int(thistime[0])
min = int(thistime[1])
print("처음 입력 받은 시간", hour, min)
print(f"타임머신으로 돌아간 시간:", timemachine(thistime)[0], timemachine(thistime)[1],"입니다.")
처음부터 hour과 min을 받은 다음에 hour을 min으로 환산하고, 거기에서 30분을 빼는 방법!
thistime=list(input().split(" "))
hour = int(thistime[0])
min = int(thistime[1])
print("처음 입력 받은 시간", hour, min)
present = hour * 60 + min
past = present - 30
if past <= 0 :
past = 24*60 + past
hour = past // 60
min = past % 60
else :
hour = past // 60
min = past % 60
print("타임머신 거친 시간:", hour, min)
크.. 역시 수학 좀 간봤다는 친구. 천재다 천재!
5. 소수 판별 🤯🤯🤯
소수란, 약수가 1과 자기 자신 뿐인 1보다 큰 자연수를 말한다. 어떤 수가 입력되면 그 수가 소수인지 판별하여 소수 이면 “prime”을 출력하고, 소수가 아니면 “not prime”을 출력하는 프로그램을 작성해 보자.
이거 진짜 처음에 문제 보고 멍했다. 1과 자기자신만을 약수로 가지는 자연수. 그럼 자기 자신과 1을 빼고 모든 숫자를 for 문에 넣고 나누기 연산을 계속 시켜야하는건가? 아무리 생각해도 이건 아닌 것 같은데.. 여기서는 소수의 특징을 잘 생각해봐야 한다. 9 나누기 1, 9 나누기 2, 9 나누기 3 ... 이렇게 했을 때 1과 자기자신을 제외하고, 나눴을 때 나머지가 0이 되는 값이 하나라도 있으면 약수이다.
1) n 값을 받는다.
2) n 나누기 2부터 n까지(또는 n의 절반값까지) 반복하며 나눈다.
3) 그 결과 중에서 나머지가 0이 되는 것이 하나라도 나온다면, box(판별식 역할을 하는 상자)에 1을 더한다.
4) 나머지가 0이 되는 것이 하나도 없다면 패스해서 box 값은 0으로 가만히 있는다.(소수인 경우)
5) box(판별식)가 0이면 소수를 프린트하고, 0이 아니라면 약수를 프린트한다.
def numbermath(n):
n = int(input())
box = 0
for a in range(2, n):
if n%a == 0 :
box += 1
else :
pass
if box == 0:
print("소수")
else:
print("약수")
numbermath(n)
6. 주사위는 각 면에 1에서 6까지 적혀 있는 정육면체이다. 우리는 두 주사위의 합이 k가 나 오는 경우의 수를 모두 조사하려고 한다. 예를 들어, 주사위 두 개를 굴려 5가 나오는 경우는 1과 4, 2와 3, 3과 2, 4와 1이 있다. 우리가 주사위의 합 k를 입력하면 프로그램이 모든 경우 의 수를 출력하는 프로그램을 작성해 보자. 첫 번째 출력되는 수는 첫 번째 주사위의 숫자이고, 두 번째 출력되는 수는 두 번째 주사 위의 숫자이다. 첫 번째 주사위의 숫자가 작은 수에서 큰 순서로 출력한다.
1) 주사위 2개의 값을 하나씩 뽑는다.
2) 두 값을 더했을 때 k가 되는 순간에
3) 리스트에 담는다.
4) 출력한다.
def dicesum(k):
dicelist = [ ]
for i in range(1, 7):
for j in range(1, 7):
if i + j == k:
dicelist.append((i, j))
return dicelist
k = int(input())
result=dicesum(k)
print(result)
7. 아메리카노🤯🤯🤯
강철 선생님은 아메리카노를 매우 좋아한다. 강철 선생님의 단골 커피 전문점에서는 아메리카노를 한 잔 주문할 때 마다 쿠폰을 하나 받을 수 있다. 이 쿠폰은 커피 전문점에서 정한 개수(N)가 되면 아메리카노 한 잔과 쿠폰 한 장으로 교환할 수 있다. 강철 선생님이 가진 쿠폰의 개수(K)와 커피 전문점에서 정한 아메리카노 교환에 필요한 쿠폰 개수(N)가 입력되면 선생님이 교환할 수 있는 아메리카노의 최대 잔 수를 출력하는 프로그램을 작성해 보자.
이것도 규칙을 찾아보겠다고 혼자 고민고민했던 문제. k를 n으로 나눈 몫과 나머지를 모두 싹 리스트에 모아서 다 더하는 방식으로 하려고 했다가, 아무리 해도 안풀려서 다른 방법을 찾았다. 일단 삽질했던 작업물...
def coffee(k, n):
while n <= k:
return int(k//n), int(k%n)
else:
return int(k)
k, n = map(int, input("두 개의 값을 공백으로 구분하여 입력하세요: ").split())
coffeelist = [coffee(k, n)[0],coffee(k, n)[1]]
coffeelist.append(coffee(coffee(k, n)[0], n)[0], coffee(coffee(k, n)[0], n)[1])
print(coffeelist)
그리고 생각보다 간단하게 풀렸던 해결방법.
1) k장의 쿠폰 중에서 n장을 써서 공짜 커피를 마신다. k - n
2) 공짜 커피를 마시면 1장의 쿠폰을 받는다. k + 1
3) 내가 마신 공짜 커피의 잔의 숫자를 센다. cupofcoffee + 1
4) 내가 가지고 있는 쿠폰의 개수가 n장보다 작을 때까지 반복한다. n < k
coupon, freecoffeenum = map(int, input("두 개의 값을 공백으로 구분하여 입력하세요: ").split())
print(f"내가 가진 쿠폰의 개수: {coupon}, 공짜 커피를 마실 수 있는 쿠폰 개수: {freecoffeenum}")
k=coupon
n=freecoffeenum
cupofcoffee = 0
while n < k:
k = k - n
cupofcoffee = cupofcoffee + 1
k = k + 1
print("내가 마실 수 있는 커피는", cupofcoffee)
8. IQ150 🤯🤯🤯
오늘 신문에 맞히면 아이큐 150이라는 퍼즐이 나왔다. ?가 있는 격자판에 들어갈 숫자가 무엇인지 맞히면 IQ 150이라는 문제이다. 문제 해결 원리는 조금만 생각해 보면 쉽게 알 수 있다. 이 상황을 좀 더 일반화하여 각 행 의 제일 첫 번째 숫자들만 주어지면 N크기의 모든 격자판 정보를 출력하는 프로그램을 작성해 보자. 첫 줄에 이 삼각격자의 세로 길이 N이 입력되며, (2 <= N <= 20) 둘째 줄부터 N+1째 줄까지 (k,1)의 격자판의 정보가 입력된다. ( 1 <= k <= N)
이건 문제를 이해하는 것부터 어려웠다. 도움을 받아 풀긴 풀었는데, 솔직히 아직도 잘 이해가 안가는 것 같다. 이거랑 하노이의 탑은 아예 다른 포스팅으로 나눠서 정리하는 게 나을 듯..
'공부방 > Upstage AI Lab 4기' 카테고리의 다른 글
7/25 학습일지 | 시스템 프로그래밍 대충 큰크림과 개념 정리 (0) | 2024.07.25 |
---|---|
7/24 학습일지 | aws 인스턴스 우분투 환경에서 리눅스 명령어 익히기 (2) | 2024.07.25 |
7/22 학습일지 | 알고리즘을 위한 논리적인 사고력 기르기 실습 (1) | 2024.07.22 |
[에디터 노트] AI 공부를 시작하면서 느끼는 것들 (0) | 2024.07.20 |
7/19 학습일지 | 자바스크립트 깔짝, 외부 API로 데이터 가져오기 (0) | 2024.07.19 |