입력)

총 10개의 테스트케이스

1000개 이하의 빌딩의 높이가 주어진다.
이 빌딩의 높이는 최대 255이다.
맨 왼쪽 두 칸과 오른쪽 두 칸은 0이다. (건물이 지어지지 않기 때문)

 

출력)

#(테스트 케이스 번호) (해당 테케에서 조망권이 확보된 세대의 수)


입, 출력 분석)

(생략) int로 다루면 된다.

 

핵심)

해당 빌딩에서 조망권이 확보된 개수 = 해당 빌딩 높이 - 좌우 두 칸 사이에 제일 높은 빌딩의 높이

 

예시 분석)

index 2와 6을 통해 내 코드가 잘 구현이 되었는지 디버깅을 돌려보았다.

index 0 1 2 3 4 5 6 7 8
height 0 0 225 214 82 73 241 233 179
viewCnt     11       8    

 

실수) 

- 좌우 두 칸 빌딩의 높이가 낮을 때만 조망권 개수를 계산하면 되는데,
  차이 구하는데 정신 팔려서  abs() 함수로 처리하고 있었다.

- 테스트 케이스 for문 안에서 갱신되어야 하는 변수를 밖에서 갱신해서,
   #1 691 #2 9092+691=>9783이 나왔다..
  (숫자보고 딱 어? 뭔가 밀렸다! 감잡아서 다행이지.. 시험장이었으면 멘탈 털렸을 것 같다..)


구현)

#include<stdio.h>
using namespace std;

int main(int argc, char** argv){
	int test_case = 1, cnt = 0;
	for (; test_case <= 10; ++test_case) {
		int heights[1000] = {0, }, total = 0;
		scanf("%d", &cnt);
		for (int i = 0; i < cnt; i++)
			scanf("%d", &heights[i]);
		for (int i = 2; i <= cnt-3; i++){
			int viewCnt = heights[i], temp = 0;

			for (int d = 1; d <= 2; d++){
				if(heights[i] <= heights[i+d] || heights[i] <= heights[i-d]){
					viewCnt = 0;	break;
				}				
				temp = heights[i] - heights[i + d];
				if(temp < viewCnt) viewCnt = temp;
				temp = heights[i] - heights[i - d];
				if (temp < viewCnt) viewCnt = temp;
			}
			total += viewCnt;
		}
		printf("#%d %d\n", test_case, total);
	}
	return 0;
}

'Algorithm&Problem > [Problems] SWEA' 카테고리의 다른 글

[D4] 1211. ladder2  (0) 2020.08.20
[D4] 1210.Ladder1  (0) 2020.08.18
[D3] 1208. Flatten  (0) 2020.07.25
[D2] 1204. 최빈수 구하기  (0) 2020.07.22
[D2] 1859. 백만 장자 프로젝트  (0) 2020.07.21

4. 브랜치(Branch) 병합하기

    "브랜치 병합(merge)"
     - 만들어진 각 브랜치에서 작업을 하다가 어느 시점에서 브랜치 작업을 마무리하고,
       기존 브랜치와 합하는 것

     

     1) 여러 상황에 따라 병합하는 방법
     2) 병합하면서 브래치 사이에 충돌이 있을 때 해결하는 방법에 대해 알아본다.

 

   4-1. 서로 다른 파일 병합하기

git init (directory name) : 새로운 directory를 생성 및 저장소를 초기화
git commit -am은 한 번이라도 커밋한 적이 있는 파일을 다시 커밋할 때 사용 가능!
"o2" branch 생성 및 master.txt 생성 후 커밋하기
                        branch o2 생성 후                                 "master work 2" 커밋 후 master는 이 커밋을 가리킴
o2 branch로 체크아웃 후 o2.txt 생성 및 "o2 work 2" 커밋하기
HEAD가 o2 브랜치를 가리키고, o2는 o2 work 2를 가리킴

                            o2 branch에서 작업이 다 끝났다면, o2 branch의 내용을 master branch로 병합해보자

 

병합하고자 하는 기준 branch로 checkout 후 git merge (병합할 Branch 이름)
HEAD -> master branch -> Merge branch o2 commit
o2 branch에 있던 o2.txt 파일이 master branch에 존재
" o2 work 2 " commit이 master branch에 병합되어 " Merge branch 'o2' " 생성


   4-2. 같은 문서의 다른 위치를 수정했을 때 병합하기

        - 양쪽 브랜치에서 work.txt 문서를 수정하되 서로 다른 위치를 수정한 후 브랜치를 병합

홈 디렉터리로 이동한 후 manual-3 깃 저장소를 생성 및 manual-3 directory로 이동
work.txt 생성 및 스테이징, 커밋
o2 branch 생성, 따라서 master와 o2 branch에는 모두 work 1 커밋이 존재
master branch에서 work.txt 수정 후 커밋하기
o2 branch의 work.txt 파일 수정 및 커밋하기
master branch로 체크아웃 후 o2 branch를 master branch로 끌어온다 "auto~" : 병합 완료 메시지
o2 branch의 수정 내용이 master branch의 수정 내용과 합쳐져 하나의 파일을 생성


   4-3. 같은 문서의 같은 위치를 수정했을 때 병합하기
          - 깃에서는 줄 단위로 변경 여부를 확인하기에
            각 브랜치에 같은 파일의 이름을 가지고 있으면서, 같은 줄을 수정했을 때 병합하면 

            브랜치 충돌(branch conflict)이 발생한다.

 

manual-4 깃 저장소 생성 및 work.txt 파일 생성하기
work.txt 스테이징 및 "work 1" 커밋
o2 branch 생성 및 master branch에서 work.txt 수정, 스테이징, "master work 2" 커밋
o2 branch에서 work.txt 수정, 스테이징, "o2 work 2" 커밋
자동 병합하는 동안 충돌이 발생

<<... HEAD ~ ==... 까지(red box)는 master branch에서 수정한 내용

==... ~ >>... o2 까지(blue box)는 o2 branch에서 수정한 내용으로
양쪽 branch의 내용을 참고하여 직접 내용을 수정해야한다.

 

충돌되는 부분을 원하는대로 수정
수정한 work.txt를 스테이지에 올리고, "merge o2 branch" 커밋하기

        프로젝트 규모가 클수록 브랜치가 많기에 병합해야할 파일도 많아진다.
        그래서 깃의 브래치 병합을 자동으로 처리해주고, 충동을 해결해주는 프로그램이 많다.
        병합 알고리즘에는 2 way merge가 있고 3 way merge가 있는데,
        3 way가 훨씬 효율적이므로 이를 지원해주는 프로그램을 선택하는 것이 좋다

 

프로그램 이름 설명
 P4Merge 무료, 직관적이며 사용이 편리하고 병합 기능이 뛰어남 (단축키 기능이 없음)
Meld 무료, 오픈 소스, 파일 비교뿐만 아니라 편집도 가능함
Kdiff 무료, 사용이 편리하고, 병합 기능이 뛰어남 (한글이 깨져보일 수 있음)
Araxis Merge 유료, 그렇지만 용량이 큰 파일에서 잘 동작함


   4-4. 병합이 끝난 브랜치 삭제하기

          -  브랜치를 병합한 후 더 이상 사용하지 않는 브랜치는 깃에서 삭제할 수 있다.
             그렇지만 완전히 지워지는 것이 아니라서, 다시 같은 이름의 브랜치를 만들면 예전 내용을 볼 수 있다.

          - 즉, branch를 삭제한다는 것은 완전히 저장소에서 없애는 것이 아니라 깃의 흐름 속에서 감추는 것이다.

 

git branch: 현재 저장소에 어떤 branch가 있는지 확인할 수 있는 명령, 삭제를 위해 master branch로 이동

git branch -d (삭제하고자 하는 master에 병합된 브랜치 이름)                                     

git branch -D (삭제하고자 하지만 master에 병합되지 않은 브랜치 이름) // 강제 삭제

 

삭제한 o2 branch와 같은 브랜치를 생성해서 보면 예전에 작업했던 내용이 다시 나타남

3. 브랜치 정보 확인하기

   - 여러 브랜치에서 각각 커밋이 이루어질 때 정보를 확인한다.
       1) 커밋끼리 어떤 관계를 하고 있는지 ,  2) 브랜치 사이의 어떤 차이가 있는지 

 

   3-1. 새 브랜치에서 커밋하기

work.txt에 apple content 4 입력 후 저// apple.txt : apple 고객사만을 위한 내용이 담긴 파일
apple.txt에 apple content 4 입력 후 저장

// apple.txt : apple 고객사만을 위한 내용

스테이징 및 커밋하기

"git add . " : 현재 저장소에서 수정된 파일을 한꺼번에 스테이지에 올린다.

 

apple 브랜치의 최신 커밋은 1688838이고, 최신 커밋 메시지는 apple content 4이다.

"git log --oneline --branches" : 어떤 브랜치에서 어떤 커밋을 만들었는지 볼 수 있다.

 

apple: " | " 를 따라가다 보면 work 3가 나오고,

master : " / "를 따라가다 보면 work 3가 나오는 것을 볼 수 있다.
즉, master Branch나 apple Branch나 최신 커밋 450cc0c까지는 같고,
그 이후부터는 브랜치마다 다른 커밋을 만들었다는 사실을 알 수 있다.


   3-2. 브랜치 사이의 차이점 알아보기

            - [branch1]..[branch2] : 브랜치 이름 사이에 마침표 두 개(..)를 넣으면
               마침표 왼쪽에 있는 브랜치(branch1)를 기준으로 오른쪽 브랜치 (branch2)와 비교한다.

git log master..apple: master 브랜치에는 없고, apple 브랜치에만 있는 커밋을 보여준다.

git log apple..master: apple 브랜치에는 없고, master 브랜치에만 있는 커밋을 보여준다.

입력)

1이상 100이하인 100개의 height이 주어진다.

덤프 횟수는 1이상 1000이하로 주어진다.

총 10개의 테스트 케이스가 주어지며,

[ 덤프 횟수 + 100개의 높이 ] 형식으로 들어온다.


출력)

#부호 최고점 - 처저점의 높이 차


입, 출력 분석)

width가 100이므로 배열의 크기도 100이다.


예시 분석)

(생략)

 

핵심)

최고점과 최저점을 빠르게 찾기 위해

height가 저장된 배열과 max값, min값의 index의 개념을 잘 알면 된다.

 

실수) 

printf인데 scanf 로 적어서 출력이 안 되는 황당한 실수를 했다.


구현)

#include<stdio.h>
using namespace std;

int main(int argc, char** argv) {
	int test_case;

	for (test_case = 1; test_case <= 10; ++test_case) {
		int heights[100] = {0,};
		int dump_cnt = 0, diff = 0;
		int maxIdx = 0, minIdx = 0; 
		scanf("%d", &dump_cnt);
		for (int w = 0; w < 100; w++){
			scanf("%d", &heights[w]);
			if(heights[maxIdx] < heights[w]) maxIdx = w;
			if(heights[minIdx] > heights[w]) minIdx = w;
		}
		
		for (int i = 0; i < dump_cnt; i++){
			--heights[maxIdx];
			++heights[minIdx];
			for (int w = 0; w < 100; w++) {
				if (heights[maxIdx] < heights[w]) maxIdx = w;
				if (heights[minIdx] > heights[w]) minIdx = w;
			}
		}
		diff = heights[maxIdx] - heights[minIdx];
		printf("#%d %d\n", test_case, diff);
	}
	return 0;//정상종료시 반드시 0을 리턴해야합니다.
}

'Algorithm&Problem > [Problems] SWEA' 카테고리의 다른 글

[D4] 1210.Ladder1  (0) 2020.08.18
[D3] 1206. View  (0) 2020.08.08
[D2] 1204. 최빈수 구하기  (0) 2020.07.22
[D2] 1859. 백만 장자 프로젝트  (0) 2020.07.21
[D1] 2072. 홀수만 더하기  (0) 2020.07.21

# 어떤 제품의 사용 설명서를 만든다고 상상해보자.

// 제품 출시 후 고객사마다 추가로 요구하는 사항이 달라서,

//  제품이 달라질 것이고, 사용 설명서도 기존 사용 설명서와 달라질 것이다.

// 이를 예시로 브랜치를 설명한다.

2. 브랜치(Branch)만들기

   2-1. 실습 상황 설정하기

          - 디렉토리를 만들고, 그 안에 사용 설명서라고 생각하고 텍스트 파일 만들기

홈에 manual 디렉토리 생성하기
manual 디렉토리를 저장소로 만들고, .git 디렉터리 확인하기
work.txt 파일 생성 후 스테이지에 올리고 커밋하기

 

커밋 내역 확인하기
work.txt 수정하고, work 2 메시지로 커밋 하기
work.txt 수정하고, work 3 메시지로 커밋하기 

현재 master branch가 가장 최신 커밋인 'work 3'를 가리키고 있고,

HEAD가 master branch를 가리키고 있다.
(HEAD는 여러 브랜티 중 현재 작업 중인 브랜치를 가리킴)

 

# 지금까지는 기존 사용 설명서를 만드는 작업이었다.

# 앞으로 고객사마다 달라지는 사용 설명서를 브랜치를 이용하여 처리한다.

// apple, google, ms 라는 고객사가 있다고 가정한다.

 

   2-2. 새 브랜치 만들기
       -  git branch : 깃에서 브랜치를 만들거나 확인하는 명령
          1)  git branch : 깃에서 현재 저장소의 브랜치를 확인한다.

          2)  git branch (만들려는 브랜치 이름): 깃에서 해당 브랜치를 만든다.

(HEAD -> master, apple) : 저장소에 master, apple 브랜치가 있고, 현재 작업 중인 브랜치는 master이다.


   2-3. 브랜치 사이 이동하기 - git checkout

master 브랜치 뿐만 아니라 ms, google, apple 브랜치에서도 최신 커밋이 work 3이다.
--oneline : 한 줄에 한 커밋씩 나타낸다. 간략히 확인할 때 사용한다.

master work 4는 master 브랜치에만 적용되어있다.

ms, google, apple 브랜치는 아직 work 3 커밋 상태이다.

브랜치로 이동한다 = 브랜치로 체크 아웃한다.

$ 위에 나타난 파일 경로 끝에 (apple)이라고 표시가 바뀐다.

master에서 apple 브랜치로 바꾸었을 때 변화

apple 브랜치를 분기하기 전까지 master에 있던 커밋들은 그대로 복사되어 있다.

(HEAD -> apple)최신 커밋 해시에서 apple을 가리킨다.

최신 커밋이 work 3이므로 work.txt 내용에 master content 4가 없다.

따라서, master 브랜치에 추가된 커밋은 apple 브랜치에 영향을 주지 않았다.

 

1. 브랜치(Branch)란?

   1-1. 정의
      - 원래는 나뭇 가지라는 의미를 가지며 나무가 가지에서 새 줄기를 뻗듯이

      - 버전 관리 시스템에서는 여러 갈래로 퍼지는 데이터 흐름을 가리키는 말로 사용한다.

 

   1-2. 브랜치(Branch)가 필요한 이유
      - 어떤 프로그램을 개발한 후, 유지 보수가 필연적으로 이루어지는데, 이럴 때
         1) 코드의 중복을 줄여주고,

         2) 파일의 이름을 그대로 유지할 수 있으며,

         3) 코드를 재사용할 때 동기화를 용이하게 할 수 있다.

 

   1-3. 브랜치(Branch)의 기능

      -  기본적으로 깃으로 버전 관리를 시작하면 master라는 브랜치가 만들어진다.

         사용자가 커밋할 때마다 master 브랜치는 최신 커밋을 가리키게 되는데,
         즉, 브랜치는 커밋을 가리키는 포인터와 비슷하다고 생각하면 된다.

      -  따라서, 새 브랜치를 만들면 기존에 저장한 파일을 master 브랜치에 그대로 유지를
         하면서 기존 파일 내용을 수정하거나 새로운 기능을 구현할 파일을 만들 수 있다.

      1) 브랜치의 분기 및 과정

          - '분기한다(branch)' : master 브랜치에서 뻗어 나오는 새 브랜치를 만드는 것

브랜치 분기 과정

      2) 브랜치의 병합 및 과정

          - '병합한다(merge)' : 분기했던 브랜치를 master 브랜치에 합치는 것

 

+ Recent posts