입력)

학생의 수 1000명

각 학생의 점수는 0점 이상 100점 이하의 값


출력)

최빈수를 출력

최빈수가 여러 개 일 때에는 가장 큰 점수를 출력


입, 출력 분석)

(생략)


예시 분석)
(생략)


핵심)

히스토그램을 한 번이라도 구현해본 적이 있다면 엄청 쉬운 문제다.

0부터 100까지의 점수를 index로 가지는 배열을 만들어 빈도수를 다루는 것이 핵심이다.

1000명의 점수를 읽으면서 배열[점수]에 해당하는 count를 올려주면,

해당 배열을 앞에서부터 count 같거나 크다면 갱신해주면 된다.

 

실수)
- 처음엔 빈도수가 같을 때 큰 수를 출력한다는 조건을 까맣게 잊고 있다가

   if(cnt < student[n]) => if(cnt <= student[n]) 로 수정하였다.

- 마지막으로 들어오는 입력이 테스트 케이스 번호 + 1000개의 숫자들이라서,

   scanf("%d", &test_case);를 삽입하였다.

 

구현)

#include<iostream>
using namespace std;
int N = 1000;

int main(int argc, char** argv)
{
	int test_case;
	int T;
	cin >> T;
	for (test_case = 1; test_case <= T; ++test_case) {
		scanf("%d", &test_case);
		int MODE = 0;
		int student[101] = {0,};
		int score = 0;
		for (int n = 0; n < N; n++) {
			scanf("%d", &score);
			++student[score];
		}
		int cnt = student[0];
		for (int n = 1; n < 101; n++) {
			if(cnt < student[n]) {
				MODE = n;	
				cnt = student[n];
			}
		}
		printf("#%d %d\n", test_case, MODE);
	}
	return 0;
}

배열과 index로 설계를 했지만 코딩을 하다보면 나도 모르게 헷갈리는 경우가 있는 것 같다.

그리고 개발자는 여러 경험들을 통해 만들어진 습관이나 편견을 조심 또 조심해야하는 것 같다.

모든 문제를 꼼꼼히 보고 기억하는 습관을 들이자!

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

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

입력) 

자연수 N(2 ≤ N ≤ 1,000,000)

각 날의 매매가를 나타내는 N개의 자연수들(10,000이하)

 

출력)

최대 이익을 출력

 

입, 출력 분석)

최대 이익 = 10,000이하의 자연수들 * 1,000,000개 

최악의 경우 10,000,000,000이 나온다.

자료형 범위
int
(4byte)
-2^31‬-1 ~ 2^31-1
= -
2,147,483,648 ~ 2,147,483,647
long long
(8byte)
-2^63-1 ~ 2^63-1
= –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

 

예시 분석)

3
3
10 7 6
3
3 5 9
5
1 1 3 1 2

 

1 2 3 4 5
1 1 3 1 2

위 경우 2번째 날까지 사고(cost:2), 3번째 날에 팔았고(profit:3*2 - cost),

4번째 날에 사고(cost:1), 5번째 날에 팔았다면(profit:1*2 - cost),

이익은 (6-2)+(2-1) = 4+1 = 5이다.

1 2 3 4 5 6
1 1 3 1 1 4

위 경우  5번째 날까지 사고(cost:7), 6번째 날에 팔았다면(profit:4*5 - cost),

이익은 13이다.

 

핵심)

들어오는 수열에서 가장 큰 수를 찾아서,

'가장 큰 수 * 이전 수열까지의 개수' - '그 이전의 수열까지의 합'을 구하고,

이후 수열부터 이런 과정을 수열이 끝날 때까지 반복하면 된다.

 

핵심은 알았는데 1,000,000개의 수열에서 어떻게 제일 큰 수를 먼저 찾지..?
한참 고민하다가 힌트를 얻었다..ㅎ https://blog.naver.com/hongjg3229/221467996183

뒤에서부터 큰 수를 갱신해오면서 이익을 더해주니 금방 PASS 했다.

 

구현)

#include<iostream>
using namespace std;

int arr[1000000];
int N;

int main(int argc, char** argv){
	int test_case;
	int T;
	cin >> T;
	for (test_case = 1; test_case <= T; ++test_case) {
		scanf("%d", &N);
		for (int i = 0; i < N; ++i){
			scanf("%d", &arr[i]);
		}
		long long profit = 0;
		int maxIdx = N-1;
		for (int idx = N-2; idx >= 0; --idx){
			if(arr[idx] < arr[maxIdx]) profit += arr[maxIdx] - arr[idx];
			else maxIdx = idx;
		}
		printf("#%d %lld\n", test_case, profit);
	}
	return 0;
}

상반기 끝나고 한 달 놀고 왔더니 머리가 단단히 굳은 것 같다....

앞으로 더 꾸준히 하면 된다! 아자아자!

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

[D4] 1210.Ladder1  (0) 2020.08.18
[D3] 1206. View  (0) 2020.08.08
[D3] 1208. Flatten  (0) 2020.07.25
[D2] 1204. 최빈수 구하기  (0) 2020.07.22
[D1] 2072. 홀수만 더하기  (0) 2020.07.21

Difficulty 단계별로 풀어보면서 공부를 해보려고 한다.

시작은 가볍게 D1 중 가장 추천을 많이 받은 문제로 열었다.

 

핵심) 짝수와 홀수의 개념이다.홀수는 2로 나눈 몫이 1인 수이고, 짝수는 2로 나눈 몫이 0인 수이다.

 

오늘은 무조건 스타트를 끊으리라 다짐했기에 보자마자 풀 수 있는 문제로 골랐지만,

내일부터는 D2 문제를 제대로 풀 것이다.

시작이 반이다! 할 수 있다!

 

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

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

Step5. 작업 되돌리기

- 스테이지에 올렸던 파일을 내리거나, 커밋을 취소하는 등 각 단계로 돌아갈 수 있다

 

    5-1. 작업 트리에서 수정한 파일 되돌리기 - git check out

        - 수정한 파일이 정상적으로 동작하지 않을 때, 가장 최신 버전의 상태로 되돌려야 할 때

          수천 줄이 넘는 소스를 쉽게 취소할 수 있다.

        경고) checkout으로 되돌린 내용을 다시 복구할 수는 없다.

hello.txt 3 -> three로 수정

     

Changes not staged for commit: 스테이지에 올라가지 않은 상태
책에는 use "git checkout -- <file>..." to discard ...라고 나와 있지만,

내 화면에는 use "git restore <file>..." to discard ...라고 나와 있다.   

 

git checkout --<file>
git restore <file>

    5-2. 스테이징 되돌리기 - git reset HEAD 파일 이름

hello2.txt에 b,c,d 추가

 

책에는 use "git reset HEAD <file>... to unstage" 라고 나와 있지만,        

내 화면에는 use "git reset --staged <file>... to unstage" 라고 나와 있다.

git reset HEAD <file>... 
git restore --staged <file>...

    5-3. 최신 커밋 되돌리기 - git reset HEAD^

hello2.txt에 e 추가하기
message 4로 커밋하기
message4가 없어짐

Unstaged changes after reset: 커밋이 취소되고, 스테이지에서도 내려졌다.

HEAD^: 현재 HEAD가 가리키는 브랜치의 최신 커밋(HEAD -> mater)

git restore --옵션을 찾아봤는데.. 아직 내가 모르는 건지 없는 건지 모르겠다
https://git-scm.com/docs/git-restore

 

[get reset 명령의 옵션]

    5-4. 특정 커밋으로 되돌리기 - git reset 커밋 해시

       - 'git reset HEAD^'으로 최신 커밋으로 되돌릴 수도 있지만,

       - 'git reset 커밋 해시'으로 특정 버전으로 되돌린 다음 그 이후의 버전들 삭제할 수 있다.

   

rev.txt를 만들고 스테이지에 올린 후 "R1" 메시지와 함께 커밋을 한다.
rev.txt에 b를 추가해 수정한 후 스테이징 및 "R2" 메시지와 함께 커밋을 한다.
rev.txt에 c를 추가해 수정한 후 "R3" 메시지와 함께 스테이징과 커밋을(-a -m) 한다.
rev.txt에 d를 추가해 수정한 후 "R4" 메시지와 함께 스테이징과 커밋을(-a -m) 한다.
지금까지 만든 4개의 커밋과 커밋 해시

입력한 커밋 해시가 리셋되는 것이 아니라, 최근 커밋을 입력한 커밋 해시로 리셋한다.

입력한 커밋 해시 이후의 커밋을 삭제하고, 이 커밋 해시로 이동하겠다는 의미이다.
HEAD is now at ... : 가장 최근 커밋이 입력한 해시 위치로 옮겨졌다.

확인하기

    5-5. 커밋 삭제하지 않고 되돌리기 - git revert

rev.txt에 e를 추가해 수정한 후 "R5" 메시지와 함께 스테이징과 커밋을(-am) 한다     
현재까지의 버전 확인하기

4. 에서는 R2 커밋으로 되돌리기 위해 git reset --hard [R2 커밋 해시]를 했다면,

revert의 경우에는 취소하려고 하는 버전이 와야 하므로

git revert [R5 커밋 해시]로 지정한다.

 

문서 위에 revert 하면서 추가로 남겨둘 내용을 입력하고 저장한다

기존의 R5가 사라지진 않았지만, R5 버전을 지우는 대신

R5에서 변경했던 이력을 취소한 새 커밋을 만든 것이다.

Step3. 커밋 내용 확인하기

- 지금까지 어떤 버전을 생성했는지, 각 버전 간에 어떤 차이가 있는지 알 수 있다.

 

   3-1. 커밋 기록 자세히 살펴보기 - git log

        - git log : 지금까지 만든 버전과 각 버전에 대한 설명이 화면에 나타난다.

커밋 해시(commit hash) : commit 옆, 영문과 숫자로 된 긴 문자열(= 깃 해시,git hash)

(HEAD -> master) : 이 버전이 가장 최신이라는 표시

Author : 버전을 누가 만들었는지

Date : 버전이 언제 만들어졌는지

커밋 로그(commit log) : git log 명령을 입력했을 때 나오는 정보들

   3-2. 변경 사항 확인하기 - git diff

       - 작업 트리에 있는 파일과 스테이지에 있는 파일을 비교하거나, 

       - 스테이지에 있는 파일과 저장소에 있는 최신 커밋을 비교해서

       - 수정한 파일을 커밋하기 전에 최종적으로 검토할 수 있다.

vim hello.txt 2를 two로 수정
hello.txt 파일이 수정되었고, 아직 스테이징 상태가 아니다.

'-2'는 최신 버전과 비교할 때 hello.txt 파일에서 2가 삭제되었다.

'+two'는 hello.txt 파일에 two라는 내용이 추가되었다.

비교한 후에

1) 수정한 내용으로 다시 버전을 만들 경우                 

- 스테이지에 올린 후 커밋한다                          

2) 수정한 내용을 버리는 경우                                      

- git checkout 명령을 사용해 내용을 취소한다

다음 실습을 위해 원상복구하기

Step4. 버전을 만드는 단계마다 파일 상태 알아보기

- 깃에서는 버전을 만드는 각 단계마다 파일 상태를 다르게 표시한다. 따라서, 

-  1) 파일이 버전 관리의 여러 단계 중 어디에 있는지,

-  2) 그 상태에서 어떤 일을 할 수 있는지 알 수 있다.

 

    4-1. tracked file 과 untracked file - git status

        - git status : 화면에 파일 상태와 관련된 메시지가 나타난다.

        - 작업 트리에 있는 파일들은 tracked 상태와 untracked 상태로 나뉜다.

        tracked file
          - 깃은 한 번이라도 커밋한 파일의 수정 여부를 계속 추적한다.

          - 따라서 깃이 추적하고 있는 파일을 tracked file이라 부른다.

        untracked file 

          - 한 번도 깃에서 버전 관리를 하지 않았기 때문에 수정 내용을 추적하지 않는다.

          - 따라서 깃이 추적하지 않는 파일을 untracked file이라 부른다.

스테이지에 올리기

modified: 마지막 버전 이후 수정된 hello.txt

new file: 한 번도 버전관리 하지 않았던 hello2.txt

각 커밋에 어떤 파일들이 관련되었는지 알 수가 없다

--stat 옵션: 커밋에 관련된 파일을 살펴볼 수 있다.

로그 화면이 많을 경우
[Enter]를 누르면 : 다음 로그 화면을 보여줌

[Q]를 누르면 : 로그 화면 -> 깃 명령 화면

            +) 버전 관리 중인 디렉토리 안에 버전 관리를 하지 않을 특정 파일이나 디렉터리가 있다면,

                .gitignore 파일을 만들어 목록을 지정할 수 있다.
                vim을 사용해 .gitignore 파일을 만든 후, '파일 또는 디렉토리 이름, 파일 확장자'를 입력

                ex) 개인적으로 메모한 파일이나, 프로그램 사용 중 자동생성된 swp파일, 백업 파일 등등

    4-2. unmodified, modified, staged 상태

         - tracked 상태인 파일은 깃 명령으로 파일 상태를 확인하면, 

            1) 현재 작업 트리에 있는지

            2) 스테이지에 있는지 등

          더 구체적인 상태를 알려준다.

[unmodified] 수정 되지 않은 상태

'working tree clean'

현재 작업 트리에 있는 모든 파일은 unmodified 상태이다.

'Changed not staged for commit'

파일이 수정되었고, 스테이지에 올라가지 않았다

[modifed] 파일 수정만 된 상태

'Changes to be committed'

커밋할 변경사항이 있다

[staged] 커밋 직전 단계

'working tree clean'

커밋을 끝내고 난 후 수정이 없는 unmodified 상태로 돌아간다

+) 방금 커밋한 메시지 수정하기 git commit --amend
     명령을 입력하면 vim이 실행되며 원래 커밋 메시지가 뜨고, 수정하면 된다.

깃에서의 버전이란?

- 문서를 수정할 때마다 간단한 메모와 함께 수정 내용을 저장하는 것

- 문서를 수정하고 저장할 때마다 생기는 것

 

목표

- 수정한 문서 내용을 버전으로 저장하는 것

- 저장한 버전을 이용해 이전 버전으로 되돌리는 것

 

Step1. 깃 저장소 만들기(깃 초기화)

- 깃의 기본 개념을 익히기 위해, 사용자의 컴퓨터에 저장소를 만든다.

- 저장소를 만들고 싶은 디렉토리로 이동, 초기화한 후 그곳에 있는 파일들을 버전 관리한다.

 

   1-1. hello-git 디렉토리를 생성한 후, 디렉토리 안의 내용을 살펴본다.

아직 아무것도 만들지 않았기 때문에 파일은 하나도 없다.

   1-2. 깃을 사용할 수 있도록(=저장소를 만들기 위해) 디렉토리를 초기화한다.

Initialized empty Git repository ... 가 뜨면 해당 디렉토리에서 깃을 사용가능하다. 

   1-3. 깃을 사용하면서 버전이 저장될 저장소(repository) .git 확인하기

.git 디렉토리가 생겼다.

   +) 사용자가 실수로 지우지 않도록 .git 디렉토리는 탐색기에 나오지 않는다.(숨긴 파일을 확인)

Step2. 버전 만들기

- 파일을 다른 이름으로 저장해 버전을 만드는 것보다 훨씬 쉽다.

- 원래 파일 이름은 유지하면서 수정 내용, 변경 시점과 변경 내용까지 저장가능하다.

- 이전 버전으로 되돌아갈 수 있다.이러한 시스템을 버전 관리 시스템(ex.깃)이라고 한다.

 

   2-1. 들어가기 전에 (버전 만들기 = 작업 트리 + 스테이징 + 커밋)

      작업 트리(working tree), 작업 디렉터리(working directory) - 눈에 보임 O
      - 파일 수정, 저장 등의 작업을 하는 디렉터리 ex.hello-git 디렉터리
      - 우리 눈에 보이는 디렉터리

 

      스테이지(stage), 스테이징 영역(staging area) - 눈에 보이지 않음 X     

      - 버전으로 만들 파일이 대기하는 곳

      - 작업 트리에서 10개의 파일을 수정했는데, 4개의 파일만 버전으로 만드려면,
         그 4개의 파일만 스테이지로 넘기면 된다.

 

      저장소(repository) - 눈에 보이지 않음 X
      - 저장소에서 대기하고 있던 파일들을 버전으로 만들어 저장하는 곳

 

      눈에 보이지는 않지만, 깃이 버전을 만드는 과정을 살펴보면,

hello.txt 파일 문서를 수정하고 저장하면 이 파일은 작업 트리에 있게 된다.

버전으로 만들고 싶을 때 hello.txt 파일 문서를 스테이지에 넣는다.

또 다른 파일들도 수정한 후 스테이지에 넣는다.

깃에게 커밋 명령을 내린다.

새로운 버전이 생성되면서 스테이지에서 대기하던 파일들이 모두 저장소에 저장된다.

 

   2-2. 작업 트리에서 vim으로 문서 수정하기

        1) 깃의 상태 확인하기 - git status

             On branch master : 현재 master branch에 있다.

             No commits yet : 아직 commit한 파일이 없다.

             nothing to commit :  현재 commit할 파일이 없다.

        2) vim으로 파일을 편집한다.

[입력 모드] 키보드 'I' 또는 'A' / [ex 모드] 키보드 'Esc'
hello.txt 파일이 생성되었다

        3) 깃의 상태 다시 한 번 확인하기 

             untracked files : 한번도 버전 관리하지 않은 파일

   2-3. 수정한 파일을 스테이징하기 - git add

        1) 스테이징(staging), 스테이지에 올린다, 인덱스에 등록한다

            - 스테이지에 수정한 파일을 추가하는 것(깃에게 버전 만들 준비를 하라고 알려주는 것)

            - 스테이징 내용을 .git/index 파일에 저장하는 것(->인덱스에 등록한다)
            경고) 윈도우는 줄이 바뀌는 위치에 CR 문자와 LF 문자가 삽입되고,

                      리눅스와 맥은 그 위치에 LF 문자가 삽입되기 때문에
                      hello.txt의 CRLF 문자를 LF 문자로 변환해서 commit할 것이라는 의미!

        2) 깃 상태 확인하기

            untracked files -> changes to be commited:

            new file : hello.txt
            - 새 파일 hello.txt를 (앞으로) commit할 것이다

   2-4. 스테이지에 올라온 파일 커밋하기 - git commit

        1) 커밋한다

            - 깃에서 버전을 만드는 것

            - 메시지를 함께 기록한다. (커밋할 때 그 버전에 어떤 변경 사항이 있었는지 확인을 위해)

            - 커밋 메시지: 커밋과 함께 저장할 메시지(-m 옵션이 필요하다)

        2) 깃 상태 확인하기

[commit 결과 메시지] 1 files changed, 1 insertion(+)

 파일 1개가 변경되었고, 파일에 1개의 내용이 추가되었다

[status 결과 메시지] nothing to comit, working tree clean

버전으로 만들 파일이 없고, 작업 트리도 수정사항 없이 깨끗하다

        3) 저장소에 저장된 버전 확인하기 git log

            git log

            - 방금 커밋한 버전이 나타난다. 

            - 커밋을 만든 사람, 만든 시간과 커밋 메시지가 함께 나타난다.

   5. 스테이징과 커밋 한번에 처리하기 (3. 스테이징 + 4. 커밋) - git commit -am

        git commit -am

        - 단, 한 번이라도 커밋한 적이 있는 파일을 다시 커밋할 때만 사용가능하다.

git commit -a -m "commit message" 명령도 가능하다

확실히 읽으면 진도는 빨리 나가지만, 일일이 캡쳐하면서 하려고 하니 진도가 좀 느린 것 같다..

그래도 힘내자! 꾸준히 열심히!

+ Recent posts