본문 바로가기
알고리즘/백준

[백준 17140] 이차원 배열과 연산 (C++)

by Bloofer 2020. 3. 5.

A. 문제설명

https://www.acmicpc.net/problem/17140

자세한 설명은 위 링크에서

 

1. 3 * 3 배열이 존재

2. 배열에 매 초마다 연산을 적용

   2-1. R 연산: 배열 A의 모든 행에 대해서 정렬을 수행한다. 행의 개수 ≥ 열의 개수인 경우에 적용
   2-2. C 연산: 배열 A의 모든 열에 대해서 정렬을 수행한다. 행의 개수 < 열의 개수인 경우에 적용

3. 여기서 정렬의 의미는 각 행 또는 열 내 숫자들을 계수, 숫자들이 발생한 횟수를 조건에 맞추어 정렬한다는 것

   * [1, 1, 2, 3, 3] 의 배열이 존재한다고 가정. 1이 2개, 2가 1개, 3이 2개이므로 [1, 2, 2, 1, 3, 2]의 새로운 배열을 만듦

4. 새로 만든 배열은 아래와 같이 정렬됨

   4-1. 등장횟수를 우선으로 숫자와 등장횟수 쌍을 오름차순 정렬

   4-2. 등장횟수가 같은 수끼리는 그 크기를 기준으로 오름차순 정렬

   * [1, 1, 2, 3, 3]을 계수하면 [1, 2, 2, 1, 3, 2]가 되고, 이를 정렬하면 최종적으로 [2, 1, 1, 2, 3, 2]가 됨

5. 배열을 정렬해서 각 행 또는 열에 넣고 길이가 100이 넘기는 것은 버리고, 100이 안되면 빈 곳을 0으로 채움

6. A[r][c]에 k가 나올때까지 반복. 100초가 넘으면 -1 반환

 

이 문제에서는 R/C 연산과 문제의 정렬방법에 대해서 이해하고 접근법을 생각하면 된다. 두가지 다 특정 조건들을 주어진대로 충실하게 구현할 수 있도록 하자.

 

B. 접근법

배열에 연산을 적용하고 100번 반복하는 시뮬레이션 문제. 여기서 a) R/C 연산의 선택을 위한 행/열 갯수 계산 b) 문제에서 주어진 배열 정렬법, a), b) 두가지를 염두하여 구현하자.

 

C. 풀이

1. 100번의 턴을 수행하는 반복문

2. 행/열의 크기에 따라 R/C 연산을 수행

3. 각 R/C 연산에서 해당 행/열의 크기만큼 각 배열을 뽑아내어 계수하고 정렬한다.

4. 배열 내 숫자의 등장 횟수를 계수(C++ Map 자료구조 사용)

5. 맵을 배열로 옮겨서 정렬

   5-1. 숫자의 등장 횟수를 우선으로 오름차순정렬

   5-2. 숫자 등장횟수가 같으면, 숫자의 크기를 기준으로 오름차순정렬

6. 정렬된 배열을 모두 채워줌

   6-1. 빈 자리는 모두 0으로 채움

   6-2. 배열이 넘치면 100번째 인덱스까지만 사용

7. 매 턴이 수행될 때마다 행/열의 크기를 업데이트

8. 100초내 K 값을 찾으면 종료

 

D. 내 코드