본문 바로가기

알고리즘/인프런

섹션 2. Array(1, 2차원 배열)_11. 임시반장 정하기

문제

  • 김갑동 선생님은 올해 6학년 1반 담임을 맡게 되었다.
  • 김갑동 선생님은 우선 임시로 반장을 정하고 학생들이 서로 친숙해진 후에 정식으로 선거를 통해 반장을 선출하려고 한다.
  • 그는 자기반 학생 중에서 1학년부터 5학년까지 지내오면서 한번이라도 같은 반이었던 사람이 가장 많은 학생을 임시 반장으로 정하려 한다.
  • 그래서 김갑동 선생님은 각 학생들이 1학년부터 5학년까지 몇 반에 속했었는지를 나타내는 표를 만들었다.
  • 예를 들어 학생 수가 5명일 때의 표를 살펴보자.

  •  위 경우에 4번 학생을 보면 3번 학생과 2학년 때 같은 반이었고, 3번 학생 및 5번 학생과 3학년 때 같은 반이었으며,
  • 2번 학생과는 4학년 때 같은 반이었음을 알 수 있다. 그러므로 이 학급에서 4번 학생과 한번이라도
  • 같은 반이었던 사람은 2번 학생, 3번 학생과 5번 학생으로 모두 3명이다.
  • 이 예에서 4번 학생이 전체 학생 중에서 같은 반이었던 학생 수가 제일 많으므로 임시 반장이 된다.
  • 각 학생들이 1학년부터 5학년까지 속했던 반이 주어질 때, 임시 반장을 정하는 프로그램을 작성하시오.

입력

  • 첫째 줄에는 반의 학생 수를 나타내는 정수가 주어진다. 학생 수는 3 이상 1000 이하이다.
  • 둘째 줄부터는 1번 학생부터 차례대로 각 줄마다 1학년부터 5학년까지 몇 반에 속했었는지를 나타내는 5개의 정수가 빈칸 하나를 사이에 두고 주어진다.
  • 주어지는 정수는 모두 1 이상 9 이하의 정수이다.

출력

  • 첫 줄에 임시 반장으로 정해진 학생의 번호를 출력한다.
  • 단, 임시 반장이 될 수 있는 학생이 여러 명인 경우에는 그 중 가장 작은 번호만 출력한다.

입출력 예제


풀이 방식을 정리해보자.

 

1. 학생 수 N을 입력받고, 학생들의 반을 저장할 배열 arr[ ][ ]를 선언한다.

  • 1~N까지의 인덱스가 필요하므로 [N+1] 까지 필요하다.
  • 5학년까지만 필요하므로 [6] 까지 필요하다.
  • 위 조건들로 인해 arr[N+1][6] 으로 크기를 설정한다.

2. 1부터 N까지 도는 for문( i )과 1부터 5까지 도는 for문( j )을 통해 각 학생들의 반을 입력받는다.

  • for문( i ) : 1학년부터이기 때문에 1부터 시작한다.
  • for문( j ) : 최대 5학년이기 때문에 5까지이다.

3. 이제 메소드 구현으로 넘어가보자.

 

4. 결과값을 저장할 변수 result를 선언한다.

 

5. 최대값을 저장할 변수 max를 선언하고, MIN_VALUE를 통해 최소값으로 초기화한다.

  • MIN_VALUE : -2의 31제곱(-2,147,483,648) 으로 초기화해주는 메소드이다.

6. 1부터 N까지 도는 i번 학생(행)을 위한 for문( i )을 작성하고, cnt를 선언하여 0으로 초기화한다.

  • cnt : 같은 반인 학생의 수를 저장할 변수이다.

7. 1부터 N까지 도는 j번 학생(열)을 위한 for( j )문을 작성한다.

 

8. 1학년부터 5학년까지 돌아야하므로 1부터 5까지 도는 for문( k ) 을 작성한다.

 

9. if문을 통해 i번 학생과 j번 학생의 반이 같으면 cnt를 더해준다.

  • arr[ i ][ k ] : i번 학생, k 학년을 의미한다.
  • arr[ j ][ k ] : j번 학생, k 학년을 의미한다.
  • break; 를 선언하지 않으면 계속 돌면서 값이 이상해질 수 있기 때문에 반드시 적어준다.

10. cntmax를 비교해서 cnt가 더 크면 max에 cnt 값을 넣어준다.

 

11. 결과값은 학생의 번호이기 때문에 result에 i 값을 넣어준다.

 

수행 결과를 확인한다. 


해당 글은 인프런 > 자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비(김태원)강의를 참고하여 작성하였습니다.