이번 문제는 ‘프로그래머스’사이트의 레벨 1 코딩 테스트 문제입니다. 레벨 1이라 해서 쉬운 문제라고 생각할 수 있겠지만 저는 ‘이 문제가 과연 진짜 레벨 1일까?’라는 생각이 듭니다. 실제로 저는 이 문제를 푸는데 제일 많은 시간이 걸렸고 에러를 찾기 위해 몇 시간 동안 이것만 보고 있기도 했습니다. 그래서 블로그 글을 쓰는데까지 오랜 시간이 걸려 이제 글을 씁니다. board라는 변수 안에 2차원 배열로 값들이 들어 있습니다. 이 값들을 moves라는 리스트 안에 있는 값들 기준으로 세로줄로 내려가는 형식으로 0이 아닌 값일 경우(0은 아무것도 없다는 뜻), 그 값들을 뽑습니다. 그 후 그 자리는 0으로 채웁니다. 뽑아놓은 값들을 순서대로 놓았을 때 똑같은 값이 붙을 경우, 그 두 값을 모두 없앱니다. 이 과정에서 사라진 값들은 몇 개인지 구하는 문제입니다. 쉽게 말해 board[a][b]라는 값이 있으면 b개의 값들이 있고 이런 형식의 값들이 a줄이 있다는 것과 같습니다. 이런 표가 있다고 생각할 때 moves의 값이 세로를 기준으로 moves의 값 번째 줄로 내려가 0이 아닌 다른 값(0은 아무것도 없다는 뜻)이 있으면 그 값을 가져오게 만듭니다. 단, 세로줄이 모두 0일 경우 아무 일도 일어나지 않고 다음 moves값을 실행시켜야 합니다. 이 과정에서 나온 값들을 순서대로 나열하고 같은 값이 붙으면 둘 다 없애면 되는 문제입니다.
저는 먼저 board라는 값들의 위치를 알기 위해 줄의 개수는 j로 잡았고 그 각각의 줄들의 값들의 개수는 i로 잡았습니다. 또 꺼낸 값들은 a와 num에 넣었습니다. 여기서 왜 a와 num에 둘 다 꺼낸 값을 넣냐는 의문이 드실 겁니다. 저는 꺼낸 값들의 개수에서 나중에 겹치는 값들을 없앤 값들의 개수를 빼서 빠진 값들의 개수를 찾았습니다. 그래서 처음부터 2개의 배열을 만들었습니다. 먼저 사진1을 보면 while을 사용하여 num이라는 배열의 개수가 moves배열의 개수보다 작거나 같을 때까지 돌아가게 만들었습니다. 그럼 num의 개수가 moves의 개수보다 클 경우가 없어 에러가 일어날 일이 없습니다. 그 후 if를 사용하여 i의 값이 moves의 개수-1보다 작거나 같을 경우를 만들었습니다. 여기서 moves에서 -1을 하는 이유는 i가 배열에서 가로를 기준으로 0으로 시작해 몇 번째인지를 뜻하는 값입니다. 그래서 moves의 개수에서 -1을 해줘야 moves의 값들을 다 쓰고 초과하는 일이 없습니다. 여기서 i의 값이 moves의 값들을 다 쓰고 더 필요로 할 때(i가 moves-1의 값을 초과할 경우)는 break을 이용하여 while을 멈추게 하였습니다. 이제부터 본격적으로 값들을 뽑아 num과 a에 넣을 것입니다. 아까도 말했지만, moves의 값에서 -1을 해주는 이유는 배열은 0번째부터 시작하기 때문에 순서를 찾을 때는 -1을 해주어야 하기 때문입니다. 그래서 board[j][moves[i]-1]는 board의 값을 찾기 위한 부분입니다. 여기서 j번째 줄 moves[i]-1번째 값이 0일 경우 다음 줄로 넘어가기 위해 j에 +1을 해줍니다. 그 부분이 j+=1입니다. 하지만 board[j][moves[i]-1]이 0이 아닐 경우에는 append를 사용하여 a와 num에 0이 아닌 값을 넣고 board[j][moves[i]-1]=0을 사용하여 그 부분을 0값으로 바꿨습니다. 그 후 다음 moves의 값을 실행하기 위해서 i+=1과 j=0을 사용하였습니다. 그럼 모든 줄이 0일 경우를 생각해야 합니다. 그 부분은 12번째 줄로 2차원 배열에 len을 사용할 경우 모든 값의 개수를 찾는 것이 아니고 배열의 개수를 찾기 때문에 j의 값과 값을 경우(모든 값이 0일 경우), 다음 i의 값을 찾게끔 만들었습니다. 그러기 위해서 i+=1과 j=0을 사용하였습니다. 여기까지 a와 num의 값을 넣는 것까지 완성이 되었습니다. 이제 num의 값들이 같은 값끼리 붙어있을 경우, 두 값을 없애는 작업을 할 겁니다. 그전에 i의 값을 초기화합니다. if를 사용하여 i가 num의 개수-1전까지 while이 돌아가게끔 만들었습니다. num의 개수에 -1을 해주는 이유는 아까 moves에 -1을 해주는 이유와 같습니다. 먼저 num의 i번째 수가 i+1번째 수와 같을 경우 num의 i번째 수를 del을 사용하여 제거합니다. del은 부분을 제거하고 뒤에 있던 부분을 앞으로 당기는 형식으로 num의 i번째 수를 한 번 더 빼면 똑같은 수를 다 제거할 수 있습니다. 만약 num의 i번째 값과 i+1번째 값이 같지 않을 경우, i에 1을 더해(i+=1) 다음번째들의 값들이 같은지 확인하였습니다. 여기까지 num에 값까지 완벽하게 구했습니다. 이제 a의 개수에서 num의 개수를 빼면 사라진 값들의 수가 나옵니다. 그것을 answer에 넣으면 끝입니다.