코드스테이츠 백엔드 부트캠프 26일차 - 코테준비

wish17·2023년 1월 19일
0
post-thumbnail

DailyCoding

  1. 첫 글자가 대문자인 문자열을 리턴하시오.
public class LetterCapitalize {
    public String letterCapitalize(String str) {

        if(str=="") return str;

//        while(str.contains("  ")){ // 중복된 공백 제거
//            str = str.replaceAll("  ", " "); // 공백 2개를 1개로 바꾸기
//        }
        String result = "";
        String[] strChange1 = str.split("\\s"); // 띄어쓰기 기준으로 단어 분리, 배열로 저장
        String strChange2 = "";

        for(int i=0; i<strChange1.length; i++){ // 단어 하나씩 반복문 실행
            //strChange1[i] = strChange1[i].replace(" ", ""); // i번째 단어에 공백 남아있으면 공백 제거 trim()써도 됨. //공백기준으로 split 했기 때문에 빈배열 자체가 하나의 배열요소로 들어갔다.
            if(strChange1[i].equals("")){ //공백은 그대로 공백 출력하게 나눠주기
                strChange2 = strChange1[i];
            }else{
                strChange2 = strChange1[i].substring(0, 1).toUpperCase() + strChange1[i].substring(1);
            }

            if (result == "") result = strChange2;
            else result = result + " " + strChange2; //String.join쓰면 조금 더 간단히 가능
        }
        return result;
    }
}

공백은 단어 사이를 구분하는 용도로만 쓰이는 줄 알고 중복된 공백을 제거하는 등 잘못된 방향으로 접근했었다.

공백간격도 그대로 유지해야 하기 때문에 위와 같이 코드를 작성해
공백이 두칸 이상일 때 split으로 인해 빈배열이 하나 추가되어 공백을 추가해주는데 사용할 수 있었다.

Section2 - 코딩테스트 준비

의사코드(pseudocode)

의사코드 사용의 장점

  • 시간단축
  • 디버깅에 용이함
  • 사용한 프로그래밍 언어를 모르는 사람도 이해, 소통 가능

자신만의 원칙을 만들어, 일관성이 있으며 다른 사람도 이해할 수 있는 수도코드를 작성하도록 하자.

시간복잡도(Time Complexity)

입력값의 변화에 따라 연산을 실행할 때, 연산 횟수에 비해 시간이 걸리는 정도

자료출처

Big-O 표기법

입력값의 변화에 따라 연산을 실행할 때, 연산 횟수에 비해 시간이 얼마나 걸리는지 표기하는 방법

시간 복잡도 표기하는 방법

  • Big-O(빅-오)
  • Big-Ω(빅-오메가)
  • Big-θ(빅-세타)

위와 같이 3가지 방법이 있지만 주로 Big-O 사용

  • O(1) (= constant complexity)
    • 입력값에 상관없이 즉시 출력
    • ex. int a = 9999, sout(a)
  • O(n) (= linear complexity)
    • 입력값의 증가에 따라 출력시간도 같은 비율로 증가
    • ex. for문
  • O(log n) (= logarithmic complexity)

    • 입력값의 증가에 따라 출력시간 증가비율 감소
    • ex. BST (탐색할수록 경우의 수가 줄어든다)
  • O(n^2) (= quadratic complexity)

    • 입력값의 증가에 따라 출력시간이 n의 제곱수의 비율로 증가
    • ex. 2중for문
  • O(2^n) (= exponential complexity)

    • 입력값이 증가하면 출력시간이 2배로 증가
    • ex. 재귀+재귀

자료출처

total시간은 고정되어 있는데 입력값이 크면 효율 좋은 시간 복잡도를 선택해야 겠다고 아래처럼 추정이 가능하다.

데이터 크기 제한예상되는 시간복잡도
n<=1,000,000O(n) or O(logn)
n<=10,000O(n^2)
n<=500O(n^3)

시간복잡도 추가학습


시간복잡도 quiz 오답정리

4번

n ≥ 10,000일 때, 가장 느린(&&빠른) 시간 복잡도를 가지는 알고리즘의 Big-O 타입은? (문제 보기에서 O(1)은 없다)
(O(n), O(2n), O(log n), O(n2), O(n!) 중 택2)

나의 오답

  • 가장 빠른 Big-O = O(n)
  • 가장 느린 Gig-O = O(n!)

정답

  • 빠른 Big-O = O(log n)
  • 느린 Gig-O = O(n!)

O(log n)이 n==1 을 제외하고 O(n)보다 빠르다.

6번

int a = 0, 
int b = 0;

for (i = 1; i < n; i+=1) {
    a = a + 1;
}

for (j = 2; j < n; j+=1) {
    b = b + 1;
}

위 코드의 시간 복잡도를 Big-O로 표시한 것은?

나의 오답

  • O(2n)

정답

  • O(n)

for문이 2개라... 2n인줄 알았다.
같은 비율로 증가하고 있다면 5배건 10배건 O(n)으로 표기한다.
(O(1)인 알고리즘을 생각해보자. 단순 출력을 n번한다고 O(n)이라 표기하지 않는다)

9번

for (int i = 0; i < n; i++) {
	i *= k;
}

위 코드의 시간 복잡도를 Big-O 표기법으로 나타내시오.

나의 오답

  • O(log n)

정답

  • O(log n)
  • O(log k n)

log base는 big O notation에서 중요하지 않기때문에 log n이 정답이지만 수학적으로 log(basek)n === time 꼴로 k배수만큼 i가 커지며 n에 도달하기 때문에 O(log k n)도 정답이다.

Q: 근데 그렇게 치면 6번 문제도 수학적으로 따지면 2n 아닌가??..

A:


알고리즘

Greedy(탐욕 알고리즘)

선택의 순간마다 당장 눈앞에 보이는 최적의 상황만을 쫓아 최종적인 해답에 도달하는 방법
(항상 최적의 결과를 도출하는 것은 아니지만, 어느 정도 최적에 근사한 값을 빠르게 도출할 수 있는 장점이 있다.)

    1. 선택 절차(Selection Procedure): 현재의 상황에서 최적의 해답을 선택
    1. 적절성 검사(Feasibility Check): 선택된 해가 문제의 조건을 만족하는지 검사
    1. 해답 검사(Solution Check): 문제가 해결되었는지 검사하고, 해결되지 않았다면 1번으로 돌아가 반복

탐욕 알고리즘은 현재의 상황에서 최선의 판단을 하기 때문에 상황이 바뀔 수 있는 경우에는 최적의 해를 구할 수 없다.

따라서, 아래의 조건들을 만족할 때 사용해야 한다.

탐욕 알고리즘 적용 조건

  • 탐욕적 선택 속성(Greedy Choice Property)
    : 앞의 선택이 이후의 선택에 영향을 주지 않는다.

  • 최적 부분 구조(Optimal Substructure)
    : 문제에 대한 최종 해결 방법은 부분 문제에 대한 최적 문제 해결 방법과 같은 방법으로 구성된다.


완전 탐색 알고리즘(Brute-Force Algorithm)

모든 가능성을 시도하여 문제를 해결하는 방법

완전 탐색(brute force) = 가능한 모든 경우의 수를 전부 확인하여 문제를 푸는 방식

  • 최족의 솔루션 x
  • 공간복잡도와 시간복잡도를 고려하지 않고 최악의 방법이라도 솔루션 찾기에 집중하는 방법
  • 데이터 범위가 커질수록 비효율적
  • 문제의 복잡도에 매우 민감
  • 컴퓨터 성능에 기대는 방법

BFA 사용하는 경우

  • 프로세스 속도를 높이는데 사용할 수 있는 다른 알고리즘이 없을 때
  • 문제를 해결하는 여러 솔루션이 있고 각 솔루션을 확인해야 할 때

예시,종류

  • 순차 검색 알고리즘 (Sequential Search)
    • 배열 0번인덱스~끝번인덱스 까지 다 찾는 것 등
  • 문열 매칭 알고리즘 (Brute-Force String Matching)
    • 문자열에서 특정 문자열을 포함하는지 검사하는 알고리즘
  • 선택 정렬 알고리즘 (Selection Sort)
    • 오름,내림차순으로 정렬하는 정렬알고리즘
  • Tree 자료 구조의 완전탐색 알고리즘 - Exhausive Search (BFS, DFS)

이진 탐색 알고리즘(Binary Search Algorithm)

데이터가 정렬된 상태에서 절반씩 범위를 나눠 분할 정복기법으로 특정한 값을 찾아내는 알고리즘

앞서 정리한 BST와 비슷하지만 BST는 자료구조다! (다른거임)
































0개의 댓글

관련 채용 정보