728x90
반응형
SMALL

여름에 강아지도 감기는 안걸린다고 하는데... 

감기로 인해 몸이 안좋아서 요즘 빌빌거리고 있었습니다 ㅠㅠ

그래서 오늘 병원 투어 후 세션 다녀왔습니다~

자신의 경험에 대한 이야기를 들려주기 때문에 다른 세션들 보다 조금 더 와닿는게 많았습니다.

정말로 제가 어떤 부분이 부족했는지, 이런 상황에서 어떻게 행동하면 좋을지를 보여주는 좋은 방법들을 알아간 시간이였습니다.

항상 느끼는 것이지만, 회고록을 꼭 써야겠습니다..!!!! ㅠㅠ 그전에 쓰러지듯 잠을 자버리는게.. 문제입니다 ㅠㅠ

 


 

동기화
끊긴 동기화 : 가진 시간을극복할 수 있는 해결 방법 찾기

  • 지속적인 리더와의 근황체크
  • 궁금/이상한 건 그냥 넘어가지 않고 꼭 즉시 물어보기
  • 이해한 게 맞는지 한 번 더 체크
  • 빠른 나의 상태 공유 특히 미리 말하기
  • 도움 요청하기
  • 내가 개입 못하는 건 빠지기 (감사와 리액션 챙기기)
    • 동료들의 시간 존중하기

끊임없는 동기화 = 내 업무 효율 up = 팀워크 up

  • 필요하다 생각하면 일단 일정 잡기
  • 이슈가 생기면 바로 운 띄우기
  • 워크 타임 지난 질문은 미루지 말고 예약으로 전송
  • 회의록은 짧게라도 바로 작성하며 시간 단축
  • 회의 참석자는 아니지만 전파가 필요하다면 설명 전이라도 멘션하여 공유
  • 고맙다고 느꼈을 때 바로 전하기
728x90
반응형
LIST
728x90
반응형
SMALL

1. 반에서 가장 키 큰 사람을 찾는 방법

  • 한 명씩 물어보면서 키가 제일 큰 사람을 기억하고 다음 사람이 이전에 제일 큰 사람보다 크다면 그 사람을 기억한다. 이 과정을 끝까지 진행하면 가장 큰 사람을 찾을 수 있다.

 

2. 상황이 복잡해 진다면?

  • 가장 키 큰 사람이 두명이라면?
  • 가장 같은 키를 많이 가진 수의 사람들을 구한다면?

 

3. 자료구조의 중요성

  • 이 로그에서는 자세히 설명해주지는 않지만 보다 빠르고 편리하게 계산하기 위해서는 적절한 자료구조를 선택해야 한다.
  • 배열, 리스트, 맵, 셋 등등 자료구조의 특성과 장단점을 이해하고 사용해야 한다.

 

4. 예외 처리(멍청한 컴퓨터 말썽 못부리게 하기)

  • 평균 값을 구하는 알고리즘을 만들 때 sum이라는 변수에 모든 값을 더한다.
  • N이라는 변수에 개수를 구한다.
  • 하지만 N이 0개라면? > 컴퓨터는 sum/N을 진행해버리고 0으로 나누는 참사(에러)가 발생할 것이다.
  • 따라서 N이 0일 때는 계산을 하지 말라는 예외 처리가 필요하다.

5. 선형 알고리즘

  • 처리 시간이 데이터양에 정비례 하는 알고리즘을 의미한다.
  • 이 로그에서는 선형 알고리즘만 딱 말했지만 정비례하지 않는 알고리즘이 있을 것이다.
    • for 문을 n만큼 2번 돌면 n의 제곱만큼 계산된다. 이것은 정비례가 아닌 제곱에 비례하는 것이다.

6. 빅-오 표기법

  • 책에서는 안알려주는 것 같지만 자주 사용하는 용어이다.
  • 가장 높은 차수의 항만 표기하는 것이다.
    • for문을 n+1만큼 2번 돌면 n^2+2n+1만큼 돈다.
    • 이것을 O(n^2)으로 아주 쉽게 표현해주는 것이다.
    • 수학적으로 접근한다면 n이 3일때는 n^2=9, 2n+1=7이다 . 거의 반반씩 비율을 차지하고있다.
    • 하지만 n이 10000이라면? n^2=100000000, 2n+1=20001이다. 0.02% 비율이다.
    • 숫자가 커질 수록 가장 높은 차수의 항만 의미를 가지며 빅-오 표기법을 통해 시간 복잡도의 경향성만 표기하는 것이다.
  • O(1) : 데이터 양에 상관없이 처리 시간이 일정함
  • O(n) : 데이터 양에 비례하여 처리 시간이 증가
  • NLogN, n^2, n^3, 2^n 등등 이 있다.
  • 참고로 시간 복잡도를 구하는 방법은 최악의 경우를 생각하는 것이다.
    • n명의 사람 중 유재석를 찾으라고 했을 때 마지막(n) 번째 사람이 유재석인 경우
728x90
반응형
LIST
728x90
반응형
SMALL

문제 설명

압축

신입사원 어피치는 카카오톡으로 전송되는 메시지를 압축하여 전송 효율을 높이는 업무를 맡게 되었다. 메시지를 압축하더라도 전달되는 정보가 바뀌어서는 안 되므로, 압축 전의 정보를 완벽하게 복원 가능한 무손실 압축 알고리즘을 구현하기로 했다.

어피치는 여러 압축 알고리즘 중에서 성능이 좋고 구현이 간단한 LZW(Lempel–Ziv–Welch) 압축을 구현하기로 했다. LZW 압축은 1983년 발표된 알고리즘으로, 이미지 파일 포맷인 GIF 등 다양한 응용에서 사용되었다.

LZW 압축은 다음 과정을 거친다.

  1. 길이가 1인 모든 단어를 포함하도록 사전을 초기화한다.
  2. 사전에서 현재 입력과 일치하는 가장 긴 문자열 w를 찾는다.
  3. w에 해당하는 사전의 색인 번호를 출력하고, 입력에서 w를 제거한다.
  4. 입력에서 처리되지 않은 다음 글자가 남아있다면(c), w+c에 해당하는 단어를 사전에 등록한다.
  5. 단계 2로 돌아간다.

압축 알고리즘이 영문 대문자만 처리한다고 할 때, 사전은 다음과 같이 초기화된다. 사전의 색인 번호는 정수값으로 주어지며, 1부터 시작한다고 하자.

색인 번호 1 2 3 ... 24 25 26

단어 A B C ... X Y Z

예를 들어 입력으로 KAKAO가 들어온다고 하자.

  1. 현재 사전에는 KAKAO의 첫 글자 K는 등록되어 있으나, 두 번째 글자까지인 KA는 없으므로, 첫 글자 K에 해당하는 색인 번호 11을 출력하고, 다음 글자인 A를 포함한 KA를 사전에 27 번째로 등록한다.
  2. 두 번째 글자 A는 사전에 있으나, 세 번째 글자까지인 AK는 사전에 없으므로, A의 색인 번호 1을 출력하고, AK를 사전에 28 번째로 등록한다.
  3. 세 번째 글자에서 시작하는 KA가 사전에 있으므로, KA에 해당하는 색인 번호 27을 출력하고, 다음 글자 O를 포함한 KAO를 29 번째로 등록한다.
  4. 마지막으로 처리되지 않은 글자 O에 해당하는 색인 번호 15를 출력한다.

현재 입력(w) 다음 글자(c) 출력 사전 추가(w+c)

K A 11 27: KA
A K 1 28: AK
KA O 27 29: KAO
O   15  

이 과정을 거쳐 다섯 글자의 문장 KAKAO가 4개의 색인 번호 [11, 1, 27, 15]로 압축된다.

입력으로 TOBEORNOTTOBEORTOBEORNOT가 들어오면 다음과 같이 압축이 진행된다.

현재 입력(w) 다음 글자(c) 출력 사전 추가(w+c)

T O 20 27: TO
O B 15 28: OB
B E 2 29: BE
E O 5 30: EO
O R 15 31: OR
R N 18 32: RN
N O 14 33: NO
O T 15 34: OT
T T 20 35: TT
TO B 27 36: TOB
BE O 29 37: BEO
OR T 31 38: ORT
TOB E 36 39: TOBE
EO R 30 40: EOR
RN O 32 41: RNO
OT   34  

입력 형식

입력으로 영문 대문자로만 이뤄진 문자열 msg가 주어진다. msg의 길이는 1 글자 이상, 1000 글자 이하이다.

출력 형식

주어진 문자열을 압축한 후의 사전 색인 번호를 배열로 출력하라.

입출력 예제

msg answer

KAKAO [11, 1, 27, 15]
TOBEORNOTTOBEORTOBEORNOT [20, 15, 2, 5, 15, 18, 14, 15, 20, 27, 29, 31, 36, 30, 32, 34]
ABABABABABABABAB [1, 2, 27, 29, 28, 31, 30]
package LV2;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class H17684 {
        public int[] solution(String msg) {
            Map<String, Integer> dict = new HashMap<>();
            List<Integer> result = new ArrayList<>();

            // 사전 초기화: A-Z까지의 모든 단어를 사전에 추가
            for(int i = 0; i < 26; i++) {
                dict.put(String.valueOf((char)('A' + i)), i + 1);
            }

            int dictSize = 27;  // 사전에 추가될 새로운 단어의 색인 번호
            int msgLength = msg.length();  // 입력된 메시지의 길이

            // 메시지를 순차적으로 확인
            for(int i = 0; i < msgLength; ) {
                String w = "";  // 현재 확인하고 있는 단어
                // 사전에 있는 단어인지 확인하며 메시지를 읽음
                while(i < msgLength && dict.containsKey(w + msg.charAt(i))) {
                    w += msg.charAt(i);
                    i++;
                }

                // 사전에 없는 단어를 찾아낸 경우 그 단어의 색인 번호를 결과에 추가
                result.add(dict.get(w));

                // 사전에 새로운 단어로 추가
                if(i < msgLength) {
                    dict.put(w + msg.charAt(i), dictSize++);
                }
            }

            // 결과를 배열로 변환하여 반환
            int[] answer = new int[result.size()];
            for(int i = 0; i < result.size(); i++) {
                answer[i] = result.get(i);
            }

            return answer;
        }
    }

A-Z까지의 모든 단어를 사전에 추가하고, 입력된 문자열을 순차적으로 확인하며 사전에 없는 단어를 찾아낼 때까지 반복한다.

사전에 없는 단어를 찾으면 그 단어의 색인 번호를 결과에 추가하고, 사전에 새로운 단어로 추가한다.

이 과정을 문자열의 끝까지 반복하고, 모든 과정이 끝나면 결과를 배열로 변환하여 반환한다.

728x90
반응형
LIST

'알고리즘 > 프로그래머스 JAVA LV.2' 카테고리의 다른 글

주차 요금 계산  (0) 2023.06.05
[3차] n진수 게임  (0) 2023.06.05
게임 맵 최단거리  (0) 2023.05.30
오픈채팅방  (0) 2023.05.30
k진수에서 소수 개수 구하기  (0) 2023.05.30

+ Recent posts