본캠프 12주차 시작. 오늘은 태블로 과제 풀이와 함께 오랜만에 코딩테스트를 열심히 풀었다.
학습 내용
숫자를 출력하는 함수들(SQL) : 참고
정수로 나타내기
SQL ABS(숫자) # 절대값 CEIL(숫자) # 가장 가까운 정수 출력, 소숫점 이하 올림 FLOOR(숫자) # 가장 가까운 정수 출력, 소숫점 이하 내림
자릿수를 기준으로 반올림 또는 내림하기
SQL ROUND(숫자, 자릿수) # 자릿수 바로 전에서 반올림 TRUNCATE(숫자, 자릿수) # 자릿수 바로 전에서 버림
몰랐던 함수들
SQL GREATEST(num1, num2, num3...) # 숫자들 중에 가장 큰 수만 출력한다 LEAST(num1, num2, num3...) # 숫자들 중에 가장 작은 수만 출력한다
그냥 풀고 뿌듯했던 문제
언제나 반복문 문제를 풀 때는 개념이 좀 모호하게 느껴지는데, 오늘 문제를 풀면서 while 문을 제법 잘 활용해서 뿌듯했다.
While 문 안에 break 조건도 사용해서 무한루프가 돌지 않도록 방지했다.
num 을 조건에 따라 계산을 반복하며 1을 출력하게 될 때까지 걸린 횟수를 구해야 하는 문제였고,
500번을 넘어가게 되면 -1을 출력해야 한다.
따라서 while 문으로 주어진 숫자 num이 1이 아닐 경우 계산이 계속 반복되도록 구조를 짰다,
조금 더 간결하게 될 수 있을 거 같은데, 아직은 잘 모르겠다.Python def solution(num): cnt = 0 while num != 1: cnt += 1 if cnt > 500: break elif num % 2 == 0: num = num / 2 else: num = (num * 3) + 1 if cnt > 500: return -1 else: return cnt
못 풀었던 문제 해결한 기록(Python)
- 문제 : 프로그래머스_제일 작은 수 제거하기
- 배열 arr이 주어질 때, 가장 작은 수를 제거한 배열을 출력하되, 가장 작은 수를 제거함으로써 배열이 빌 경우 -1을 채워 출력
- 리스트의 메서드에서, pop과 remove, 그리고 del이 항상 헷갈려서 검색하면서 풀었다.
- pop은 인덱스를 기준으로, remove 는 값을 기준으로 배열에서 제거한다.
처음에 풀었던 코드
- 풀이 : 주어진 배열에서 최소값을 구하고, 새로운 배열 answer에 최소값보다 큰 리스트의 숫자를 추가한다. 그리고 answer의 합이 0일 경우에는 answer에 -1을 추가한다.
- 문제점 : 테스트 케이스는 통과했는데, 제출하면 일부 테스트 케이스 실패가 떴고, 무엇보다 시간이 너무 오래 걸렸다.
- 문제를 처음 풀 당시에는 왜 실패하는지 몰라서 미해결 문제로 저장만 해놨었다. 먼저, for 문으로 새로운 배열에 다시 append 할 필요가 없고, 특정 값(
min(arr)
)만 삭제하면 된다. 또한, 아래 코드의 반례로 arr = [-4, 3, 1, -10] 이 있을 수 있다. 즉, 최솟값을 제외한 sum(arr) = 0 이지만, 비어있는 배열이 아니므로, -1을 추가하여 출력하면 오답이 된다.
- 문제를 처음 풀 당시에는 왜 실패하는지 몰라서 미해결 문제로 저장만 해놨었다. 먼저, for 문으로 새로운 배열에 다시 append 할 필요가 없고, 특정 값(
- 코드
Python def solution(arr): answer = [] for i in arr: if i > min(arr): answer.append(i) if sum(answer) == 0: answer.append(-1) return answer
문제 해결한 코드
- 풀이 : 일단 주어진 배열 arr에서 최솟값을 제거하고, arr의 길이가 0이면 [-1]이라는 배열을 출력하고, 0이 아니면 arr를 출력
- 코드
Python def solution(arr): arr.remove(min(arr)) if len(arr) == 0: return [-1] else: return arr
못 풀었던 문제 해결한 기록 - 2(Python)
- 문제 : 프로그래머스_카펫
- 1x1 격자 N 개로 이루어진 카펫의 가로 길이와 세로 길이를 구해서 배열에 담아 출력하는 문제
- 카펫 가운데 부분의 개수 yellow와 yellow의 외곽을 한 줄로 둘러싸는 brown의 개수가 주어진다
- 수학 공식을 어떻게 잘 이용하면 풀 수 있을 것 같은데 안 풀려서 계속 붙잡고 있었던 문제였다.
처음 풀이 접근
- 풀이 : 가로 길이는 yellow + 2, 세로 길이는 (brown - (가로 길이)) / 2
- 문제점 : yellow 가 2줄 이상일 경우, 예를 들어 2 X 3 배열의 6개 이거나, 3 X 3 배열의 9개일 경우를 설명할 수 없는 풀이
문제 해결한 코드
풀이 : brown에서 네 개의 꼭짓점에 해당하는 4를 뺀 값은
가운데에 위치한 yellow가 만드는 사각형의 (가로 길이 + 세로 길이) 의 두 배와 같다.
즉, (brown - 4) == (i X j) x 2
또 brown은 한 줄로 yellow가 만드는 사각형을 둘러싸고 있으므로,
카펫의 가로 길이와 세로 길이는 각각 yellow 사각형의 가로 길이와 세로 길이에 2를 더한 값이다.
따라서 위 수식에 넣었을 때 brown과 값이 일치하는 yellow의 약수인 i와 j 쌍을 구하면
카펫 가로 길이와 세로 길이를 구할 수 있다.코드
Python def solution(brown, yellow): for i in range(1, int(yellow**0.5) + 1): # yellow까지 전체 range를 구하면 for문이 너무 많이 돌기 때문에, 제곱근 사용 if yellow % i == 0: j = yellow // i if 2 * (i + j) == brown - 4: answer = [i + 2, j + 2] answer.sort(reverse= True) return answer
고찰 & 기타
- 벌써 2024년의 절반이 지났다. 아직 상반기 회고를 마치지 못했는데 내일까지는 회고 작성하고 하반기 계획을 세워야겠다.
- 태블로 과제를 그래도 필수 문제까지는 다 풀었는데, 심화 문제에서 조금 막혔다. 아무래도 대시보드이다보니 예쁘게 만들고 싶은 욕심도 생기는데, 어떤 걸 참고해야 하는지 잘 모르겠다. 튜터님께서 유튜브 채널과 참고할 만한 사이트를 알려주셔서 내일 과제 제출하고 찾아볼 예정이다.
'내일배움캠프_데이터분석_2기 > TIL' 카테고리의 다른 글
[TIL] camp_day56_240704 (0) | 2024.07.05 |
---|---|
[TIL] camp_day54_240703 (0) | 2024.07.05 |
[TIL] camp_day51_240627 (0) | 2024.06.27 |
[TIL] camp_day50_240626 (0) | 2024.06.26 |
[TIL] camp_day49_240625 (0) | 2024.06.25 |