https://www.acmicpc.net/problem/1285
이 문제는.. 코드 답안만 봐서는 정말로 헷갈리는 문제였고,
직접 풀어보고 이해할 수 있었다.
문제의 접근방법은,
행이나 열 중 하나를 선택해서 뒤집을 수 있는 모든 경우의 수를 먼저 수행한다.(18번째 줄, 2^n의 경우의 수 발생)
나는 열을 뒤집는 모든 경우의 수를 수행하는 것을 선택했다.
열을 뒤집는 경우의 수는 k 값으로 선택됐으니, 그안에서 각 행마다(21~32번줄) 뒤집을지 말지(35번줄)를 선택하면 된다.
각 행에서는 첫번째 index열 ~ 마지막 index열을 확인하면서(24~32줄)
k 값에 따라 뒤집는 경우에 해당하는 열은 반전시킨다.(26번줄)
여기서 중요한점은 동전뒤집기를 할때 구하고자 하는 값은 뒷면의 개수이기 때문에 진짜 뒤집을 필요가 없다는 것이다.
뒤집어진 열이라면, 반전된 값으로 뒷면인지 아닌지 확인하여 카운트를 해주면 되고,
행을 뒤집을지 말지 선택할때는 뒷면또는 앞면인 부분을 카운트 한 다음 최소값으로 적용해주면 된다.
이 문제를 풀 때, 행 또는 열을 모두 뒤집는 경우를 생각하는것까지는 접근했는데 위 소스코드를 보고 무진장 헷갈렸던 부분은 26번줄이었다.
막상 문제 풀면서 코드를 적다보면 알겠는데 눈으로만 봤을때 i값과 j값이 갑자기 헷갈리는 바람에...
a[i][j]인 경우 a[행][열] a[ㅡ][ㅣ] (이런 기본적인 것을ㅠㅠ...)
내 생각에 내가 헷갈렸던 부분은 k값을 for문으로 돌리면서 이미 열을 뒤집는 경우는 정해진 것인데 그 뒤집는 수행을 바로 하는 것이 아니라 26번줄에서 하나씩 하는것과, 행을 뒤집는 경우는 따로 한 것이 아니라 각 행에서 동전의 뒷면 또는 앞면을 카운트를 하고 최소값을 적용한다는 점에서 헷갈렸던거 같다.
for(int i=0; i<n; i++) 안에서 for(int j=0; j<n; j++) 갈때는 한 행씩(한 줄씩) j값이 0, 1, 2 열로 이동, j값에 따라 k값과 해당하는 값 하나씩 비교한다는 것은 잊지말자.
[JAVA] 백준 1557번 제곱ㄴㄴ (0) | 2022.04.14 |
---|---|
[JAVA] 백준 1016번 제곱ㄴㄴ수 (0) | 2022.04.14 |
[JAVA] 백준 1629번 곱셈 (0) | 2022.04.11 |
[JAVA] 백준 12872번 플레이리스트 (0) | 2022.04.11 |
[JAVA] 백준 1413번 박스 안의 열쇠 (0) | 2022.04.08 |