오늘의 추천곡은 DPR IAN - Calico 입니다.
적당히 리듬타기 좋은 노래입니다.
오늘의 코드 카타는 롤케이크 자르기 입니다.
사실 어제 코드 카타를 풀었기 때문에, 제 머릿속에는 스택만이 가득했습니다.
그래서 저는 스택으로 접근하기로 했습니다. 롤케이크를 스택에 넣고, Set 하나에 계속 pop시켜 넣었습니다.
그리고 Set 하나는 스택 자체를 변경하는 방식을 사용하여 풀어봤습니다.
하지만, 역시 해당 방법은 시간 초과될 수밖에 없었습니다.
그래서 toSet 같은 부분은 제외하고, Map의 값의 값을 사용해서 해결했습니다.
import java.util.ArrayDeque
class Solution {
fun solution(topping: IntArray): Int {
var answer: Int = 0
var cutSet: MutableSet<Int> = mutableSetOf()
var cake = ArrayDeque<Int>()
val cakeMap: MutableMap<Int, Int> = mutableMapOf()
var n = 0
for(i in topping.size - 1 downTo 0) {
cake.push(topping[i])
if(cakeMap.get(topping[i]) == null) {
cakeMap += (topping[i] to 1)
} else {
cakeMap.compute(topping[i]) { _, v -> v!! + 1 }
}
}
for(i in 0..topping.size - 1) {
n = cake.pop()
cutSet += n
cakeMap.compute(n) { _, v -> v!! - 1 }
if(cakeMap[n]!! <= 0) cakeMap.remove(n)
if(cutSet.size == cakeMap.size) answer++
}
return answer
}
}
시간복잡도 자체는 조금 아쉽네요.
오늘은 피그마 강의를 들었습니다.
먼저, 기본적으로 인터페이스를 다루는 방법을 배웠습니다.
Ctrl + 왼쪽 클릭을 하면 한 개체를 선택할 수 있습니다.
Ctrl + D를 하면 선택한 개체를 복사할 수 있습니다.
도형을 생성할 때, Shift + 드래그를 하면 비율을 유지할 수 있습니다.
그리고, P 는 펜, R은 도형, T는 텍스트를 선택할 수 있습니다.
개체를 선택하고 Shift + 드래그를 하면 수직 이동, Shift + Alt + Drag를 하면 수직 복사가 됩니다.
피그마는 텍스트 스타일과 컬러 스타일을 저장해둘 수 있습니다.
정말 간단하게, 텍스트는 Text의 오른쪽 사각형 4개, 컬러는 Fill의 오른쪽 사각형 4개를 선택하면 됩니다.
그후, +를 눌러서 저장할 수 있는데요. 이때 텍스트 스타일의 경우, 다음과 같이 적어줍니다.
텍스트 스타일 이름/글씨 굵기/글씨 크기 => Body/Bold/12
여기서 /를 쓰면 피그마에서는 분류로 판단해서 자동으로 분류가 됩니다.
컬러 스타일은 다음과 같이 적어줍니다.
컬러 스타일 이름/색깔 => Primary/Pink
이렇게 스타일을 만들어두고, 일괄적으로 적용시켜 사용하면 됩니다.
피그마에는 컴포넌트라는 개념이 존재합니다.
마치 클래스같기도 한데, 한 아이콘을 선택하고, 상단에 있는 4개의 사각형으로 이루어진 마름모를 눌러 컴포넌트화할 수 있습니다.
이렇게 하면, 스타일처럼 아이콘을 쉽게 다룰 수 있습니다.
오늘은 2번째 깃허브 특강 시간입니다.
오늘 배운 내용은 branch와 merge, 즉, 협업에 관한 내용을 다뤄주셨습니다.
먼저, branch는 각자의 방이라고 생각하면 됩니다. 다들 거실인 main에 모이기 전에 각자의 브랜치에서 작업을 마무리하고, 이걸 합쳐야 합니다.
branch 사용 방법은 다음과 같습니다.
// 현재 브랜치 리스트 확인
git branch
// 브랜치 생성
git branch 브랜치명
// 브랜치 이동
git switch 브랜치명
또는
git checkout 브랜치명
위처럼 브랜치를 다룰 수 있습니다. switch와 checkout의 차이점은 단순히, 다른 부분도 다루느냐 아니냐입니다.
기존에는 checkout를 사용했지만, checkout은 다른 기능도 있기에, switch를 추가했다고 하셨습니다.
브랜치를 생성과 동시에 그 브랜치로 이동하는 방법도 있습니다.
// 생성과 동시에 이동
git switch -c 브랜치명
또는
git checkout -b 브랜치명
이후에, 브랜치들을 병합해줘야 합니다. 단, 바로 main에 하기보다는, 그 전에 브랜치를 하나더 만드는 걸 추천합니다.
왜냐하면, main은 배포를 위한 브랜치이기 때문에, 개발 중에는 이전 브랜치를 만드는 것이 더 좋기 때문입니다.
병합은 다음과 같이 가능합니다.
// 최종 브랜치로 이동
git switch 브랜치명
또는
git checkout 브랜치명
// 다른 합칠 브랜치들을 merge
git merge 브랜치명
또는, GUI를 사용해서 Pull Request로 합치는 방법도 있습니다.
이 경우는, GUI라 보기도 편하고, 코드 리뷰를 할 수도 있기 때문에 좋은 방법인 것 같습니다.
그리고, 전체적인 순서입니다. 대충 정리했기 때문에 한 번만 읽어도 괜찮을 거 같습니다.
초기 세팅
1.팀장: 초기 코드 작성 및 github 업로드
a. 폴더 생성 b. 초기 코드 작성 c. git init, add, commit d. 레포지토리 생성 e. 업로드
2.팀장: dev 브랜치 생성
a. git switch -c dev(로컬에서 dev 브랜치 생성) b. git push origin dev(github에도 반영)
3. github에서 dev 브랜치를 default로 설정(Settings에 있음)
4. 팀원들을 Collaborator로 등록
5. 팀원: github 코드 받아서 git clone 주소 . 하기
기능 개발 시작
1. 기능 브랜치 생성 및 기능 개발
git switch -c 브랜치명 이후 저장, push
2. pull request 생성(이때, dev 브랜치가 default이므로, base가 dev가 됨)
충돌 시 회색 버튼이 뜨면서 안 되는 경우가 생길 수 있음
3. 코드 작성자: 리뷰 요청하기(슬랙 연동도 가능하다고 함)
Files changed에 들어가서 + 버튼 눌러서 리뷰를 추가할 수 있음
리뷰가 끝나면 finish review 해야 함. Comment는 그냥 답변, Approve 승인할 때, Request changes는 변경 요청할 때
충돌 발생 시 충돌 발생한 부분을 직접 가져와서 로컬에서 해결
충돌 해결 이후
1. 해결되면 git pull origin dev로 다시 가져오면 됨.
2. 다음 기능 개발
오늘은 코드 공부보다, 협업이나 디자인 쪽 공부가 더 많았던 것 같습니다.
하지만, 사실 개인 프로젝트를 진행하면서, 드디어 고민이 많았던 부분을 해결했기에,
어느 정도 진전이 있긴 했었습니다.
내일부터 협업이 시작되는데, github를 제대로 다루기 전에 gitignore도 한번 알아봐야 할 것 같습니다.
끝.