주노 님의 블로그

20240730 본캠프 12일차 TIL 본문

TIL

20240730 본캠프 12일차 TIL

juno0432 2024. 7. 30. 21:24

본캠프 12일차 내용 간단요약

  • 09:00 ~ 10:00 : 코드카타
  • 10:00 ~ 12:00 : 개인 과제
    LV3-2 과제
  • 12:00 ~ 13:00 : 점심시간
  • 13:00 ~ 14:00 : 개인 과제
    과제 리팩토링
  • 14:00 ~ 15:00 : 자바 복습
  • 15:00 ~ 18:00 : 스프링 복습
  • 18:00 ~ 19:00 : 저녁시간
  • 19:00 ~ 20:00 : 깃 심화 강의
  • 20:00 ~ 21:00 : TIL작성 

오늘 해야할 일✔️ 🔺 ❌

🔺 과제 완성 및 마무리


코드카타 - 가장 가까운 같은 글자

더보기

문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.
예를 들어, s="banana"라고 할 때,  각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.

b는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
a는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
n은 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
a는 자신보다 두 칸 앞에 a가 있습니다. 이는 2로 표현합니다.
n도 자신보다 두 칸 앞에 n이 있습니다. 이는 2로 표현합니다.
a는 자신보다 두 칸, 네 칸 앞에 a가 있습니다. 이 중 가까운 것은 두 칸 앞이고, 이는 2로 표현합니다.
따라서 최종 결과물은 [-1, -1, -1, 2, 2, 2]가 됩니다.

문자열 s이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해주세요.

제한사항
1 ≤ s의 길이 ≤ 10,000
s은 영어 소문자로만 이루어져 있습니다.

 

입출력 예

s                     result

"banana"      [-1, -1, -1, 2, 2, 2]

"foobar"     [-1, -1, 1, -1, -1, -1]

 

라는 문제가 있다

 

푸는 방법은 

class Solution {
    public int[] solution(String s) {
        int[] answer = new int [s.length()];
        boolean flag = true;
        for(int i = s.length()-1;i>=0;i--) {
            flag = true;
            int count = 1;
            answer[i]=-1;
            for (int j = i-1; j >= 0; j--) {
                if (flag == true && s.charAt(i) == s.charAt(j)) {
                    flag = false;
                    answer[i] = count;
                }
                count++;
            }
        }
        return answer;
    }
}

 

위와 같다

i를 고정한후,  j를 i보다 하나 더 작게 (i랑 겹치면 자기를 판단해버림)

반복문을 돌면서 같으면 flag값을 둬서 첫번째값인지 확인을한다 첫번째값이고 문자가 같으면 count로 그 위치의 거리를 알 수 있다.

 

하지만 내 코드에서는 비효율적인 부분을 볼 수있는데

flag가 false라도 j반복문은 모두 돌게된다

결국 시간복잡도는 o(n^2)이 되는것

 

뾰족한 수가 떠오르지않아 챗지피티에게 물어봤다

 

import java.util.HashMap;

class Solution {
    public int[] solution(String s) {
        int[] answer = new int[s.length()];
        // map을 사용한다 char과 문자의 마지막 위치를 저 장한다
        HashMap<Character, Integer> lastSeen = new HashMap<>();
        
        //for문을 돌아 전체 길이를 반복한다
        for (int i = 0; i < s.length(); i++) {
        //currentChar변수를 생성하여 그 위치의 문자를 할당한다
            char currentChar = s.charAt(i);
            //만약 현재 위치의 char이 lastSeen에 있으면
            if (lastSeen.containsKey(currentChar)) {
            //그 위치를 반환하고
                answer[i] = i - lastSeen.get(currentChar);
            } else {
            //아니면 -1를 반환한다
                answer[i] = -1;
            }
            //그 결과는 map에 저장된다
            lastSeen.put(currentChar, i);
        }
        
        return answer;
    }
}

따라서 map에 처음부터 모든 문자가 등록된게 아니라

처음부터 쌓으면서 진행하는것

 

이런방법도 있구나를 느꼈다 


코드카타 - sql

더보기

PLACES 테이블은 공간 임대 서비스에 등록된 공간의 정보를 담은 테이블입니다. PLACES 테이블의 구조는 다음과 같으며 ID, NAME, HOST_ID는 각각 공간의 아이디, 이름, 공간을 소유한 유저의 아이디를 나타냅니다. ID는 기본키입니다.

 

문제

이 서비스에서는 공간을 둘 이상 등록한 사람을 "헤비 유저"라고 부릅니다. 헤비 유저가 등록한 공간의 정보를 아이디 순으로 조회하는 SQL문을 작성해주세요.

 

라는 문제가 있다

select id, name, host_id
from places
where host_id IN (
    select host_id
    from places
    group by host_id
    having count(*) >= 2
)
order by id;

 

어제 결국 문제를 풀지 못했다 그래서 검색했음

where절에도 서브쿼리를 쓸 수 있다니

HOST_ID가 공간을 둘 이상 예약한 사람을 해비유저라고 한다

 

    select host_id
    from places
    group by host_id
    having count(*) >= 2

 나는 이렇게만 사용하면 될 줄 알았는데 안되는 이유를 알았다

GROUP BY로 묶을수는 있어도

그 묶은것을 또 풀어서 출력을 해야하기때문에 서브쿼리로 감싼것이다

 

WHERE절에 서브쿼리를 넣거나 본인테이블을 본인테이블이 조인을 해서 조인문안에다가 SELECT문을 넣는것도 배울수 있었다.

 


과제 코드 개선

더보기

2-10 개선

구현해놓고 보니 2-10에 추상 클래스를 명시해놓고 2-9를 사용하고 있었다

그래서 수정했다

 

2-1 개선

요구사항을 자세히 보니 exception 클래스를 생성하고

Exception 클래스를 생성하여 throw 합니다. (매개변수로 해당 오류 내용을 전달합니다.)

라고 한다

badInputException을 사용해서 매개변수로 msg를 받고

이렇게 전달해준다.

 

아마 과제 3-1을 먼저 만들어서 아마 위 연산자 에러는 뜨지않을것이다.. default로 절대 가지않는다 순서는 꼬였지만 그래도 구현해놔야할거같아서...

 

3-2

구현했지만 대차게 더러운코드가 되어서 내일 아침에 잠깐 고민해볼 예정이다


깃허브 강의

더보기

git branch 브랜치명 : 브랜치 생성하기

git branch : 브랜치 확인하기

git switch 브랜치명 OR git checkout 브랜치명 : 브랜치 이동

git merge 브랜치명: 브랜치 합치는 명령어

git push origin 브랜치명 :

pull request : 합칠때 다른 팀원이 작업한 내역을 봐야할때, 만약 로컬에서 확인한다면

 

만약 협업을 한다면?

Main브랜치 : 배포용

develop 브랜치 : 테스트용

기능 브랜치 : 기능 개발용

로 개발하는게 좋다

 

develop를 개발 중 브랜치로, 기능 브랜치로 pull해서 테스트후, 충돌이 나지 않으면 기능브랜치에서 develop 브랜치로 push하기

 

팀 협업을 할때는?

1. 레파지토리를 만들 팀장이 레포지토리를 생성한다

2. dev 브랜치를 생성하여 깃허브에 반영한다 (git switch -c dev , git push origin dev)

3. settings > dev브랜치를 default로 고정한다

4. 팀원을 collaborator로 등록한다

5. 팀원은 초대를 받으면 git clone을 한다(초대를 받은 후 git clone 주소 .)

6. 팀원은 받으면 git switch로 기능 브랜치를 만든다

7. 브랜치를 만든후 push할일이 있으면 push하고 깃허브 페이지의 pull request를 한다

8. 팀원은 base(옮길)브렌치와 compare(결합할 내 기능 브랜치)를 확인한다

9. 팀은 merge pull request를 한다

10. 합쳐진 내용을 반영한다 (git pull origin dev

 


오늘의 회고 & 12시간 몰입했는가?

오늘은 그동안 공부한 스프링 복습했다

내일은 스프링 공부 계속하고 피드백 나오면 정리해야지

한 2시간은 멍때린듯..


찾아볼 내용

코테에 사용하는 컬렉션 예제보기

'TIL' 카테고리의 다른 글

20240801 본캠프 14일차 TIL  (0) 2024.08.01
20240731 본캠프 13일차 TIL  (0) 2024.07.31
20240729 본캠프 11일차 TIL  (0) 2024.07.29
20240726 본캠프 10일차 TIL  (0) 2024.07.26
20240725 본캠프 9일차 TIL  (0) 2024.07.25