import java.util.*;
public class Solution {
public int solution(int n) {
int ans = 0;
while(n != 0) {
if(n % 2 == 0) {
n /= 2;
} else {
n -= 1;
ans++;
}
}
return ans;
}
}
이동하는 방법1,2 : [1] 한 번에 K칸을 앞으로 점프하는 방법 / [2] (현재까지 온 거리) X 2에 해당하는 위치로 순간이동하는 방법
점프
는 건전지 사용량이 들고, 순간이동
은 건전지 사용량이 줄지 않는다.건전지 사용량의 최솟값을 만들기 위해서는 최대한 아이언 슈트를 착용하고 순간이동
을 하는 방법을 활용하고, 필요할 때에만 점프
방법을 사용한다.
[결론]
N이 0이 될 때까지
N이 짝수라면 반을 나누고 N / 2 (순간이동)
N이 홀수라면 -1을 빼며 점프하여 최솟값을 구한다.
N이 6일 때 6까지 최대한 순간이동
방법을 써서 건전지의 사용량의 최솟값을 구하면 되는 문제였다.
아이디어는 6부터 시작해서 0까지 가는 Top-Down 방식으로 사용하면 간단하게 풀 수 있는 문제였는데,
아이디어가 바로 떠오르지 않아서 고민한 시간이 꽤 길었다. (20~30분)
머리로 떠오르지 않으면 그림을 그려보자!
우아한테크코스의 캡틴으로 불리는 박재성
님이 0순위로 추천한 책이다.
책을 읽고 난 소감은 개발과 관련해서 더 나은 개발자가 되기 위한 마인드
위주의 책이었다.
이 책은 개인적인 일화와 현장 경험에서 비롯된 무게감 있는 조건이 가득했다.
자신의 일에 자부심을 갖는 프로페셔널로 도약하기 위해 필요한 계획, 전략, 태도, 원칙 등을 여러 가지 관점에서 조언했다.
책을 읽으면서 내가 생각한 중요한 부분이나 기억해야 할 부분들을 정리해봤다.
개발자라면 다음과 같은 여러가지를 할 수 있어야 한다.
고객과 대화하기
테스트/배포 자동화하기
전체 비즈니스에 영향을 미칠 기술 선정하기
지리적으로 분산된 팀들과 협업하기
고객을 도와 필요한 작업을 정의하기
우선순위 선정하기
진척 상황 보고하기
변경사항과 기대일정 관리하기
잠재 고객 및 파트너에게 제품 소개하기
사전 영업 활동 지원하기
개발 일정과 비용 산출하기
채용 면접하기
아키텍쳐 설계하기
비기능적 요구사항과 계약조건(SLAS) 검토하기
사업 목표 이해하기
주어진 여건에서 최적의 결정하기
새로운 기술 주시하기
더 나은 업무 방식 찾기
고객에게 가치 있는 상품이 전달되고 있는지 고민하기
어떤 사람들은 훌륭한 개발자
라면 위의 일들을 이미 해왔을 거라고 한다.
애자일
은 서로 다른 여러 맥락에서 따른 방법론과 테크닉의 조합이다.
애자일 원칙의 절차적인 부분
들은 팀과 조직이 어떻게 구성되고 협업해야 하는지에 대한 것들을 규정한다.
회의 방식, 구성원 각각의 역할, 요구사항 파악 방법, 작업 진척 속도 파악 방법, 점진적/반복적으로 일할 때 취하는 방식 등과 같은 것들이다.
팀에 정말로 중요한 것, 비즈니스 가치가 있는 것에 집중한다.
애자일 원칙의 기술적인 부분
들은 개발, 확장, 유지보수, 제품을 출하면서 어려움들에 대해 특정한 기술적 관례나 기술 자체를 매우 구체적으로 가이드한다.
CS 스터디를 진행하면서 저장소를 관리하기 위해 커밋 메시지 Rule을 정했지만, Branch에 대한 Rule을 정하진 않았다.
Git의 Branch는 협업을 위한 기본 토대이기 때문에 최소한의 Rule이 있어야 협업 시의 혼란을 방지할 수 있다.
GitHub에서 GitHub에 올라간 Branch들에 대해 Rule을 지정할 수 있게 도와준다.
이 Rule을 적용하면 특정 Branch를 실수로 지우거나 Branch에 강제로 푸시할 수 있는 지에 대한 여부를 정의할 수 있다.
그리고 Merge하기 전에, 상태를 확인하거나 선형 커밋 기록과 같은 것들을 Branch에 푸시하는 것에 대한 요구 사항을 설정할 수 있다.
Branch Protection Rule이 적용되도록 Branch 이름을 적어둔다.
기본적으로 main(또는 master)를 적어둔다.
8가지 Rule 중에 가장 많이 쓰이는 Rule 이다.
모든 Commit들은 별도의 Branch를 만들어서 Merge 하기 전에 PR(pull request)을 보내야 하는 Rule이다.
즉, 로컬에서 Direct Push가 안되고, Push를 하려면 별도의 Branch를 만들어야 한다.
협업 시 Branch를 로컬로부터 Direct Push를 막아주고 코드리뷰를 통해 Merge 할 수 있다.
개인이 PR를 보내고 Merge를 하기 전에 승인해주는 인원을 정하는 의미다.
예) Required number of approbals before merging : 1
은 1명만 승인해주면 된다는 의미다.
그 밖에 다양한 설정들이 있다.
8가지 Rule 중에 두번째로 많이 쓰이는 Rule이다.
테스트에 통과하게 되면 Merge를 할 수 있다는 Rule이다.
코딩테스트 연습 > Summer/Winter Coding(~2018)
구현(시뮬레이션)
import java.util.*;
class Solution {
public int[] solution(int n, String[] words) {
int[] answer = {0,0};
// 사용 단어 저장
HashSet<String> set=new HashSet<>();
// 첫 번째 단어의 마지막 문자 저장
char prev=words[0].charAt(words[0].length()-1);
// 첫 번째 단어 저장
set.add(words[0]);
// 2번째 단어부터 탐색
for(int i = 1 ; i < words.length; i++){
// 앞 단어의 마지막 문자로 시작하지 않거나 이미 말한 단어라면 종료
if(prev != words[i].charAt(0) || set.contains(words[i])){
// 탈락자 번호
answer[0]= i % n + 1;
// 몇 번째 차례에서 탈락했는지에 대한 갯수
answer[1]= i / n + 1;
break;
}
// 아니라면, 다음 체크를 위해 prev, set 설정
prev = words[i].charAt(words[i].length()-1);
set.add(words[i]);
}
return answer;
}
}
단어의 중복 체크는 HashSet을 이용한다.
set
에 넣어 저장한다.앞 단어와 끝말잇기 조건에 맞는지 확인한다.
char prev를 두어 앞 단어의 마지막 문자를 저장한다.
일단 0번째 시작 단어는 앞문자가 없으므로 바로 prev와 set에 넣는다.
1번째부터 앞 문자와 체크한다. 앞 단어의 끝 문자 prev와 나(i)의 시작 단어가 다르거나 set에 있는 단어라면 answer에 값 넣고 종료한다.
이 글의 사진과 내용은 공룡책 과 컴퓨터학부 수업인 운영체제 강의자료를 기반으로 작성했습니다.
[1] 모든 Page가 Physical memory에 매핑된다.
[2] Physical memory의 크기는 제한적이다.
Key idea
: 현재 사용하지 않는 page들을 Disk에 저장하는 것이다.
Swap Space
이란 Physical memory에서 매핑되지 않는 page들을 위한 Disk 공간이다.
Swap Space에서는 두 가지 작업이 제공된다.
Swap out
이란 pages을 Physical memory에서 Swap space로 이동하는 것이다.
Swqp in
이란 pages을 Swap space에서 Physical memory로 이동하는 것이다.