본문 바로가기

TIL

[240124] SQL: 코드카타 113~114 & 파이썬: 코드카타 23

[SQL 코드카타]

626. Exchange Seats

https://leetcode.com/problems/exchange-seats/

 

1) 어떤 문제가 있었나

연속되는 id의 학생끼리 자리를 바꾸되, 전체 학생이 홀수일 경우 마지막 학생은 그대로 두는 문제

 

2) 내가 시도해본 건 무엇인가

case when을 활용해 좌석 교체 조건을 넣어 with 절로 빼고, 원본 table과 left join 진행

with절 테이블 값이 있으면 with절 테이블 값으로, 없으면 원본 table 값으로 추출해 마지막 홀수 학생ID 그대로 나오게 함  

 

3) 어떻게 해결했나

with swap_table as (SELECT id, 
                       student, 
                    case when id%2 <> 0 then id+1
                            when id%2 = 0 then id-1
                            end swaped
                FROM Seat
                group by id)

select if(swaped is not null, swaped, Seat.id) id ,
       if(swap_table.student is not null, swap_table.student, Seat.student ) student  
 from Seat
left join swap_table on swap_table.swaped = Seat.id


4) 무엇을 새롭게 알았나

- 마지막 홀수 자리 학생 처리로 max를 생각해서 넣었으나 실패했었는데, 이를 서브쿼리 형태로 넣었어야 했음

- max, min, sum 등을 활용한 단일한 숫자를 활용할 때는 서브쿼리 형태로 넣는 것을 염두에 둘 필요가 있음

#다른 사람 풀이 
SELECT CASE WHEN id = (SELECT MAX(id) FROM seat) AND id % 2 = 1 THEN id 
            WHEN id % 2 = 1 THEN id + 1
            ELSE id - 1
        END AS id,
    	student
FROM seat
ORDER BY id

[파이썬 코드카타]

콜라츠 추측

https://school.programmers.co.kr/learn/courses/30/lessons/12943

 

1) 어떤 문제가 있었나

콜라츠 추측에 의해 1이 만들어지는 반복 횟수를 구하는 문제로

반복문은 써봤으나 반복에 대한 횟수를 세는 방법을 모름 

[콜라츠 추측]
1937년 Collatz란 사람에 의해 제기되었는데, 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측이다. 

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

 

2) 내가 시도해본 건 무엇인가

answer을 리스트로 만든 후 if로 계산한 값이 리스트 안에 순차적으로 쌓이도록(append) 하고

len으로 리스트 개수를 세보려고 했으나 실패 

 

3) 어떻게 해결했나

다른 사람 풀이를 참조하여..

① while 함수를 통한 조건+반복문을 실행하고,

② answer += 1 수식으로 한 번 조건이 실행될 때마다 숫자가 추가되어 개수를 셀 수 있도록 함

def solution(num):
    answer = 0
    if num == 1:
        answer = 0
    else:
        while num > 1:    #num이 1을 초과하는 경우 하기 조건문 반복 
            if num%2 == 0 :
                num = num/2
                answer = answer + 1  #if 명제가 참일 때마다, answer에 1 더하기 
            elif num%2 != 0 :
                num = (num*3) + 1
                answer = answer + 1
    if answer > 500:           
        answer = -1
    return answer

 

4) 무엇을 새롭게 알았나

- 특정 조건이 있는 반복문의 경우, while을 사용해야 함에도 자주 안써서 for 문만 쓰려고 함

- 변수 지정은 =, 값이 같은 건 == 인데, answer > 500일 시 -1로 반환되야 하는 부분에서 ==로 잘못넣음 > 주의 필요