Algorithm & Data Structure/Kakao

https://programmers.co.kr/learn/courses/30/lessons/42888

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr

입력을 두가지 형태로 분류하여 해결합니다.

 

입력 형식: record=> [status] [uid] [nic] (*status == enter, leave, change)

1. [status] [nic] => Queue 에 저장

2. [uid] [nic] => HashMap 에 저장(해쉬맵의 특성 중 key 가 중복되면 value가 가장 최신값으로 갱신됨)

 

알고리즘

record의 크기 만큼 반복문을 돌면서

1. status에 따라 출입여부를 Queue에 저장 해놓습니다.(change는 저장 필요 x)

2. 사용자의 닉네임 변경 케이스를 생각해줍니다.

    1. 채팅창 밖에서 닉네임을 변경하는 경우(status==enter) => 해쉬맵을 사용해 닉네임 갱신 필요

    2. 채팅창 안에서 닉네임을 변경하는 경우(status==change) => 해쉬맵을 사용해 닉네임 갱신 필요

3. Queue의 사이즈만큼 반복문을 돌면서  Queue에 저장된 status에 따른 입출입 여부와, uid(key)에 따른 Hashmap에 저장된 nic(value)를 출력 해줍니다.

 

즉, uid가 기준이 되어 Queue에는 입출입여부, HashMap에는  닉네임이 저장되어 있고, 마지막에 Queue를 돌면서 입출입 여부와 uid를 key로 사용하고 있는 HashMap에서 nic(value)를 출력해 주면 됩니다.

 

https://programmers.co.kr/learn/courses/30/lessons/42893

 

프로그래머스

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

programmers.co.kr

정규표현식 공부하기 딱 좋은 문제입니다.

정규표현식 이용해서 문자열 추출만 잘해내면 간단한 문제였습니다.

 

* pageInfo라는 페이지 정보를 담는 클래스를 만들어서 사용합니다.

* head태그와 body태그를 substring해서 해당 url과 외부링크, 단어를 찾아주었습니다.

* 외부링크를 찾으면 큐에 담아놓고, 페이지 객체 생성후 객체의 List에 담아줍니다.

* 기본 점수를 구할때, 찾는 단어의 앞, 뒤 단어가 문자인지 검사해주면 됩니다.

* 링크점수와 매칭점수를 구할때 리스트가 비어있는 경우와, 0으로 나눗셈 하는 경우를 생각해주고 예외처리합니다.

 

https://programmers.co.kr/learn/courses/30/lessons/42892

 

프로그래머스

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

programmers.co.kr

이진 트리를 구성하고 전위순회 후위순회만 하면 되는 문제였습니다.

이진 트리를 구성하는게 어려웠던 문제였습니다.

 

우선 y축 좌표 기준 내림차순, x축 기준 오름차순 정렬해준뒤,

재귀호출을 사용해 각 노드의 부모노드를 정해줍니다.

그 후 전위 후위 순회 합니다.

 

https://programmers.co.kr/learn/courses/30/lessons/60059

 

코딩테스트 연습 - 자물쇠와 열쇠 | 프로그래머스

[[0, 0, 0], [1, 0, 0], [0, 1, 1]] [[1, 1, 1], [1, 1, 0], [1, 0, 1]] true

programmers.co.kr

lock을 3배 넓게 하는것을 생각하는게 핵심인 문제같습니다.

자물쇠는 4회전 가능하고 각 회전마다 넓어진 lock안에서 이동하며 잠금해제가 가능한지 파악합니다.

 

알고리즘

1. lock을 3배 넓히고 가운데에 진짜 lock을 위치시킨다.

2. key를 90도 회전 4번 하고, 각 회전마다 넓어진 lock 안에서 이동하며 잠금해제 여부 파악한다.

2-1 좌측 상단 부터 평행이동 하는 key가 가운데 진짜 lock 부분에 겹쳤을 때마다 잠금해제 여부 파악

2-2 잠금해제 여부 파악은 가운데 진짜 lock 부분이 돌기끼리 겹쳐있는지, 빈 홈이 있는지 파악하는 것.

3. 4회전 모두 끝나고 answer 리턴.

 

* key가 lock에 맞는 키인지 확인하는 방법은

돌기가 1이고 홈이 0이므로

돌기끼리 만나면 1+1=2, 돌기와 홈은 1+0=1, 홈과 홈은 0+0=0

이렇게 key와 lock 을 더해보면 상태를 알 수 있다.

 

* key를 넓어진 lock 전체를 탐색하게 하고 가운데에 겹쳤을 때마다 isUnlock() 을 사용해 잠금해제 파악하는데,

이때 진짜 lock 전체를 검사해야 key와 닿지 않은곳에 채우지 못 한 홈(0)이 있는지 확인할 수 있다.

 

https://programmers.co.kr/learn/courses/30/lessons/60058

 

코딩테스트 연습 - 괄호 변환 | 프로그래머스

카카오에 신입 개발자로 입사한 콘은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를 컴파일하여 로그를 보니 대부분 소스 코드 내 작성된 괄호가 개수는 맞지만 짝이 맞지 않은 형태로 작성되어 오류가 나는 것을 알게 되었습니다. 수정해야 할 소스 파일이 너무 많아서 고민하던 콘은 소스 코드에 작성된 모든 괄호를 뽑아서 올바른 순서대로 배치된 괄호 문자열을 알려주는

programmers.co.kr

문제에 알고리즘은 주어지지만 알고리즘을 이해하는데 시간이 꽤 걸리는 문제같습니다.

그리고 마지막에 괄호를 뒤집는다는 것을 제대로 이해하는데 시간이 걸렸습니다.

천천히 차분히 문제를 읽고 이해하는게 중요하다는걸 느끼게 해주는 문제같습니다.

 

'(' 의 개수와 ')' 의 개수가 같다면 이를 균형잡힌 괄호 문자열이라고 부릅니다.

그리고 여기에 '('와 ')'의 괄호의 짝도 모두 맞을 경우에는 이를 올바른 괄호 문자열이라고 부릅니다.

 

주어진 알고리즘

1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.

2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다.

 

3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다.

3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다.

 

4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다.

4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다.

4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.

4-3. ')'를 다시 붙입니다.

4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.

4-5. 생성된 문자열을 반환합니다.

 

매개변수 설명

  • p는 '(' 와 ')' 로만 이루어진 문자열이며 길이는 2 이상 1,000 이하인 짝수입니다.
  • 문자열 p를 이루는 '(' 와 ')' 의 개수는 항상 같습니다.
  • 만약 p가 이미 올바른 괄호 문자열이라면 그대로 return 하면 됩니다.

매개변수 설명을 잊으면 안됩니다.

 

* 주의할점은 4-4에서 나머지 괄호들을 뒤집을때, 괄호의 각 순서별로 하나씩 토글해준다는 느낌으로 구현해야합니다.

* 코드에 알고리즘을 순서대로 주석처리 하였습니다.

 

https://programmers.co.kr/learn/courses/30/lessons/60057

 

코딩테스트 연습 - 문자열 압축 | 프로그래머스

데이터 처리 전문가가 되고 싶은 어피치는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문자열에서 같은 값이 연속해서 나타나는 것을 그 문자의 개수와 반복되는 값으로 표현하여 더 짧은 문자열로 줄여서 표현하는 알고리즘을 공부하고 있습니다. 간단한 예로 aabbaccc의 경우 2a2ba3c(문자가 반복되지 않아 한번만 나타난 경우 1은 생략함)와 같이 표현할 수

programmers.co.kr

문자열 처리 문제였습니다.

문자열 길이의 2분의 1 만큼 자르는 길이를 정해줍니다. (절반이상 자르면 중복검사를 할 수 없습니다)

반복문을 통해 문자열을 자르는 길이별로 중복검사를 해주며 새로운 String을 만들어서 최소 길이를 구합니다.

문자열 인덱스 범위조정과 예외처리를 해줘야하는게 까다로웠습니다.

 

* n번째 인덱스에서 len만큼 이 기준(n ~ n+len)이고 그 다음 len만큼이 비교대상(n+len ~ (n+len)+len) 이므로,  (n+len) + len 이 문자열의 길이보다 큰지 검사해줘야 합니다.

* 문자열 길이가 1일때 => 1 리턴

* 인덱스 범위를 초과한 뒤 중복 유/무 검사, 중복이 있다면 뒤 에 남는 문자가 있는지 검사

ex) abcdefefi => abcd2efi

여기서 i를 처리 해줘야 합니다

 

+ Recent posts