Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

Nonamed Develog

[TIL] AI 웹 개발 7기 사전 캠프 4-2 본문

WHAT I LEARN/TIL

[TIL] AI 웹 개발 7기 사전 캠프 4-2

노네임드개발자 2024. 6. 11. 17:56

일일 알고리즘/SQL 코드카타

Q. 1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.

1-1. 입력된 수가 짝수라면 2로 나눕니다. 
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다. 
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.

 

예를 들어, 주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, solution을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.

 

for문과 if문으로 문제를 풀려고 노력해봤지만 도저히 답이 나오지 않아 다른 방법이 있을까 찾아봤다. 반복문을 만들 때 for문 뿐만 아니라 while문이라는 것이 있어서 while문을 정리하고 풀어보자.


-while은 어떤 조건이 만족하는 동안 그 아래에 끈 문장을 반복하는 기능이다.

num = 1
while num <= 100:
    print(num)
    num = num + 1

- 위와 같이 while 옆에 num <= 100 이라는 조건이 있으니, num이 100이 될 때 까지 밑의 print(num)과 num = num + 1을 반복하여 1부터 100까지의 수를 출력할 수 있다.

- 무한 루프를 만들고자하면 while True을 입력한다.

- while문에서 continue과 break를 이용하여 반복문을 제어할 수 있다.

- break 루프 강제 탈출

# 5까지만 출력하는 프로그램
num = 0
while True:
    num += 1
    if num > 5:
        break  # 짝수일 때는 다음 반복으로 건너뜁니다.
    print(num)

 

- continue 루프 건너뛰기

# 홀수만 출력하는 프로그램
num = 0
while num < 10:
    num += 1
    if num % 2 == 0:
        continue  # 짝수일 때는 다음 반복으로 건너뜁니다.
    print(num)

 

- 파이썬 do while문처럼 만들기

"do-while" 루프는 일단 루프 블록의 코드를 실행하고 나서 조건을 검사하기 때문에 루프 내용을 최소한 한 번은 실행하는 특징이 있다. 이 것은 파이썬 "while" 루프로 다음과 같이 구현할 수 있다.

while True:
    # 루프 내용 실행
    # ...

    # 조건 검사
    if 조건:
        break

 

위 코드에서 while True:는 항상 참인 무한 루프를 만든다. 그런 다음 루프 내용이 실행되고, if not 조건: 문을 사용하여 원하는 조건을 검사. 조건이 충족되지 않으면 break 문을 사용하여 루프를 종료. 예를 들어, 1에서 5까지의 숫자를 출력하면서 루프 내용을 최소한 한 번 실행하는 "do-while" 루프를 파이썬에서 구현하면 다음과 같다.

count = 0
while True:
    print(count)
    count += 1
    if count > 5:
        break

count 변수를 출력하고 1씩 증가시키며, count가 5보다 크면 루프를 종료.


def solution(num):
    count = 0
    while num != 1:
        if num % 2 == 0:
            num = num / 2
        else:
            num = 3 * num + 1
        count = count + 1
        if count == 500:
            return -1
    return count

위의 while문 작성법과 문제의 조건을 따라서 써보니 코드는 어느정도 완성되어 있었다. count 부분이 이해하기 좀 어려웠지만 루프의 회수를 알수 있는 방법이었다. 따라서 그 밑의 코드인 500번까지라는 제한도 쉽게 풀어낼 수 있었다.

 

이번 문제는 역대급으로 어려웠다. 무려 3시간이나 투자해서 문제를 풀고야 말았다. 문제를 풀 때 제한시간을 두고 풀면 조금 효율적으로 공부할 수 있을거 같다. 오늘 같이 모르는 구문이나 함수가 나올 수 있기 때문에 이 부분들을 채우기 위해 제한시간을 두고 풀고 안되면 다른 방법이 있을까 찾아보자. 그리고 공부하고 다시 풀어보자.

 

SQL9. 최소값 구하기

select min(datetime)
from animal_ins
order by datetime

 

SQL10. 어린 동물 찾기

select animal_id,
       name
from animal_ins
where intake_condition<>'Aged'

 

SQL11. 여러 기준으로 정렬하기

select animal_id,
       name,
       datetime
from animal_ins
order by name, datetime desc

 

SQL12. 이름에 el이 들어가는 동물 찾기

select animal_id,
       name
from animal_ins
where name like '%el%' and animal_type='Dog'
order by name