추천) 1210. ladder1 문제를 먼저 풀기를 추천한다.

https://masso.tistory.com/23?category=881145

 

[D4] 1210.Ladder1

입력) 총 10개의 테스트 케이스 테스트 케이스의 번호, 사다리 정보가 들어있는 100 x 100 크기의 이차원 배열 (0: 아무것도 없음, 1 : 사다리, 2 : 도착 지점) 출력) # 해당 테스트 케이스 번호, 지정된

masso.tistory.com

 

입력)

총 10개의 테스트 케이스

테스트 케이스의 번호, 사다리 정보가 들어있는 100 x 100 크기의 이차원 배열

(0: 아무것도 없음, 1 : 사다리, 2 : 도착 지점)

 

출력)

# 해당 테스트 케이스 번호, 가장 짧은 이동 거리를 가지는 사다리의 y index 출력


입, 출력 분석)

입력을 보면 마지막 줄에 존재해야할 2가 없음에 주의해야 한다.

 

핵심)

1210. ladder1 문제 풀이 링크 참고

입력 분석을 통해
- x == 99에 도달할 때까지, 가장 짧은 칸을 이동해온 y index를 구해야 함을 알았다.

 

복수 개인 경우 가장 큰 x좌표
- y(0 -> 99)로 탐색하며, 짧거나 같은 거리를 가지는 사다리가 있을 때 y index를 갱신하면 된다.

 

예시 분석)

(생략)

 

실수) 

- 도착 지점에 도착하는 사다리 중에 짧은 거리를 가지는 사다리를 구하는 문제인 줄 알았는데,가만히 입력을 보니까 2가 없는 것을 알게 되었다. (이래서 사람이 편견이 무섭다)

 

구현)

#include<iostream>
using namespace std;

int map[100][100]; // 100x100 크기의 이차원 배열
int dx[3] = { 1, 0, 0 };  // 0: 아래, 1: 왼쪽, 2: 오른쪽
int dy[3] = { 0, -1, 1 }; // 0: 아래, 1: 왼쪽, 2: 오른쪽

int main(int argc, char** argv) {
	int test_case, T = 0, ans = 0;
	for (test_case = 1; test_case <= 10; ++test_case) {
		scanf("%d", &T);
		for (int i = 0; i < 100; i++) {
			for (int j = 0; j < 100; j++)
				scanf("%d", &map[i][j]);
		}
		int minLen = 10000; // 0. minLen 정의
		for (int j = 0; j < 100; j++) {
			if (!map[0][j]) continue;
			int x = 0, y = j, dir = 0, len = 1; // 1. len 정의
			while (x < 100) {
				int cnt = 0, key = 0;
				for (int i = 0; i < 3; i++) {
					int nx = x + dx[i];
					int ny = y + dy[i];
					if (nx < 0 || nx >= 100 || ny < 0 || ny >= 100) continue;
					if (map[nx][ny]) {
						cnt++;	key += i; // 아래 0, 왼 1, 오 2
					}
				}
				if (cnt == 2 && key < 3) { // 회전
					if (dir == 0) dir = key;
					else dir = 0;
				}
				if (x == 99) break;
				x += dx[dir]; y += dy[dir];	len++; // 2. 총 len 구하기
			}
			if(minLen >= len){ // 3. len 갱신하기
				minLen = len;
				ans = j;
			}
		}
		printf("#%d %d \n", T, ans);
	}
	return 0;
}

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

BOJ[20055]. 컨베이어 벨트 위의 로봇  (0) 2021.04.21
[D3] 1209. Sum  (0) 2020.08.22
[D4] 1210.Ladder1  (0) 2020.08.18
[D3] 1206. View  (0) 2020.08.08
[D3] 1208. Flatten  (0) 2020.07.25

입력)

총 10개의 테스트 케이스

테스트 케이스의 번호, 사다리 정보가 들어있는 100 x 100 크기의 이차원 배열

(0: 아무것도 없음, 1 : 사다리, 2 : 도착 지점)

 

출력)

# 해당 테스트 케이스 번호, 지정된 도착점에 대응되는 사다리의 y index 출력


입, 출력 분석)

(생략)

 

핵심)

사다리를 그릴 때, 방향을 고려하여 그리는 것이 핵심이다.

한 칸씩 사다리를 타고 내려간다고 가정하고, 1의 여부를
자신의 아래,왼쪽,오른쪽 영역을 탐구한다고
가정했을 때,

 

회전하는 경우는
1) 1의 cnt가 2이고

2) 1인 영역이 (아래 또는 왼쪽), (아래 또는 오른쪽)을 가진다
    따라서 1인 영역을 발견했을 때 key를 두어,
    (아래 또는 왼쪽) : key = 0 + 1 -> 왼쪽

    (아래 또는 오른쪽) : key = 0 + 2 -> 오른쪽

    key < 3 일 때 회전한다.
    (key == 3일 때는 핑크색, cnt 가 2인 경우)

 

현재 어느 방향으로 오고 있었는지(dir) 확인하여, 회전하는 경우에 알맞게 방향을 바꾸면 된다.

 

예시 분석)

(생략)

 

실수) 

- 모든 경우의 수를 저렇게 따져보기 전에 복잡하고 내가 다루지 않았던 유형이라 기피했던 것 같다..
  (질질 끌다가 결국에 할 꺼면서...)

- 설계 초반에 핑크색 경우에서 cnt == 2 일 때를 cnt == 1로 잘못 계산했다.

- while(x<100)에서 x=99일 때 x+=dx[dir]; y+dy[dir]; 때문에 if(map[x][y] == 2)가 제대로 되지 않아서
  if(x==99) break; 문을 넣었다. (사실 map[x-1][y] == 2 해볼까 고민도 했다..ㅎ)

 

구현)

#include<iostream>
using namespace std;

int map[100][100]; // 100x100 크기의 이차원 배열
int dx[3] = { 1, 0, 0 };  // 0: 아래, 1: 왼쪽, 2: 오른쪽
int dy[3] = { 0, -1, 1 }; // 0: 아래, 1: 왼쪽, 2: 오른쪽

int main(int argc, char** argv) {
	int test_case, T = 0, ans = 0;
	for (test_case = 1; test_case <= 10; ++test_case) {
		scanf("%d", &T);
		for (int i = 0; i < 100; i++) {
			for (int j = 0; j < 100; j++)
				scanf("%d", &map[i][j]);
		}
		for (int j = 0; j < 100; j++) {
			if (!map[0][j]) continue;
			int x = 0, y = j, dir = 0; ans = j;
			while (x < 100) {
				int cnt = 0, key = 0;
				for (int i = 0; i < 3; i++) {
					int nx = x + dx[i];
					int ny = y + dy[i];
					if (nx < 0 || nx >= 100 || ny < 0 || ny >= 100) continue;
					if (map[nx][ny]) {
						cnt++;	key += i; // 아래 0, 왼 1, 오 2
					}
				}
				if (cnt == 2 && key < 3) { // 회전
					if (dir == 0) dir = key;
					else dir = 0;
				}
				if (x == 99) break;
				x += dx[dir]; y += dy[dir];
			}
			if (map[x][y] == 2) {
				ans = j;	break;
			}
		}
		printf("#%d %d \n", T, ans);
	}
	return 0;
}

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

[D3] 1209. Sum  (0) 2020.08.22
[D4] 1211. ladder2  (0) 2020.08.20
[D3] 1206. View  (0) 2020.08.08
[D3] 1208. Flatten  (0) 2020.07.25
[D2] 1204. 최빈수 구하기  (0) 2020.07.22

3. 지역 저장소를 원격 저장소에 연결하기

   - 원격 저장소를 만들었으니, 1) 지역 저장소에서 한 작업을 원격 저장소에 올리거나
                                                   2) 원격 저장소에 있는 파일을 지역 저장소로 내려받기를 해보자.

   3-1. 지역 저장소 만들기

지역 저장소 loc-git(local git)를 만들고 f1.txt 생성, 스테이징, 커밋 (터미널 창 닫지 않기!)

   3-2. 원격 저장소에 연결하기

         - 깃허브 저장소 화면에서 접속할 수 있는 여러 방법 중에 'command 라인에서 기존 저장소를 푸시하기' 방법을 사용해

           지역 저장소에 있는 파일을 원격 저장소로 올려본다.

 

깃허브 저장소의 주소 복사하기
원격 저장소(remote)에 origin(=깃허브 저장소 주소)을 추가(add)하겠다고 깃에게 알려주는 명령 (주소가 너무 길어서 origin)
연결 확인하기! remote 옆에 origin이 연결되어 있고, origin이 가리키는 주소가 옆에 표시된다. (fetch, push는 나중에)

 

2. 깃허브 시작하기

  - 깃허브에 원격 저장소를 만들기 위해서는 먼저 깃허브에 가입해야 한다.

  - 저장소는 필요할 때마다 얼마든지 만들 수 있고, 사용하지 않는 저장소는 얼마든지 삭제할 수 있다.

 

  2-1. 깃허브 가입하기

        - 이전에 만들어 놓은 무료 계정이 있어 그것을 사용했다.

       

 

  2-2. 깃허브에 원격 저장소 만들기

        - 깃허브에서는 저장소를 repository로 표시한다. (여기서 만드는 저장소는 공개 저장소다)

 

[+]를 누르고 [New repository] 클릭

 

repository 이름 및 필요한 항목을 기입하고 [Create repository] 클릭

항목 설명
Repository name 영문과 숫자, 언더바(_), 붙임표(-) 등을 사용할 수 있으며, 공백이 포함되어 있을 경우 깃허브에서 공백을 자동으로 붙임표(-)로 바꾼다
Description 저장소에 대한 간단한 설명을 입력한다. (옵션이므로 반드시 입력하지 않아도 된다)
Public / Private 공개 저장소는 주소만 알고 있으면 누구나 볼 수 있고, 다른 사람에게는 보이지 않는 프로젝트를 관리하려면 비공개 저장소로 만들면 된다.
Initialize this repository with
a README
저장소에 대한 소개와 설명을 작성하는 README 파일을 자동으로 만들려면 체크한다.
(이후 제 6장에서 공부한다.)
Add .gitignore 어떤 언어와 관련된 것들을 .gitignore 파일에 지정할지 선택한다. 
만일 'c++'을 선택한다면 C++에서 사용하는 컴파일된 라이브러리나 실행 파일을 깃에서 무시하도록 자동으로 .gitignore 파일을 만들어준다.
Add a License 오픈 소스 프로젝트를 위한 저장소를 만들 경우 해당 오픈 소스의 license를 선택한다.
오른쪽에 [i]를 누르면 license에 대한 자세한 설명을 참고할 수 있다.

 

 

화면에 나타난 HTTPS 주소로 언제든지 깃허브 저장소에 접속 및 파일 업로드가 가능하다.

즉, 저장소 주소지역 저장소 백업 및 다른 사람과의 협업도 가능하다.

[HTTP로 접속하는 주소의의 형태] http://github.com/아이디/저장소명.git

제 4장 깃허브로 백업하기

    - 지금까지 살펴본 버전들은 모두 사용자의 지역 저장소에 저장했다.

      이제부터 사용자 컴퓨터에 있는 버전을 인터넷 상에서 저장할 수 있는 서비스 중에 가장 많이 사용하는 깃허브 서비스에
      대해 살펴본다.

    - 지역 저장소의 버전을 백업할 수 있고, 온라인에 올린 버전들을 공유하여 다른 사람들과 협업할 수 있다는 장점을 가진다.

    - 깃허브에 저장소를 만드는 방법부터 지역 저장소와 연결하는 방법, 그리고 지역 저장소의 버전을 깃허브에 올리는 방법
      까지 살펴본다. (= 깃 허브에 직접 원격 저장소를 만들고, 지역 저장소의 파일을 원격 저장소로 백업하는 방법까지)

 

        1. 원격 저장소와 깃허브

        2. 깃허브 시작하기

        3. 지역 저장소를 원격 저장소에 연결하기

        4. 원격 저장소에 올리기 및 내려받기

        5. 깃허브에 SSH 원격 접속하기

 

1. 원격 저장소와 깃허브

   - 지금까지 자신의 컴퓨터에서 작업한 뒤 그 컴퓨터 안에 커밋을 저장했는데 이러한 저장소를

     지역 저장소(local repository) 라고 부른다.
   - 실수로 지역 저장소를 삭제한다면 작업했던 내용이 사라지기 때문에,
     작업 내용을 지역 저장소 뿐만 아니라 작업 컴퓨터가 아닌 다른 곳에 저장 공간을 마련해야한다.

 

   1-1. 원격 저장소란
      - 원격 저장소
         : 지역 저장소가 아닌 컴퓨터나 서버에 만든 저장소

      - 깃에서는 지역 저장소(local repository)와 원격 저장소(remote repository)를 연결해서
        버전 관리하는 파일들을 쉽게 백업할 수 있다.

      - 원격 저장소는 지역 저장소와 연결되어 있으면서 "백업"과 "협업"이라는 중요한 역할을 한다.

      - 특히 큰 규모의 프로젝트로 인해 다른 사람과 협업할 때, 원격 저장소의 역할이 중요해진다.

 

      - 원격 저장소를 직접 구축할 수도 있지만, 만들고 유지하는 것이 쉽지 않기 때문에, 인터넷에서
        원격 저장소를 제공하는 서비스를 이용한다. 그 중 깃과 관련해 가장 많이 사용하는 서비스가 깃허브이다.

 

   1-2. 깃허브로 할 수 있는 일들
      - 깃허브에서는 사용자를 위해 저장소를 제공하는데 유료와 무로 서비스가 있다.

        대부분의 경우, 무료 서비스만으로도 용량 제한 없이 사용할 수 있다.

      - 여러 서비스 중 깃허브가 유명한 이유는 여러 개발자들의 오픈 소스가 올라와 있기 때문이다.

        단순히 하나의 서비스에 국한된 것이 아니라 개발 문화 전체에서 차지하는 영향력이 아주 큰 서비스이다.

 

      1) 원격 저장소에서 깃을 사용할 수 있다.

          - 깃허브는 깃 사용을 위한 원격 저장소를 제공하는 서비스이므로 깃을 따로 설치하지 않아도 사용가능하다.

          - 지역 저장소 X, 깃허브에 원격 저장소를 만들어 사용가능하다.

          - 지역 저장소 O, 원격 저장소와 연결해서 사용가능하다.

      2) 지역 저장소를 백업할 수 있다.

          - 깃허브에 원격 저장소를 만들고 사용자 컴퓨터의 지역 저장소를 연결한 후 동기화하면, 지역 저장소를 
            백업할 수 있다.

          - 깃허브가 아닌 구글 드라이브나 클라우드 디스크에 백업이 가능하지만, 깃허브가 가장 쉽다.

      3) 협업 프로젝트에 사용할 수 있다.

          - 인터넷만 가능하면 누구나 접근할 수 있고, 깃과 깃허브에서 여러 협업 도구를 제공하기 때문에

            깃허브를 사용하면 여러 명의 팀원이 하나의 프로젝트를 진행하기 쉽다.

      4) 자신의 개발 이력을 남길 수 있다.

         - 깃허브에서 소스를 수정하고 오픈 소스에 참여하는 일들은 사용자 초기 화면에 날짜별로 모두 
           기록이 남는다. 따라서 개발자의 개발 이력을 관리하기 좋은 플랫폼이다.
         - 어떤 주제에 관심이 있는지, 어떤 것들을 개발했는지, 그리고 무엇을 개발하고 있는지 한눈에
           확인할 수 있다.

      5) 다른 사람의 소스를 살펴볼 수 있고, 오픈 소스에 참여할 수도 있다.

         - 전 세계 개발자들이 공개해놓은 소스 코드를 분석하고, 나름대로 수정 및 작성을 해보면서
           실력을 높일 수 있다.

         - 웹 개발이나 인공지능, 데이터 과학 등등 개발의 전 분야에 걸쳐 다양한 오픈 소스들이
           등록되어 있다.

깃허브에 등록된 여러 저장소들을 한눈에 살펴볼 수 있다
카테고리마다 인기 있는 저장소들이 분류되어 있으므로 관심 분야의 소스를 찾아 공부할 수 있다.
한국어 처리를 위한 소스가 필요하다면 깃허브에서 저렇게 찾으면 된다.

5. 브랜치 관리하기

    - git과 branch를 더 편하게 관리하기 위한 몇 가지 명령을 살펴본다
    - 지금 이해하기 어렵다면 이런 기능이 있다는 것만 살펴보고, 다 공부한 다음 살펴보도록 하자.

   

    5-1. 브랜치에서 checkout과 reset의 작동 원리

           - "깃으로 버전 관리하기"에서 checkout과 reset 명령을 공부했는데, branch와 함께 사용하면
              더 다양하게 사용할 수 있기 때문에 먼저 HEAD와 branch 개념부터 간단히 알아보자.

홈 디렉터리에서 "test" 깃 저장소 생성 및 "test" 디렉터리로 이동
c1.txt를 생성하고 1을 입력, 스테이징 및 "c1" 커밋
HEAD는 master Branch를 가리키고, master Branch는 c1 커밋을 가리킨다.
sub Branch 생성 및 master Branch에서 c2.txt 파일 생성, 스테이징, "c2" 커밋
sub Branch로 이동 및 s1.txt 생성, 스테이징, "s1" 커밋

이전에 reset 명령을 통해 master Branch에 있던 여러 커밋 중 하나를 골라서 돌아갔다.

Branch가 여러 개일 때 reset 명령은 어떻게 사용할 수 있을까?

이럴 때는 현재 Branch가 아닌 다른 Branch에 있는 커밋을 골라서 최신 커밋으로 지정할 수 있다.

 

sub Branch에 있는 상태에서 master Branch에 있는 c2 커밋을 sub Branch의 최신 커밋으로 지정
sub Branch -> c2 이므로 원래 있던 s1 커밋은 연결이 끊기면서 삭제

              따라서, git reset 명령을 사용하면 현재 Branch가 가지는 커밋을 여러 Branch 사이를 넘나들면서 제어할 수 있다.

              [정리]

              git checkout : HEAD를 제어하여 Branch를 이동할 수 있다.
              git reset : HEAD가 가리키고 있는 브랜치의 최신 커밋을 원하는 커밋으로 지정할 수 있다.
                                이때, 어떤 커밋이든 지정할 수 있고, 명령을 수행한 뒤 Branch와 연결이 끊긴 커밋은 삭제된다.

 

    5-2. 수정 중인 파일 감추기 및 되돌리기 - git stash

           - 브랜치에서 파일을 수정하고 커밋하지 않은 상태에서 급하게 다른 파일을 커밋해야할 경우,
             커밋하지 않은 파일들을 그냥 두어도 상관은 없지만, 계속 커밋하라는 메시지가 나타난다.
              또한, 실수로 다른 파일들과 함께 커밋이 될 수도 있다.

           - 이럴 때! 아직 커밋하지 않고 작업 중인 파일들을 잠시 감춰둘 수 있다.
             따라서 당장 필요한 작업들을 끝낸 후에 다시 감춰둔 파일들을 꺼내오면 된다.

git stash 명령을 사용하려면 tracked(한 번은 커밋한 상태)여야 하므로 f1.txt 생성 및 스테이징, "f1" 커밋
f2.txt 파일 생성 및 스테이징, "f2" 커밋
f1.txt와 f2.txt 다시 한 번 수정하기

 

이제 f1.txt와 f2.txt를 커밋하기 이전에 다른 파일을 수정해야한다고 가정해보자

커밋하지 않은 수정 내용을 어딘가에 보관하려면 git stash 명령을 사용한다.

git stash save 또는 git stash라고 해도 된다.

조금 전에 나타났던 modified 메시지가 사라졌다!

 

같은 방법으로 여러 파일을 수정한 후 따로 보관할 수 있는데,

이렇게 감춘 파일들은 git stash 목록에서 확인할 수 있다. - git stash list

가장 먼저 담긴 파일이 stash{0}에 담기는데, 새로 추가된 파일로 갱신되어 담긴다!

즉. 가장 최근에 감춘 것이 stash{0}에 담긴다. (stash stack으로 표현)

 

급한 작업을 모두 마쳤다면 감춰둔 파일을 꺼내와 계속 수정하거나 커밋할 수 있다.

git stash pop: stash list에서 가장 최근 항목을 되돌린다.

f1.txt와 f2.txt가 수정된 상태로 되돌아간다.
확인하기 1
확인하기 2

         +) 추가 명령

             git stash apply : stash list에 저장된 수정 내용을 나중에 또 사용할지도 모를 때 사용한다.

                                           stash list에서 가장 최근 항목을 되돌리지만, 저장했던 내용은 남겨둔다.

 

              git stash drop: stash list에서 가장 최근 항목을 삭제한다.

             

+ Recent posts