개발지식 먹는 하마 님의 블로그

[내일배움캠프 9일차] _ 탐욕법, 계산기 lv2 구현, Git 오류 본문

내일배움캠프 (CS25)

[내일배움캠프 9일차] _ 탐욕법, 계산기 lv2 구현, Git 오류

devhippo 2025. 2. 27. 19:36

그리디 알고리즘(탐욕법) 문제를 하나 풀이했다.

GUI에서 구현하는 프로젝트는 입력값을 받는 방법 자체가 콘솔과 조금 달라져서
요구사항을 정확하게 충족하기가 어려울 것 같다고 판단했다.
따라서 콘솔로 먼저 level2 구현을 완료했다.


📚 학습 내용 정리

  • 탐욕법 문제 풀이

이번 문제는 다소 쉬웠다.

https://devhippo.tistory.com/74

 

1541번 - 잃어버린 괄호

✏️ 문제 풀이이번 문제 풀이는 간단하다.-가 등장할 경우, 그 뒤에 등장하는 수를 모두 합해서 뺀다.괄호를 원하는 위치에 삽입할 수 있기 때문에 -가 등장하면 그 뒤에 등장하는 모든 수를 따

devhippo.tistory.com

 

콘솔 기반 계산기 GUI 구현

1) level 1 구현 업그레이드

exit를 입력받기 전까지의 과정을 while문으로 감싸고
결과를 출력한 뒤에 선언된 break 문으로 반복문을 탈출하도록 했다.

while (true) {
	try {
		//입력 받기 (예외 발생 시, 예외 문구 출력 후, 이곳으로 돌아옴)
		switch (operator) { 
			//연산기호에 따른 연산
		}
            
		System.out.println("연산 결과 : " + result);
		break; //반복문 탈출!
	}catch (예외 e) {
		//예외 처리
	}
}

이렇게 하면 예외가 발생했을 때, 데이터를 입력받는 부분으로 돌아갈 수 있다.

 

2) exit 입력 방법 변경

이전에는 next()를 사용했기 때문에 exit 또는 아무 글자나 입력해야 다음 단계로 넘어갈 수 있었다.
enter를 사용할 경우 계속 입력을 기다리는 상태가 유지되었다.

이를 해결하기 위해 enter키 공백 인식이 가능한 nextLine()을 사용했다.
그러나 문제가 발생했다.
enter 키를 입력할 틈도 없이 바로 다음 단계로 넘어가졌기 때문이다.

원인은 이전 입력의 개행 문자가 입력 버퍼에 남아있었기 때문이다.
이를 해결하기 위해 입력을 받기 전, 입력 값을 받는 변수 없이 scanner.nextLine()을
한 번 호출하여, 입력 버퍼를 초기화했다.

scanner.nextLine();
System.out.println("종료하려면 exit를 입력해주세요: ");
String isEnd = scanner.nextLine();

 

3) level 2 구현 완료

getter 역할의 메서드인 getResultList()에서
List<Integer>를 반환할 때, 새로운 배열로 원본의 복사본을 만들어 반환했다.

private List<Integer> results = new ArrayList<>();

public List<Integer> getResultList() {
    return new ArrayList<>(results); //clear를 사용해도 원본 내용이 삭제되지 않도록 복사본 반환
}

results를 출력할 때, 요소를 삭제 후 이를 확인하기 위해 한 번 더 배열의 내용을 출력하고자 했다.
이때, main에서 기존에 받았던 results의 내용을 Clear()로 지우고
다시 getResultList() 메서드를 호출하여 반환값을 받는데 
Clear를 사용하면 원본의 private여부와 관계없이 원본 배열의 데이터가 초기화되기 때문이다.


 학습하며 겪었던 문제점

Git 사용 방법

자꾸 base가 달라서 변경 내용을 push 할 수 없다는 오류가 발생했고 이를 해결하지 못했다.
결국 기존 repository를 삭제하고 새로 만들었다.

그 과정에서 또 몇 가지 위기를 겪었는데 이를 정리하고자 한다.

1. Git Quick setup - HTTPS 선택 여부 확인하기

Git init을 한 후, Github에서 초기에 제공하는 remote 코드를 복붙 했다.
여기서 오류가 발생할리 없는데 빨간색 글씨의 오류들이 등장했다.
내용을 대충 확인해 보니 공개키? SSH를 요구하는 오류였다.

원인은 아무 생각 없이 SSH 기반으로 제공되는 코드를 복사해서 사용했기 때문이었다.

꼭 HTTPS가 선택된 상태인지 확인하자!

 

2. 브랜치 생성 후 원격 저장소에 Push

분명히 main, dev, level1 이렇게 3개의 브랜치를 사용하고 있었는데
원격 저장소에는 main밖에 존재하지 않았다.

브랜치도 코드 변경사항처럼 브랜치 생성 후, 이를 Push 하지 않으면 반영되지 않는다!

Git switch -c dev //새로운 dev 브랜치 생성
Git push origin dev //이래야 브랜치 생성이 원격 저장소에 반영됨

 

3. 여러 브랜치가 있을 때의 Push 순서

나는 위에서도 언급했다시피 main, dev, level1 3개의 브랜치를 사용하고 있었다.

각 브랜치는 main : 최종, dev : 중간 단계, level1 : 실제 작업용과 같이 용도를 나누어 사용하고 있었다.

내 실수는 (추정 그러나 거의 확신)

level1의 작업 내용을 level1에 push 하지 않은 채 바로 main에 push 했다는 것이고,
main의 변경사항을 pull 하지 않은 채 level1에서 작업을 이어나갔다는 것이다.

 [ Push 순서 (더 이상의 오류는 사양이다!) ]

* 작업용 브랜치에서 작업 완료 후

1. 먼저 '해당' 브랜치에 add, commit, push 한다.

2. 브랜치를 dev로 변경한다.

3. dev에 작업용 브랜치의 내용을 pull 또는 merge 한다.

만약, 완료된 작업이라 main에도 반영할 내용이라면
1번을 완료 후, main에 먼저 push 또는 merge 하고
dev에서 main을 pull해도 무방하다.

⭐ 내일 학습할 것

1. Level 3 수준 구현 완료하기

2. 코딩 테스트 문제 풀기

3. GUI 구현 (... 어제 구현한 GUI 코드의 복사본을 따로 저장해 놨는데 어쩌다 보니 날아갔다... 복구가 필요하다.)