PS/백준

[BOJ] 17140 이차원 배열과 연산 (C/C++)

uyt8989 2022. 3. 15. 20:32
 

17140번: 이차원 배열과 연산

첫째 줄에 r, c, k가 주어진다. (1 ≤ r, c, k ≤ 100) 둘째 줄부터 3개의 줄에 배열 A에 들어있는 수가 주어진다. 배열 A에 들어있는 수는 100보다 작거나 같은 자연수이다.

www.acmicpc.net

문제

크기가 3×3인 배열 A가 있다. 배열의 인덱스는 1부터 시작한다. 1초가 지날때마다 배열에 연산이 적용된다.

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

한 행 또는 열에 있는 수를 정렬하려면, 각각의 수가 몇 번 나왔는지 알아야 한다. 그 다음, 수의 등장 횟수가 커지는 순으로, 그러한 것이 여러가지면 수가 커지는 순으로 정렬한다. 그 다음에는 배열 A에 정렬된 결과를 다시 넣어야 한다. 정렬된 결과를 배열에 넣을 때는, 수와 등장 횟수를 모두 넣으며, 순서는 수가 먼저이다.

예를 들어, [3, 1, 1]에는 3이 1번, 1가 2번 등장한다. 따라서, 정렬된 결과는 [3, 1, 1, 2]가 된다. 다시 이 배열에는 3이 1번, 1이 2번, 2가 1번 등장한다. 다시 정렬하면 [2, 1, 3, 1, 1, 2]가 된다.

정렬된 결과를 배열에 다시 넣으면 행 또는 열의 크기가 달라질 수 있다. R 연산이 적용된 경우에는 가장 큰 행을 기준으로 모든 행의 크기가 변하고, C 연산이 적용된 경우에는 가장 큰 열을 기준으로 모든 열의 크기가 변한다. 행 또는 열의 크기가 커진 곳에는 0이 채워진다. 수를 정렬할 때 0은 무시해야 한다. 예를 들어, [3, 2, 0, 0]을 정렬한 결과는 [3, 2]를 정렬한 결과와 같다.

행 또는 열의 크기가 100을 넘어가는 경우에는 처음 100개를 제외한 나머지는 버린다.

배열 A에 들어있는 수와 r, c, k가 주어졌을 때, A[r][c]에 들어있는 값이 k가 되기 위한 최소 시간을 구해보자.

입력

첫째 줄에 r, c, k가 주어진다. (1 ≤ r, c, k ≤ 100)

둘째 줄부터 3개의 줄에 배열 A에 들어있는 수가 주어진다. 배열 A에 들어있는 수는 100보다 작거나 같은 자연수이다.

출력

A[r][c]에 들어있는 값이 k가 되기 위한 연산의 최소 시간을 출력한다. 100초가 지나도 A[r][c] = k가 되지 않으면 -1을 출력한다.


문제를 잘 읽자. 문제를 대충 읽었다가 시간을 꽤나 버렸다. 처음엔 R과 C연산을 마음대로 적용할 수 있는 줄 알았다. 그래서 BFS 문제인 줄 알았다. 연산량이 2^100이나 될 것 같아서 이걸 도대체 어떻게 시간을 줄이나 고민하고 있었다. 하지만 그게 아니라 현재 행과 열의 크기로 연산이 결정되더라...

 

그 이후엔 숫자를 세고 정렬하는 것을 해결해야했다. 이 문제의 제한 시간이 짧은 편이고 내가 짠 코드의 상수가 꽤나 크다고 생각해서 과연 이렇게 해도 답이 나올까 의문이었지만 입력의 크기가 그렇게 크지 않아서 시간 안에 들어올 수 있었다. 

 

벡터를 정렬하는데 있어서 추가적으로 구현한 것은 없다. 개수를 먼저 pair에 저장하게 되면 원하는 순서대로 정렬된다. 그걸 꺼내서 다시 배열에 적어주기만 하면 됐다.

 

 

후기)

문제를 잘 좀 읽자...

 

 

 

'PS > 백준' 카테고리의 다른 글

[BOJ] 13458 시험 감독 (C/C++)  (0) 2022.03.17
[BOJ] 16235 나무 재테크 (C/C++)  (0) 2022.03.16
[BOJ] 17142 연구소 3 (C/C++)  (0) 2022.03.14
[BOJ] 11779 최소비용 구하기 2 (C/C++)  (0) 2022.03.13
[BOJ] 1967 트리의 지름 (C/C++)  (0) 2022.03.12