본문 바로가기
TIL

[231106] 알고리즘 문제, 스탠다드반 과제

by 진진리 2023. 11. 6.
728x90
  • 알고리즘 문제 풀기

프로그래머스의 'JadenCase 문자열 만들기' 문제를 풀었다.

처음에는 split으로 공백 기준으로 문자열을 나눈 뒤 각 단어의 첫 글자를 isUpperCase()로 대문자로 만들었다.

그런데 문제의 조건에 공백이 여러 개 있을 수 있다고 되어있어서

문자열의 문자를 하나씩 검토하는 방식으로 바꿔야곘다는 생각이 들어 수정했다.

 

나는 문자열의 문자 하나씩 조회하면서 공백 다음 문자인지 flag를 통해 확인하였다.

문제를 풀고 난 뒤 다른 사람의 풀이를 확인했더니 문자열을 문자 하나씩 검사하는 것이 아니라

split을 이용해 각 문자 1개로 이루어진 문자열들의 배열로 만드는 방식을 사용했다.

 

split("")과 같이 사용하는 것은 처음 봐서 놀랐고

문자열 배열로 만들어 하나씩 검사하니까 문자 <-> 문자열로 변환하는 과정을 거치지 않아서 코드가 단순해졌다.

 

그렇지만 내가 작성한 풀이 방법이 원시타입을 사용해서 그런지 걸리는 시간이 더 적었다.

아무튼 처음 보는 방식이었기 때문에 기록해두면 좋을 것 같다.

 

나의 풀이
    public static String solution(String s) {
        s = s.toLowerCase();
        StringBuilder answer = new StringBuilder();
        int flag = 1;
        for(int i=0;i<s.length();i++){
            char c = s.charAt(i);
            if(flag == 1 && (c >= 'a' && c <= 'z')){
                answer.append((char)(c - 'a' + 'A'));
                flag = 0;
            }
            else{
                answer.append(c);
            }

            if(c == ' ') flag = 1;
            else flag =0;
        }

        return answer.toString();
    }

 

다른 사람의 풀이
class Solution {
  public String solution(String s) {
        String answer = "";
        String[] sp = s.toLowerCase().split("");
        boolean flag = true;

        for(String ss : sp) {
            answer += flag ? ss.toUpperCase() : ss;
            flag = ss.equals(" ") ? true : false;
        }

        return answer;
  }
}

  • 스탠다드반 자율 과제
학습 과제

  1. WAS(Tomcat), Servlet, JDBC란?
    • WAS: DB처리나 로직 처리를 요구하는 동적인 컨텐츠를 제공하는 서버 
    • Tomcat: Java 기반의 서블릿 컨테이너이자 웹 서버
      • Apache Tomcat: Apache + Tomcat. 정적인 데이터 처리와 동적인 데이터 처리를 효율적으로
      • Apache Tomcat을 직접 다운로드 받고 프로젝트에 삽입했어야 하는 Spring 프레임워크와 달리 SpringBoot는 기본적으로 starter-web dependency를 설정하면 자동으로 내장형 Apache Tomcat 제공
    • Servlet: 자바를 사용하여 웹 페이지를 동적으로 생성하는 서버 측 프로그램
      • 클라이언트의 요청을 처리하고 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술
      • 웹 요청과 응답의 흐름을 간단한 메서드 호출만으로 다룰 수 있게 해줌
      • Spring은 DispatcherServlet을 사용하여 Front Controller 패턴 방식으로 API 요청을 효율적으로 처리
      • 서블릿 컨테이너: 서블릿들의 생성, 실행, 파괴를 담당
    • JDBC: Java Database Connectivity로 DB에 접근할 수 있도록 Java에서 제공하는 API
      • 연결해야하는 DB의 JDBC 드라이버를 제공하면 DB 연결 로직을 변경할 필요 없이 DB 변경 가능
      • 각 DB에 맞도록 JDBC 인터페이스를 구현해 라이브러리로 제공하는데 이를 JDBC 드라이버라고 함
      • JdbcTemplate: 커넥션 연결, statement 준비 및 실행, 커넥션 종료 등의 반복적이고 중복되는 작업들을 대신 처리해줌
  2. JDBCTemplate, QueryMapper(MyBatis), ORM(JPA) 각각의 장단점
    • Application Layer에서 Database Layer에 접근하는 3가지 방법임
    • JDBCTemplate
      • 장점
        1. 반복문제 해결: JDBC를 사용할 때 발생하는 대부분의 반복작업을 처리해줌
        2. 설정의 편리함: build.gradle에 추가만 하면 사용 가능
      • 단점 
        1. 동적 SQL을 처리하기 어려움 -> MyBatis / Query DSL을 이용해서 처리
        2. 쿼리를 변경, 추가하기 위해 소스코드를 변경시켜야 함 (유지보수에 좋지 않음)
    • QueryMapper(MyBatis)
      • Spring과 관계없는 Data Access Layer에 속하는 프레임워크
      • 장점
        1. DAO 또는 소스코드로부터 쿼리를 분리
        2. 쿼리를 추가/삭제할 때 애플리케이션 코드를 새로 컴파일할 필요가 없고 유지보수가 쉬워짐
        3. 다양한 프로그래밍 언어로 구현이 가능
        4. 학습하기 쉬움
        5. 동적쿼리 작성에 좋음
      • 단점
        1. 쿼리 결과를 객체 지향적으로 사용할 수 없음
        2. 스키마 변경시 SQL 쿼리를 직접 수정해야 함
        3. 데이터베이스 변경시 로직도 함께 수정해야 함(DB에 종속적)
        4. 유지보수 및 테스트가 어려움
    • ORM(JPA)
      • 장점
        1. SQL에 의존적이지 않음(쿼리를 직접 작성할 필요가 없음) - 객체 중심으로 생산적인 개발이 가능
        2. 객체와 RDB의 패러다임 불일치 해결
        3. 가독성이 좋음
        4. 동일한 쿼리에 대한 캐시 기능을 사용
      • 단점
        1. 매핑 설계를 잘못했을 때 성능저하 발생
        2. 학습 시간이 오래 걸림
        3. 다수 테이블 조인시 신경써야 할게 많음
  3. Prepared Statement와 Statement의 차이
    • Statement
      • 쿼리문을 수행할 때마다 쿼리 문장 분석 -> 컴파일 -> 실행 과정을 거침
      • 매번 컴파일을 하기 때문에 성능상 이슈 발생
      • 실행되는 SQL문을 확인 가능
    • Prepared Statement
      • 컴파일이 미리 되어있기 때문에 더 좋은 성능
      • 특수문자를 자동으로 파싱해주기 때문에 SQL injection 같은 공격을 막을 수 있음
      • "?" 부분에만 변화를 주어 쿼리문을 수행하므로 실행되는 SQL문을 파악하기 어려움
      • 처음에만 쿼리 문장 분석 -> 컴파일 -> 실행 과정을 거친 후 캐시에 담아 재사용함
      • 동일한 쿼리를 반복 수행하는 경우 적은 부하를 주며 성능도 좋음
      • 사용자 입력값으로 쿼리문을 실행해야 하는 경우 사용
  4. 통합 테스트, 단위 테스트
    • 단위 테스트
      • 가장 작은 기능적 단위, 일반적으로 클래스 또는 메소드를 실행하여 예상대로 동작하는지 확인하는 테스트
      • 단위의 크기가 작을수록 복잡성이 낮아지고 동작을 표현하기 쉬워짐
    • 통합 테스트
      • 여러 모듈간의 상호작용과 조정을 검증하는데 중점을 둔 소프트웨어 테스팅
      • 유닛들이 결합되었을 때 올바르게 작동하는지 확인
  5. Spring이 나오게 된 이유, Spring Boot가 나오게 된 이유
    • 스프링의 등장 배경
      • 상업용 웹 애플리케이션 개발을 돕기 위한 EJB(Enterprise Java Bean) 등장
      • EJB의 단점: 어려운 테스트/배포, 객체지향 디자인의 방해요소, 간단한 작업의 불필요한 난이도 상승, 제한적 WAS 선택
      • 스프링 프레임워크 -> POJO(Plain Old Java Object) 모델 채택: 특정 프레임워크나 컨테이너에 대한 종속성없이 객체를 관리할 수 있는 컨테이너를 제공
    • 스프링부트의 등장 배경
      • JavaScript의 Node.js나 Python의 Djange와 같이 빠르게 웹 애플리케이션을 개발하고 배포할 수 있는 경량 프레임워크들에 비해 스프링은 사용할 라이브러리들을 채택하고 호환성을 따져야 했음
      • 자동 설정을 통해 빠르게 스프링 기반 애플리케이션 개발을 시작할 수 있도록 도와주는 도구
      • Containerless: 서블릿 컨테이너에 대한 준비를 직접하지 않아도 되는 방식
      • Opinionated:스프링부트 스스로 사용할 도구를 선택하고 기본적인 구성을 세팅. 필요한 빈들을 자동 구성.
      • 일단 정해주는 대로 만들고 개발자가 원하는 부분만 직접 바꾸도록 함
  6. 객체지향 프로그래밍의 장단점
    • 객체지향 프로그래밍: 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법
    • 장점
      1. 코드 재사용이 용이
      2. 유지보수가 쉬움
      3. 대형 프로젝트에 적합
      4. 직관적인 코드 분석이 가능
      5. 신뢰성 높은 프로그래밍이 가능
    • 단점
      1. 처리속도가 상대적으로 느림
      2. 객체가 많으면 용량이 커질 수 있음
      3. 설계시 많은 시간과 노력이 필요