TIL 제출하기(매일 23:59 까지)
❤️🔥TIL : Today I Learned
매일 저녁, 공부를 마무리하면서 제출해주세요.
하루에 1%씩만 나아가도 4개월 동안 쌓이면 꽤 덩치가 커진답니다 :)
[TIL을 쓰는 이유]
1. 스스로 어제보다 한 발 더 나아갔다는 것을 자각하기
2. TIL을 쓰기 위해서라도, 오늘 반드시 단 하나라도 배우기
3. 꾸준히 기록을 남기는 습관 가지기
알고리즘 코드카타
약수의 개수에 따른 덧셈과 뺄셈 문제 해결하기
이번 포스트에서는 주어진 범위 내의 숫자들의 약수 개수에 따라 덧셈과 뺄셈을 수행하는 문제를 해결해보겠습니다. 이 문제는 약수의 개수를 구하고, 그에 따라 조건부로 합산 또는 감산하는 간단한 알고리즘 문제입니다.
문제 설명
두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 반환하는 함수를 완성해주세요.
제한사항
- 1 ≤ left ≤ right ≤ 1,000
입출력 예
leftrightresult
13 | 17 | 43 |
---|---|---|
24 | 27 | 52 |
입출력 예 설명
- 예제 1: 13부터 17까지의 수들의 약수 개수에 따라 13 + 14 + 15 - 16 + 17 = 43을 반환합니다.
- 예제 2: 24부터 27까지의 수들의 약수 개수에 따라 24 - 25 + 26 + 27 = 52를 반환합니다.
해결 방법
이 문제를 해결하기 위해서는 다음과 같은 단계를 밟아야 합니다.
- 주어진 범위 내의 각 수에 대해 약수의 개수를 구합니다.
- 약수의 개수가 짝수인 경우 해당 수를 더하고, 홀수인 경우 해당 수를 뺍니다.
- 최종 결과를 반환합니다.
아래는 이 문제를 해결하기 위한 Java 코드입니다.
public class Solution {
public int solution(int left, int right) {
int result = 0;
for (int i = left; i <= right; i++) {
// 약수의 개수 구하기
int divisorCount = getDivisorCount(i);
// 약수의 개수가 짝수인 경우 더하고, 홀수인 경우 뺌
if (divisorCount % 2 == 0) {
result += i;
} else {
result -= i;
}
}
return result;
}
private int getDivisorCount(int number) {
int count = 0;
for (int i = 1; i <= number; i++) {
if (number % i == 0) {
count++;
}
}
return count;
}
public static void main(String[] args) {
Solution sol = new Solution();
System.out.println(sol.solution(13, 17)); // 43
System.out.println(sol.solution(24, 27)); // 52
}
}
코드 설명
- solution 함수는 left부터 right까지의 각 수에 대해 약수의 개수를 구하고, 조건에 따라 합산 또는 감산합니다.
- getDivisorCount 함수는 주어진 숫자의 약수 개수를 반환합니다.
- for 루프를 사용하여 left부터 right까지의 모든 숫자에 대해 약수의 개수를 구하고, 짝수인지 홀수인지에 따라 결과를 계산합니다.
SQL 코드카타
주어진 문제를 해결하기 위해, PRODUCT 테이블과 OFFLINE_SALE 테이블을 조인하여 각 상품코드별 매출액을 계산하는 SQL 쿼리를 작성하겠습니다. 결과는 매출액을 기준으로 내림차순 정렬하고, 매출액이 같다면 상품코드를 기준으로 오름차순 정렬합니다.
테이블 구조
- PRODUCT
- PRODUCT_ID: INTEGER, 도서 ID
- PRODUCT_CODE: VARCHAR(8), 상품코드 (중복되지 않음)
- PRICE: INTEGER, 판매가 (원)
- OFFLINE_SALE
- OFFLINE_SALE_ID: INTEGER, 오프라인 상품 판매 ID
- PRODUCT_ID: INTEGER, 상품 ID
- SALES_AMOUNT: INTEGER, 판매량
- SALES_DATE: DATE, 판매일
예시 데이터
PRODUCT 테이블:
PRODUCT_IDPRODUCT_CODEPRICE
1 | A1000011 | 15000 |
---|---|---|
2 | A1000045 | 8000 |
3 | C3000002 | 42000 |
OFFLINE_SALE 테이블:
OFFLINE_SALE_IDPRODUCT_IDSALES_AMOUNTSALES_DATE
1 | 1 | 2 | 2022-02-21 |
---|---|---|---|
2 | 1 | 2 | 2022-03-02 |
3 | 3 | 3 | 2022-05-01 |
4 | 2 | 1 | 2022-05-24 |
5 | 1 | 2 | 2022-07-14 |
6 | 2 | 1 | 2022-09-22 |
SQL 쿼리
SELECT
P.PRODUCT_CODE,
SUM(P.PRICE * S.SALES_AMOUNT) AS SALES
FROM
PRODUCT P
JOIN
OFFLINE_SALE S
ON
P.PRODUCT_ID = S.PRODUCT_ID
GROUP BY
P.PRODUCT_CODE
ORDER BY
SALES DESC,
P.PRODUCT_CODE ASC;
쿼리 설명
- SELECT 문: PRODUCT_CODE와 SUM(P.PRICE * S.SALES_AMOUNT) AS SALES를 선택하여 각 상품코드별 매출액을 계산합니다.
- FROM 문: PRODUCT 테이블과 OFFLINE_SALE 테이블을 선택합니다.
- JOIN 문: PRODUCT 테이블과 OFFLINE_SALE 테이블을 PRODUCT_ID를 기준으로 조인합니다.
- GROUP BY 문: PRODUCT_CODE별로 그룹화합니다.
- ORDER BY 문: SALES를 기준으로 내림차순 정렬하고, 매출액이 같다면 PRODUCT_CODE를 기준으로 오름차순 정렬합니다.
결과
위의 SQL 쿼리를 실행하면 주어진 예시 데이터에 대해 다음과 같은 결과를 얻을 수 있습니다:
PRODUCT_CODESALES
C3000002 | 126000 |
---|---|
A1000011 | 90000 |
A1000045 | 16000 |
이와 같이, 각 상품코드별 매출액을 정확하게 계산하고 정렬할 수 있습니다.
느낀점
'TIL > 스파르타 코드카타' 카테고리의 다른 글
[내일배움캠프] 사전캠프 코드카타 35번 문제 (0) | 2024.09.03 |
---|---|
[내일배움캠프] 사전캠프 코드카타 34번 문제 (0) | 2024.09.03 |
[내일배움캠프] 사전캠프 코드카타 32번 문제 (0) | 2024.09.03 |
[내일배움캠프] 사전캠프 코드카타 31번 문제 (0) | 2024.09.03 |
[내일배움캠프] 사전캠프 코드카타 30번 문제 (0) | 2024.09.03 |