https://school.programmers.co.kr/learn/challenges?tab=sql_practice_kit 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

코테를 볼때마다 얕은 SQL 지식때문에 뭔가 풀 수 있을 것 같은데 못푸는 경험을 자주 했다.

여러 예제들을 풀어보면서 SQL 문법과 함수들을 익히는 시간이 필요하다고 생각해서

일단 프로그래머스의 SQL 고득점 Kit부터 싹다 풀어봤다.

 

SELECT

과일로 만든 아이스크림 고르기

재구매가 일어난 상품과 회원 리스트 구하기

역순 정렬하기

아픈 동물 찾기

어린 동물 찾기

동물의 아이디와 이름

여러 기준으로 정렬하기

상위 n개 레코드

조건에 맞는 회원수 구하기

 

SUM, MAX, MIN

가장 비싼 상품 구하기

최댓값 구하기

최솟값 구하기

동물 수 구하기

중복 제거하기

 

GROUP BY

성분으로 구분한 아이스크림 총 주문량

고양이와 개는 몇 마리 있을까

동명 동물 수 찾기

년, 월, 성별 별 상품 구매 회원 수 구하기

입양 시각 구하기(2)

가격대 별 상품 개수 구하기

 

IS NULL

경기도에 위치한 식품창고 목록 출력하기

이름이 없는 동물의 아이디

이름이 있는 동물의 아이디

NULL 처리하기

나이 정보가 없는 회원 수 구하기

 

JOIN

그룹별 조건에 맞는 식당 목록 출력하기

없어진 기록 찾기

있었는데요 없었습니다

오랜 기간 보호한 동물(1)

보호소에서 중성화한 동물

상품 별 오프라인 매출 구하기

상품을 구매한 회원 비율 구하기

 

STRING, DATE

최소되지 않은 진료 예약 조회하기

루시와 엘라 찾기

이름에 el이 들어가는 동물 찾기

중성화 여부 파악하기

오랜 기간 보호한 동물(2)

카테고리 별 상품 개수 구하기

URI, URL, URN

URI (Uniform Resource Identifier)

  • 통합 자원 식별자
  • 인터넷 자원을 식별할 수 있는 문자열이다.
  • URI의 하위 개념으로 URL와 URN이 있는 것.
  • 구성 : :scheme: :hosts: :url-path: :query:
  • 예시1 : file://127.0.0.1/Users/username/Desktop
  • 예시2 : https://www.google.com:80/search?q=JavaScript
    • scheme
      • 가장 먼저 작성한다.
      • 통신 방식(프로토콜)을 결정한다
      • 일반적으로 웹 브라우저에서는 http(s)를 사용한다.
      • 예시: file:// , http:// , https://
    • hosts
      • 웹 서버의 이름, 도메인, IP를 사용하여 주소를 나타낸다.
      • port 번호를 hosts: 뒤에 입력할 수 있음.
      • 예시: 127.0.0.1 , www.google.com
    • url-path
      • 웹 서버에서 지정한 루트 디렉토리부터 시작하여
      • 웹 페이지, 이미지, 동영상 등이 위치한 경로와 파일명을 나타낸다.
      • 예시 : /search , /Users/username/Desktop
    • query
      • 웹 서버에 보내는 추가적인 질문이다.
      • 예시 : q=JavaScript

참고로, 예시 2번의 URI를 브라우저의 주소창에 입력하면 구글에서 JavaScript를 검색한 결과가 나타난다.


URL (Uniform Resource Locator)

  • 네트워크 상에서 웹페이지, 이미지, 동영상 등의 리소스 파일이 위치한 정보를 나타낸다.
  • URL은 FTP, SMTP처럼 다른 프로토콜에서도 사용할 수 있다. 아래는 예시.
  • 리소스를 표현하는 방법 중, REST API도 URL이다.

URN (Uniform Resource Name)

  • URI의 표준 포맷 중 하나이다.
  • 이름으로 리소스를 특정짓는 URI이다.
  • URN은 리소스를 영구적이고 유일하게 식별할 수 있는 URI이다.
  • 실제 리소스를 찾기 위해서는 URN을 URL로 변환하여 이용한다.
  • 예시
urn:oasis:names:specification:docbook:dtd:xml:4.1.2
tel:+1-816-123-1234

참고 이미지

referimage

정보 출처 : https://hanamon.kr/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EB%B3%B8-url-uri-urn-%EC%B0%A8%EC%9D%B4%EC%A0%90/

디자인 패턴 - 퍼사드 패턴 (Facade Pattern)

  • Facade 라는 영어단어는 '(건물의) 정면' 이라는 뜻이다.
  • 어떤 소프트웨어의 다른 커다란 코드 부분에 대하여 간략화된 인터페이스를 제공하는 디자인패턴.
  • 간단하게 말하면 복잡한 소프트웨어를 사용할 수 있도록 간단한 인터페이스를 제공하는 것임.

실생활 예시

  • 집에서 영화를 보려면 해야할 일
    1. TV리모콘 준비
      1. 일어서서 리모콘 찾기
      2. 제자리로 돌아와서 앉기
    2. TV 키기
      1. 리모콘으로 TV 켜기
      2. 다 보고난 뒤 TV 끄기
    3. 영화 결제하기
      1. 볼만한 영화 탐색
      2. 영화 선택
      3. 결제 프로세스
    4. 음료 준비하기
      1. 일어서서 냉장고로 가기
      2. 컵을 꺼내서 음료 담기
      3. 제자리로 와서 앉아서 마시기
    5. 팝콘 준비하기
      1. 팝콘 가져오기
      2. 팝콘 개봉하기
    6. 시청

관련한 내용들을 Class로 작성할 수 있을 것. (일부 생략)


  • 리모콘 클래스
public class Remote_Control {
    public void Turn_On() {
        System.out.println("TV 키기");
    }
    public void Turn_Off() {
        System.out.println("TV 끄기");
    }
}
  • 영화 클래스
public class Movie {
    private String name = "";

    public Movie(String name) {
        this.name = name;
    }

    public void Search_Movie() {
        System.out.println(name + " 영화를 찾다");
    }

    public void Charge_Movie() {
        System.out.println("영화 결제");
    }

    public void Play_Movie() {
        System.out.println("영화 재생");
    }
}
  • 음료 클래스
public class Beverage {
    private String name = "";

    public Beverage(String name) {
        this.name = name;
    }

    public void Prepare() {
        System.out.println(name + "음료 준비 완료");
    }
}
  • 되게 복잡하나, 우리가 하고싶은건 결국 영화를 보는 것
public class Facade {
    private String beverage_name = "";
    private String movie_name = "";

    public Facade(String beverage_name, String movie_name) {
        this.beverage_name = beverage_name;
        this.movie_name = movie_name;
    }

    public void View_Movie() {
        Beverage beverage = new Beverage(beverage_name);
        Remote_Control remote = new Remote_Control();
        Movie movie = new Movie(movie_name);

        beverage.Prepare();
        remote.Turn_On();
        movie.Search.Movie();
        movie.Charge_Movie();
        movie.Play_Movie();
    }
}
  • Facade 클래스 내에 영화를 보기 위한 프로세스를 다 담았음.
  • 클라이언트는 어벤져스를 보면서 콜라를 먹기 위한 행동으로 다음의 간단한 코드만 이용하면 된다.
public class Facade {
    public void view() {
        Facade facade = new Facade("Coke", "Avengers");
        facade.View_Movie();
    }
}

정보 출처 : https://lktprogrammer.tistory.com/42

디자인패턴 - 전략 패턴 (Strategy Pattern)

  • 객체들이 할 수 있는 행위에 대해 전략 클래스를 생성
  • 유사한 행위들을 캡슐화 하는 인터페이스를 정의
  • 객체의 행위를 동적으로 바꾸고 싶은 경우, 직접 행위를 수정하지 않는다.
  • 전략 클래스를 바꿔주기만 함으로서 행위를 유연하게 확장한다.

예시:

  • Car와 Train은 움직인다는 공통점이 있음. -> Moveable 라는 인터페이스 지정
public interface Moveable {
    public void move();
}
  • Car와 Train 클래스에 move 구현
public class Car implements Moveable {
    public void move() {
        System.out.println("도로로 움직입니다.");
    }
}
public class Train implements Moveable {
    public void move() {
        System.out.println("선로로 움직입니다.");
    }
}
  • Client에 해당 내용을 구현
public class Client {
    public static void main(String args[]) {
        Movable train = new Train();
        Movable car = new Car();

        train.move();
        car.move();
    }
}

  • 이 때, 시간이 흘러 날아다니는 차가 개발되었다고 가정하자.
  • 그래서 Car의 move() 메서드를 다음과 같이 바꾸었다.
public class Car implements Movable {
    public void move() {
        System.out.println("하늘로 날아서 움직입니다.");
    }
}
  • 하지만 이렇게 하면 SOLID의 원칙 중 OCP(Open Closed Principle)을 위배한다.
    • 요구사항의 변경이나 추가사항이 발생하더라도 기존 구성요소는 수정이 일어나지 말아야 한다는 의미.
  • 따라서 전략 패턴을 활용하기 위해 다음처럼 구현한다.

  • MovableStrategy 인터페이스를 생성,
public interface MovableStrategy {
    public void move();
}
  • 그것을 통해 이동수단에 대한 전략들을 구현한다. (이동방법이 확장될 경우를 고려하는 것)
public class RailLoadStrategy implements MovableStrategy {
    public void move() {
        System.out.println("선로로 움직입니다.")
    }
}
public class LoadStrategy implements MovableStrategy {
    public void move() {
        System.out.println("도로로 움직입니다.");
    }
}
public class FlyStrategy implements MovableStrategy {
    public void move() {
        System.out.println("하늘을 날아서 움직입니다.");
    }
}
  • 차와 기차는 move() 메서드를 통해 움직일텐데, 그것을 직접 메서드로 구현하지 않는다.
  • 어떻게 움직일지 전략을 설정하고, 그 전략의 움직임 방식을 사용하여 움직이도록 한다.
  • 그 전략을 설정하는 메서드인 setMovableStrategy() 를 구현한다.
public class Moving {
    private MovableStrategy movableStrategy;

    public void move() {
        movableStrategy.move();
    }

    public void setMovableStrategy(MovableStrategy movableStrategy) {
        this.movableStrategy = movableStrategy;
    }
}
public class Car extends Moving {

}
public class Train extends Moving {

}
  • 그것을 Client로 구현하면 다음과 같다.
public class Client {
    public class void main(String args[]) {
        Moving train = new Train();
        Moving car = new Car();

        train.setMovableStrategy(new RailLoadStrategy());
        car.setMovableStrategy(new LoadStrategy());

        train.move();
        car.move();

        // 여기까지 기차는 선로로 움직이는 것으로, 차는 도로로 움직이는 것으로 설정되었음.
        // 근데 이후에 하늘을 나는 차가 개발됐다고 가정.

        car.setMovableStrategy(new FlyStrategy());
        car.move();
    }
}

  • 이로서, 원래 move() 메서드 코드를 건들이지 않고 행위가 수정되었음.

참고 출처: https://victorydntmd.tistory.com/292

'TIL' 카테고리의 다른 글

URI, URL, URN 차이  (0) 2022.10.25
디자인패턴 - 퍼사드 패턴 (Facade Pattern)  (1) 2022.10.25
객체지향 개발 5대 원리, SOLID  (0) 2022.10.21
동기 vs 비동기, Blocking vs Non-Blocking  (0) 2022.10.19
정규표현식  (0) 2022.10.12

SOLID(객체지향 5대원칙)

SRP(단일책임원칙: Single Responsibility Principle)

  • 한 클래스에는 하나의 책임만 가져야 한다.

  • 그로인해 책임 영역이 확실진다.

  • 책임 영역이 확실해지면?

    • 한 책임의 변경에서 다른 책임의 변경으로의 연쇄작용에서 자유로울 수 있다.
    • 책임을 적절히 분배해서 코드의 가독성을 향상시킨다.
    • 유지보수가 용이해진다.

OCP(개방-폐쇄 원칙: Open Close Principle)

  • 확장에는 열려 있으나 변경에는 닫혀 있어야 하며, 다형성을 활용해야 한다.

  • 즉, 요구사항의 변경이나 추가사항이 발생하더라도 기존 구성요소는 수정이 일어나지 말아야 한다는 의미.

  • 기존 구성요소를 확장해서 재사용 할 수 있어야 한다는 의미이다.

  • 확장될 것과, 변화되지 않을 것을 엄격히 구분하고 만약 두 모듈이 만나는 지점이 있다면 인터페이스를 정의한다.

  • 어떤 것이 확장될 예정인지, 변화되지 않을 것인지 확신하는 것은 쉽지 않은게 사실이다. 그런 것을 잘 예측하는 것 또한 설계자의 자질 중 하나이다.


LSP(리스코프 치환 원칙: The Liskov Substitution Principle)

  • 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야하는 원칙으로 상위 타입을 상속해서 재정의 했을 때 프로그램이 깨지지 않아야 한다.

  • 즉, 서브 타입은 언제나 기반 타입으로 교체될 수 있어야 한다.

  • 적용 방법

    • 만약 두 개체가 같은 일을 한다면 둘을 하나의 클래스로 표현하고, 이 둘을 구분할 수 있는 필드를 둔다.
    • 똑같은 연산을 제공하지만 이 둘을 약간씩 다르게 한다면 인터페이스를 만들고 둘이 이를 구현한다.
    • 공통된 연산이 없다면 당연히 이 둘을 별개의 클래스로 쪼갠다.
    • 만약 두 개체가 하는 일에 추가적으로 무언가를 더 한다면 구현 상속을 사용한다.

ISP(인터페이스 분리 원칙: Interface Segregation Principle)

  • 클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안되는 원칙이다.

    • 즉, 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다.
  • 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 더 낫다.

  • 즉, 비대한 인터페이스보단 더 작고 구체적인 인터페이스로 분리해야 한다.

  • SRP가 클래스 분리를 통해 변화의 적응성을 획득하는 반면, ISP는 인터페이스 분리를 통해 획득한다.


DIP(의존관계 역전 원칙: Dependency Inversion Principle)

  • 추상적인 것은 자신보다 구체적인 것에 의존하지 않고, 변화하기 쉬운 것에 의존해서는 안된다는 원칙이다.
  • 구체적으론 구현 클래스에 의존하지 말고, 인터페이스에 의존해야 하는 원칙이다.
  • 구조적 디자인에서 발생하던 하위 레벨 모듈의 변경이 상위 레벨 모듈의 변경을 요구하는 위계관계를 끊는 의미의 역전이다.

동기 vs 비동기

처리해야 할 작업들을 어떠한 '흐름'으로 처리할 것인가에 대한 관점.

즉, 호출되는 함수의 작업 완료 여부를 신경쓰냐에 따라 함수 실행/리턴의 순차적인 흐름을 따르느냐 안따르느냐가 관심사

 

동기 (Synchronous)

  • 작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함.
  • 호출하는 함수 A가 호출되는 B의 작업 완료 후 리턴을 기다리거나, 바로 리턴 받더라도 미완료 상태라면 작업 완료 여부를 스스로 계속 확인하며 신경쓴다.
  • 즉, 함수 A가 함수 B를 호출한 뒤 함수 B의 리턴값을 계속 신경쓰면 동기.

비동기 (Asynchronous)

  • 시작과 종료가 일치하지 않으며, 끝나는 동시에 시작을 하지 않음
  • 함수 A가 함수 B를 호출할 때 콜백 함수를 함께 전달해서 함수 B의 작업이 완료되면 함께 보낸 콜백 함수를 실행한다.
  • 함수 A는 함수 B를 호출한 뒤로 함수 B의 작업 완료 여부는 신경쓰지 않는다.
  • 즉, 신경 쓰지 않으면 비동기



Blocking vs Non-Blocking

처리되어야 하는 작업이 전체적인 작업 '흐름'을 막느냐 안막느냐에 대한 관점

즉, 제어권이 누구한테 있느냐가 관심사

 

Blocking

  • A 함수가 B 함수를 호출하면, 제어권을 A가 호출한 B에게 넘겨준다.
  • 제어권이 B에게 넘어갔으므로, A 함수는 실행을 잠시 멈춘다.
  • B 함수가 종료되면 자신을 호출한 A 함수에게 제어권을 돌려준다.

Non-Blocking

  • A 함수가 B 함수를 호출해도 제어권은 그대로 자신이 가지고있다.
  • B 함수가 실행되는 동안 A 함수도 자신의 코드를 계속 실행한다.

 

정보 출처 : https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%EB%8F%99%EA%B8%B0%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B8%94%EB%A1%9C%ED%82%B9%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC

'TIL' 카테고리의 다른 글

디자인패턴 - 전략 패턴 (Strategy Pattern)  (0) 2022.10.22
객체지향 개발 5대 원리, SOLID  (0) 2022.10.21
정규표현식  (0) 2022.10.12
csv insert with MySQL (Load data infile) 방법  (0) 2022.08.30
왜 Hello World ?  (0) 2021.12.25

https://www.acmicpc.net/problem/1543

 

1543번: 문서 검색

세준이는 영어로만 이루어진 어떤 문서를 검색하는 함수를 만들려고 한다. 이 함수는 어떤 단어가 총 몇 번 등장하는지 세려고 한다. 그러나, 세준이의 함수는 중복되어 세는 것은 빼고 세야 한

www.acmicpc.net

 

처음엔 그냥 for문 써서 모든 경우를 찾았다.

그런데 더 쉬운 풀이방법과, 정규표현식을 이용한 방법도 깨달아서 업로드 해본다.

 

1번째 소스코드

import sys
input = sys.stdin.readline

# ===== 1차 풀이 ===== 108ms
T = input()
text = input().rstrip()

leng = len(text)
idx = 0
answer = 0
while idx < len(T)-leng:
    if T[idx:idx+leng] == text:
        idx += leng
        answer += 1
    else:
        idx += 1

print(answer)

2번째 소스코드

문자열에 count 하면 중복되지 않게 찾아준다는 점이 놀라웠다.

import sys
input = sys.stdin.readline

# ===== 2차 풀이 ===== 116ms
T = input().rstrip()
text = input().rstrip()
print(T.count(text))

3번째 소스코드

import re
import sys
input = sys.stdin.readline

# ===== 3차 풀이 ===== 196ms
T = input().rstrip()
text = input().rstrip()
regex = re.compile(text)
cnt = 0
while True:
    m = regex.search(T)
    if not m:
        break
    cnt += 1
    T = T[m.end():]
print(cnt)

 

정규표현식이 제일 느렸다.

꼭 정규표현식을 써야할 일이 아니면 그냥 for문 때리거나 내장함수 count 쓰는게 나은 것 같다.

문자 명칭 한글명칭
! Exclamation Mark 느낌표
@ At, At Sign, Commercial At 골뱅이
# Number Sign, Sharp, Hash Tag, Octothorp 샵, 우물정자
$ Dollar Sign 달러
% Percent Sign 퍼센트
^ Carat, Circumflex Accent, 제곱
& Ampersand, And Symbol 앤드, 앰퍼샌드
* Asterisk, Star 별표
( Left Parenthesis 소괄호 열고
) Right Parenthesis 소괄호 닫고
- Hyphen, Minus Sign, Dash 대시
_ Low Line, Under Score, Underbar,  언더바, 밑줄
= Equal Sign 등호, 는
+ Plus Sign 더하기
` Grave Accent, Back Quote 역따옴표
~ Tilde 물결표
[ Left Bracket, Left Square Bracket, Open Bracket 대괄호 열고
] Right Bracket, Right Square Bracket, Closed Bracket 대괄호 닫고
{ Left Curly Bracket, Left Brace 중괄호 열고
} Right Curly Bracket, Right Brace 중괄호 닫고
\ Backslash, Reverse Solidus 역슬래시, 원
| Vertical Line, Vertical Bar, Pipe 수직 막대
' ' Apostrophe, Single Quote 작은따옴표
" " Quotation Mark, Double Quote 큰따옴표
; Semicolon 세미콜론
: Colon 콜론, 땡땡
< Less than Sign, Left Angle Bracket 꺽쇠열고, 보다 작은
> Greater than Sign, Right Angle Bracket 꺽쇠닫고, 보다 큰
, Comma 쉼표, 콤마
. Full Stop, Period, Dot, Point 마침표
/ Slash, Forward Slash, Solidus 슬래시
? Question Mark 물음표
 

 

정규표현식 공부하다가 한번 숙지하면 좋을 것 같아서 찾아서 정리해보았다.

 

참고사이트

https://linuxism.ustd.ip.or.kr/780

https://agibbyeongari.tistory.com/865

+ Recent posts