TIL/코딩테스트 연습문제

[내일배움캠프] 사전캠프 코드카타 15번 문제

통촏하여주시옵소서 2024. 8. 10. 01:04
TIL 제출하기(매일 23:59 까지)  
❤️‍🔥TIL : Today I Learned

매일 저녁, 공부를 마무리하면서 제출해주세요.  
하루에 1%씩만 나아가도 4개월 동안 쌓이면 꽤 덩치가 커진답니다 :)

\[TIL을 쓰는 이유\]  
1\. 스스로 어제보다 한 발 더 나아갔다는 것을 자각하기  
2\. TIL을 쓰기 위해서라도, 오늘 반드시 단 하나라도 배우기  
3\. 꾸준히 기록을 남기는 습관 가지기

알고리즘 코드카타

문제 설명

자연수 n이 주어졌을 때, n을 어떤 자연수 x로 나누었을 때 나머지가 1이 되는 가장 작은 자연수 x를 구하는 문제입니다. 즉, n % x == 1을 만족하는 가장 작은 x를 찾아야 합니다. 답이 항상 존재함은 증명될 수 있으며, 문제의 제한 조건을 통해 적절한 해를 구할 수 있습니다.


제한 사항

  • 3 ≤ n ≤ 1,000,000

입출력 예

n result
10 3
12 11

입출력 예 설명

입출력 예 #1

  • n = 10일 때, 10을 3으로 나눈 나머지가 1입니다. 3보다 작은 자연수 중에서는 조건을 만족하는 수가 없으므로, x = 3이 답이 됩니다.

입출력 예 #2

  • n = 12일 때, 12를 11로 나눈 나머지가 1입니다. 11보다 작은 자연수 중에서는 조건을 만족하는 수가 없으므로, x = 11이 답이 됩니다.

해결 방법

이 문제는 x를 1부터 n-1까지 차례대로 검사하면서, n % x == 1을 만족하는 가장 작은 x를 찾는 방식으로 해결할 수 있습니다. for 반복문을 사용해 1부터 차례대로 확인하면, 조건을 만족하는 값을 찾는 즉시 반복을 종료하고 그 값을 반환하면 됩니다.


코드

자바로 작성된 코드는 다음과 같습니다:

public class Solution {
    public static int solution(int n) {
        // 1부터 n-1까지 탐색하며 n % x == 1을 만족하는 가장 작은 x를 찾음
        for (int x = 2; x < n; x++) {
            if (n % x == 1) {
                return x;
            }
        }
        return -1; // 문제의 조건 상 이 값은 실행되지 않음
    }

    public static void main(String[] args) {
        // 예시 테스트
        System.out.println(solution(10)); // 3
        System.out.println(solution(12)); // 11
    }
}

풀이 과정

  1. 변수 설정: x를 2부터 n-1까지 차례대로 증가시키면서 확인합니다. x = 1은 나머지가 1이 될 수 없기 때문에 제외합니다.
  2. 반복문: for 문을 이용해 n % x == 1인 값을 찾습니다. 찾으면 바로 그 값을 반환합니다.
  3. 반환: 조건을 만족하는 가장 작은 x를 찾으면 반환하고, 찾지 못할 경우 -1을 반환하지만, 문제에서 항상 해가 존재한다고 했으므로 실제로는 이 경우는 발생하지 않습니다.

동작 설명

  • n = 10일 때:
    • x = 2일 때는 나머지가 0입니다.
    • x = 3일 때는 나머지가 1이므로, 답은 3입니다.
  • n = 12일 때:
    • x = 2부터 x = 10까지는 나머지가 1이 아닙니다.
    • x = 11일 때 나머지가 1이므로, 답은 11입니다.

SQL 코드카타

문제 설명

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물들의 정보를 저장하는 테이블입니다. 이 테이블에서 동물의 , 이름, 성별 및 중성화 여부 정보를 동물의 아이디 순으로 조회하는 SQL 쿼리를 작성해야 합니다. 또한, 동물의 이름이 없는 경우(NULL), 해당 이름을 "No name"으로 표시해야 합니다.


테이블 구조

  • ANIMAL_ID: 동물의 고유 ID (VARCHAR, NOT NULL)
  • ANIMAL_TYPE: 동물의 생물 종 (VARCHAR, NOT NULL)
  • DATETIME: 보호소에 들어온 날짜 및 시간 (DATETIME, NOT NULL)
  • INTAKE_CONDITION: 동물이 들어왔을 때의 상태 (VARCHAR, NOT NULL)
  • NAME: 동물의 이름 (VARCHAR, NULL 가능)
  • SEX_UPON_INTAKE: 동물의 성별 및 중성화 여부 (VARCHAR, NOT NULL)

문제 요구 사항

  1. 동물의 생물 종, 이름, 성별 및 중성화 여부를 동물의 아이디 순으로 조회합니다.
  2. 이름이 없는 경우(NULL), 이름을 "No name"으로 표시합니다.

예시

ANIMAL_INS 테이블에 다음과 같은 데이터가 있다고 가정합니다:

ANIMAL_ID ANIMAL_TYPE DATETIME INTAKE_CONDITION NAME SEX_UPON_INTAKE
A350276 Cat 2017-08-13 13:50:00 Normal Jewel Spayed Female
A350375 Cat 2017-03-06 15:01:00 Normal Meo Neutered Male
A368930 Dog 2014-06-08 13:20:00 Normal NULL Spayed Female

결과는 다음과 같아야 합니다:

ANIMAL_TYPE NAME SEX_UPON_INTAKE
Cat Jewel Spayed Female
Cat Meo Neutered Male
Dog No name Spayed Female

해결 방법

이 문제를 해결하기 위해 SQL의 IFNULL() 또는 COALESCE() 함수를 사용하여 NULL 값을 "No name"으로 변환할 수 있습니다. 두 함수 모두 NULL 값을 처리할 때 유용합니다. 그 후, ANIMAL_ID 기준으로 정렬하여 원하는 결과를 도출합니다.


SQL 코드

아래는 문제 요구 사항을 만족하는 SQL 쿼리입니다:

SELECT ANIMAL_TYPE, 
       COALESCE(NAME, 'No name') AS NAME, 
       SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

풀이 과정

  1. COALESCE() 함수: NAME 컬럼의 값이 NULL인 경우 "No name"으로 대체합니다. COALESCE() 함수는 첫 번째 인자가 NULL이면 두 번째 인자를 반환합니다.
  2. 컬럼 선택: ANIMAL_TYPE, NAME, SEX_UPON_INTAKE 컬럼을 선택하여 출력합니다.
  3. 정렬: 동물의 ANIMAL_ID를 기준으로 오름차순 정렬합니다.

동작 설명

  • COALESCE(NAME, 'No name'): NAME 컬럼의 값이 NULL이면 "No name"을 반환하고, 그렇지 않으면 기존의 NAME 값을 반환합니다.
  • ORDER BY ANIMAL_ID: 동물의 ANIMAL_ID에 따라 결과를 오름차순으로 정렬하여 출력합니다.

느낀점