관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

자바 1 실력 확인 테스트 문제 풀기 본문

프로그래밍 언어/자바

자바 1 실력 확인 테스트 문제 풀기

huenuri 2024. 8. 13. 08:36

새벽에 일어나서 어제 풀려고 했던 실력 확인 테스트 문제를 풀어보려고 한다. 조금 전에 쓴 글이 하나도 저장이 되어 있지 않아 다시 처음부터 쓰려니 좀 귀찮기는 하지만 말이다. 이제 공부를 시작해보자!


 

 

 

 

 

실력 확인 테스트 문제 풀어보기

 

문제 1번


 

 

 

 

처음에는 평균을 구할 때 길이에 괄호를 묶지 않아서 틀렸는데 이 괄호의 여부에 따라 값이 달라진다는 걸 알게 되었다. 어쨌든 정말 잘 풀었다.


 

 

 

 

 

문제 2번


 

 

첫번째 도전

 

이 문제는 생각보다 많이 어렵다. 왜 별이 한 개가 빠지는지 모르겠다.


 

 

다시 풀어보기

 

별이 하나씩 빠지게 출력이 되는 이유는 내부 for문에서 잘못 설정했기 때문이었다. j를 1로 설정하고, j가 i보다 크거나 같은 동안에 j--를 반복하면서 별을 출력하려고 한다. 하지만 이렇게 하면 별이 제대로 출력되지 않는다. 예를 들어, i = 1일 때, j는 처음부터 i보다 작아져서 별이 아예 출력되지 않는다. 

j의 초기값을 i에 따라 설정하고 j가 줄어들도록 설정하면 이를 해결할 수 있다. 이 문제는 스스로 풀지 못했으므로 다음에 복습할 때 한번 더 풀어보려고 한다.


 

 

 

문제 3번


 

 

첫번째 도전

 

 

이 문제는 너무 어려워서 도저히 감을 잡지 못하겠다. 틀린 이유는 다음과 같다

 

1. 잘못된 비교 조건

 

  • if(stairs[i] > stairs[i]) 이 조건은 항상 false가 된다. 이는 배열의 동일한 인덱스를 비교하고 있기 때문이다. 따라서, 이 비교는 항상 거짓이며, 올라가는 계단과 내려가는 계단을 전혀 세지 못한다.

2. 계산 로직 문제

  • 코드에서 upStair = stairs[i]; 와 downStair = stairs[i];는 값을 단순히 할당하고 있다. 이 작업은 계단이 올라가거나 내려가는 횟수를 세는 것이 아니라, 계단의 높이를 upStair와 downStair에 저장할 뿐이다.

 

 

 

 

다시 풀어보기

 

 

문제에는 없지만 설명도 붙여보았다. 처음 내가 작성했던 코드는 두 계단을 단순히 비교하는 거였다. 위쪽 계단이 n+1이라면 upStair을 1씩 증가시키고 그렇지 않으면 downStair을 1씩 증가시키면 된다.


 

길이에서 1을 빼는 이유

  • 배열의 길이가 stairs.length라면, 배열의 유효한 인덱스 범위는 0부터 stairs.length - 1까지이다.
  • 코드에서 stairs[i]와 stairs[i + 1]를 비교하려고 할 때, i가 마지막 인덱스(stairs.length - 1)에 도달하면 stairs[i + 1]는 인덱스 범위를 벗어나게 된다. 이는 배열에서 존재하지 않는 인덱스에 접근하는 것이므로 ArrayIndexOutOfBoundsException 예외가 발생하게 된다.
  • 1을 빼주는 이유: 마지막 인덱스(stairs.length - 1)와 그 다음 인덱스(stairs.length)를 비교할 때 발생할 수 있는 배열 범위 초과 오류를 방지하기 위함이다. 이렇게 함으로써 모든 인덱스에서 stairs[i]와 stairs[i + 1]을 안전하게 비교할 수 있다.

 

 

 

 

문제 4번


 

 

첫번째 도전

 

풀긴 풀었으나 답은 틀렸다. 틀린 이유를 분석해보면 다음과 같다.


 

1. 후보별 득표수를 잘못 계산

  • il = vote[i]; il++; 이런 식으로 구현되어 있는데 이 부분은 잘못된 로직이다. il = vote[i]; 이 줄은 il에 현재 투표 번호를 할당한 다음, il++을 수행하여 1을 증가시킨다. 하지만 이렇게 하면 득표수를 제대로 세지 못한다. 이 코드에서는 득표수를 세기 위해서는 단순히 il++만 해야 합니다.

2. 후보 번호 비교 오류

  • 코드에서 if(vote[i] == 2) 조건이 여러 번 반복되고 있다. 이는 다른 후보에 대한 득표수를 세지 못하게 하므로 오류입니다. 각 후보의 조건이 독립적으로 존재해야 한다.

3. 승자를 결정하는 로직 오류

  • 마지막에 승자를 결정하는 부분에서 if(vote[i] > winner)를 사용하고 있는데, 이는 단순히 후보 번호를 비교하는 것이므로 승자를 제대로 결정하지 못한다. 승자는 득표수가 가장 많은 후보가 되어야 한다.

 

 

 

다시 풀어보기

 

 

답은 잘 끌어냈는데 몇 가지 문제점이 있었다. 처음 코드에서 2를 반복해서 쓴 건 단순히 오타였다. 그걸 빼고도 문제는 틀렸다. 각각의 후보에 하나씩 증가시키되 인덱스 번호를 담아줄 필요는 없었다. 

 

  1. 인덱스 할당 문제
    • il = vote[i]; 이 부분에서 il에 vote[i]를 할당하고 있다. 그러나 vote[i]는 단순히 투표 번호(예: 1, 2, 3, 4, 5)일 뿐이며, 이를 il에 할당하면 il의 값이 후보 번호로 바뀝니다.
    • 그런 다음 il++를 수행하면 il이 증가하게 되는데, 이때 il은 후보 번호에서 1이 증가한 값이 되므로 실제 득표수를 계산하지 못한다.
  2. 변수의 재할당 문제
    • il = vote[i];와 같은 형태로 작성하면, il이 처음 할당된 값을 잃게 되고, 다음 il++가 의미를 잃게 된다. 예를 들어, il이 1번 후보의 득표수를 담고 있다가, vote[i]의 값에 따라 갑자기 2, 3, 4 등으로 변경되어 버립니다.
  3. 후보별 득표수를 올바르게 계산하지 않음
    • 각 후보의 득표수를 증가시키려면 단순히 il++ 식으로 값을 증가시켜야 하는데, il = vote[i];를 통해 후보 번호를 할당하는 로직은 필요하지 않다.

 

최대 득표자를 저장할 maxVotes가 필요한데 난 이 부분까지는 생각하지 못했다. 가장 먼저 1번은 초기 승자로 넣어주는 것이 중요하다. 무척 어려운 문제이지만 여러 번 생각하면 풀 수 있는 문제였다.

여기까지 풀 수 있다는 것이 정말 뿌듯하고 기쁘다! 두 달 전까지만 해도 내가 이런 문제를 풀 수 있으리라고는 생각도 하지 못했다.


 

 

 

문제 5번


 

 

첫번째 도전

 

이 문제는 너무 어려워서 어떻게 풀어야 할지 감이 좀 잡히지 않았다. 이차원 배열 문제가 아직 익숙하지 않아 이 조건을 어떻게 만드는지를 잘 모르는 것이다. 문제의 원인은 다음과 같다.

 

  1. 배열 길이 접근 오류
    • for(int j = 0; j < seat[i]; j++)에서 seat[i]는 배열의 길이가 아니라 배열의 한 행 자체를 의미한다. 배열의 길이를 얻으려면 seat[i].length를 사용해야 합니다.
  2. 변수 i와 j의 범위 문제
    • System.out.println(seat[i] + "번째 줄 " + seat[j] + "번째 좌석"); 이 부분은 i와 j 변수가 for 루프 외부에서 사용되고 있어, 컴파일 오류가 발생한다. i와 j는 루프 외부에서 선언하고 초기화해야 한다.
  3. 좌석 번호가 존재하지 않는 경우 처리
    • 사용자가 입력한 좌석 번호가 배열에 존재하지 않는 경우도 고려해야 한다. 현재 코드에서는 그런 상황이 처리되지 않는다.
  4. 좌석 번호를 찾는 논리
    • 입력된 좌석 번호와 배열 내의 값을 비교하여 좌석의 위치를 찾는 논리가 필요하다. 배열에서 값을 찾았을 때, 해당 위치를 출력하도록 해야 한다.

 

 

 

 

다시 풀어보기

 

 


 

 

row와 col을 -1로 설정한 이유

  1. 초기값이 0일 때의 문제
    • 만약 row와 col의 초기값을 0으로 설정하면, 나중에 해당 변수를 참조할 때, 좌석 번호가 배열의 첫 번째 줄 첫 번째 좌석에 있다고 잘못 인식할 수 있다. 왜냐하면 row == 0과 col == 0이 실제로 존재하는 배열의 첫 번째 위치를 나타낼 수 있기 때문이다.
  2. 초기값을 -1로 설정
    • -1은 배열 인덱스에서 유효하지 않은 값이다. 배열은 0부터 시작하는 인덱스를 가지므로, 인덱스 값으로 -1을 사용하는 것은 불가능하다.
    • 따라서, 탐색 후에도 row와 col이 여전히 -1이라면, 이는 좌석 번호가 배열에서 발견되지 않았다는 명확한 신호가 된다.
  3. 좌석 번호가 존재하지 않을 경우
    • 탐색이 완료된 후, row와 col이 여전히 -1인 경우, 사용자에게 "좌석 번호가 존재하지 않습니다"라는 메시지를 출력할 수 있다.

이 문제는 굉장히 어려운 문제였다. 그래도 검색을 하며 이렇게 풀어볼 수 있어서 기뻤다.


 

 

 

 

학습을 마치고

 

1시간 정도면 문제를 다 풀 수 있을줄 알았는데 무려 2시간 반이나 걸렸다. 모두 100점이다. 이로써 자바 1 공부를 모두 마쳤다.