📙 Algorithm Solving/Java

📙[Algo] 24.01.12 알고리즘 / SQL

혜덕hyeduck 2024. 1. 12. 23:15

알고리즘 문제) BOJ 15736. 청기 백기  

 

15736번: 청기 백기

예제 입력 1의 경우 1, 2, 3번 깃발이 존재하고, 3명의 선수가 참가한다. 첫 번째 선수는 1의 배수의 번호를 가진 깃발을 뒤집는다. 초기에 청색이였던 깃발은 첫 번째 선수에 의해 모두 백기로 된

www.acmicpc.net

문제 요약

  • 출전할 선수 N명
  • N개의 깃발이 청색이 위, 백색이 아래
  • 첫 선수 → N개의 깃발 중 1의 배수 뒤집기
  • 두 번쨰 선수 → 2의 배수 뒤집기
  • i 번째 선수 → i배수 뒤집기
  • 마지막 선수가 뒤집으면 끝
  • 백색이 위로 놓여있는 수 몇 개?

시간 제한

  • 1초

입력

  • 학생 수이자 깃발의 수N(20억)

출력

  • 백색 수?

접근법

  • N=10
1 2 3 4 5 6 7 8 9 10
o o o o o o o o o o
  o   o   o   o   o
    o     o     o  
      o       o    
        o         o
          o        
            o      
              o    
                o  
                  o
W B B W B B B B W B

⇒ 약수 개수가 홀수 개인 친구 ⇒ 즉, 제곱수 찾기!!

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        long n = Long.parseLong(br.readLine()) ;

        // 제곱수 찾기

        long number = 1;
        long tmp = number*number;
        long cnt = 0;
        while(tmp <= n){
            cnt++;
            tmp = (++number)*(number);
        }

        System.out.println(cnt);

    }
}

 

SQL ) Lv1. 흉부외과 또는 일반외과 의사 목록 출력하기  

문제 요약

  • 조건, 정렬, 조회 데이터 형식을 맞춰서 데이터 조회
    • 또는 조건

알게 된 점

조건 필터

  • AND : 두 가지 조건 모두 만족할 경우
  • OR : 둘 중 하나라도 만족할 경우
  • BETWEEN A AND B : A, B를 포함한 두 값 사이에 있는 항목 골라 냄
  • IN (’A’, ‘B’…) : IN 내부에 포함된 모든 항목을 골라냄
    • OR 연산자 보다 실행 속도가 빠르다.
    • IN 연산 안에 다른 SELECT 문을 넣을 수도 있음
  • LIKE ‘조건’ : 특정 문자가 포함된 데이터 검색 시 사용
    • LIKE ‘특정 문자열%’ : 특정 문자로 시작하는 데이터 검색
    • LIKE ‘%특정 문자열’ : 특정 문자로 끝나는 데이터 검색
    • LIKE ‘%특정 문자열%’ : 특정 문자를 포함하는 데이터 검색
    • 만약, 복수개의 특정 문자를 포함하는 데이터를 검색하려면 OR 연산자를 사용해서 연결
    • % : 0개 이상의 문자를 대신 표현
    • _ : 1개의 문자를 표현
-- 코드를 입력하세요
SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD, '%Y-%m-%d') FROM DOCTOR
WHERE MCDP_CD in ('CS', 'GS')
ORDER BY HIRE_YMD DESC, DR_NAME ASC;

 

SQL ) Lv1. 조건에 부합하는 중고거래 댓글 조회하기

문제 요약

  • 조인 후 조건에 맞는 데이터 조회

알게 된 점

  • 조인 ⇒ 나중에 조인 할 때 정리
  • 2022년 10월이라는 조건 필터 할 때 다른 방법
    • SUBSTR(B.CREATED_DATE, 1, 7) = ‘2022-10’
    • DATE_FORMAT(B.CREATED_DATE, '%Y-%m') = ‘2022-10’
    • B.CREATED_DATE LIKE ‘2022-10%’
    • B.CREATED_DATE BETWEEN "2022-10-01" AND "2022-10-31”
-- 코드를 입력하세요
SELECT B.TITLE, B.BOARD_ID, R.REPLY_ID, R.WRITER_ID, R.CONTENTS, DATE_FORMAT(R.CREATED_DATE, '%Y-%m-%d') AS DATE_FORMAT
FROM USED_GOODS_BOARD B 
JOIN USED_GOODS_REPLY R
ON B.BOARD_ID = R.BOARD_ID
WHERE YEAR(B.CREATED_DATE ) = '2022' AND MONTH(B.CREATED_DATE) = '10'
ORDER BY R.CREATED_DATE ASC, B.TITLE ASC;

 

SQL ) Lv4. 서울에 위치한 식당 목록 출력하기

문제 요약

  • 그룹화해서 조건에 맞는 정보 출력

알게 된 점

  • GROUP BY ~ HAVING
    • GROUP BY 특정 열이름 : 특정 열 UNIQUE한 값에 따라 데이터를 그룹화(중복된 열은 제거)
    • HAVING 조건 : GROUP BY한 결과에 조건을 붙일 때
  • REST_ID(식당 ID) 별로 그룹화 하고, 그 중 주소가 서울인 데이터 조회한 코드
-- 코드를 입력하세요
SELECT I.REST_ID, REST_NAME, FOOD_TYPE, FAVORITES, ADDRESS, 
ROUND(AVG(REVIEW_SCORE),2) SCORE
FROM REST_INFO I JOIN REST_REVIEW R
ON I.REST_ID = R.REST_ID
GROUP BY REST_ID
HAVING SUBSTR(ADDRESS, 1, 2) = '서울'
ORDER BY SCORE DESC, FAVORITES DESC;
  • 그룹별로 하라고 조건이 있지 않았기 때문에 위에 처럼 WHERE절로 먼저 필터링하고 그룹화해도 됨
-- 코드를 입력하세요
SELECT I.REST_ID, REST_NAME, FOOD_TYPE, FAVORITES, ADDRESS, 
ROUND(AVG(REVIEW_SCORE),2) SCORE
FROM REST_INFO I JOIN REST_REVIEW R
ON I.REST_ID = R.REST_ID
WHERE SUBSTR(ADDRESS, 1, 2) = '서울'
GROUP BY REST_ID
ORDER BY SCORE DESC, FAVORITES DESC;