코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
체크판위에서 2
입출력 예제
입력
5 5
W W W W W
W W W W W
W B W W W
W W W W W
W W W W B
출력
2
문제
R * C 크기인 직사각형의 각 칸이 W, B로 표현되어 있습니다. W는 하얀색으로, B는 검은색으로 칸이 채워져 있는것을 뜻합니다. 왼쪽 상단에서 출발하여 우측 하단으로 이동할 때, 특정 룰을 만족하면서 이동에 성공할 수 있는 경우의 수를 구하는 프로그램을 작성해보세요. 아래가 특정 룰입니다.
- 이동은 항상 점프를 통해서만 가능합니다. 또, 점프 진행시 항상 현재 위치에 적혀있는 색과, 점프한 이후의 칸에 적혀있는 색이 달라야만 합니다.
- 점프 진행시 현재 위치에서 적어도 한칸 이상 오른쪽에 있는 위치이며 동시에 현재 위치에서 적어도 한칸 이상 아래쪽에 있는 위치인 곳으로만 점프가 가능합니다.
- 정확히 시작, 도착 지점을 제외하고 점프하며 도달한 위치가 정확히 2곳 뿐이어야 합니다.
우선 문제를 읽었을때 R이 세로 C가 가로이므로 R은 행의 수 C는 열의 수이다.
1. 이를 우선적으로 공백으로 입력 받는다. : R, C = tuple(map(int, input().split())
2. 격자판을 만들기 위해 2차원 배열을 입력 받는다 : arr = [ input().split() for _ in range(R) ]
- 공백으로 잘라서 한 줄 입력받고 이를 R행 반복해서 배열에 담는다.
3. 이동은 점프로만 가능한데 점프시 색이 달라져야한다. 인덱스 (0,0) 칸에서 시작해서 (R-1, C-1) 로 도착하여야한다. / 점프 시 오른쪽과 아래쪽에 위치하여야한다. 만약 내 위치가 (i, j) 라면 행의 수가 커지고 열의 수가 커져야 한다. i+1부터 행 순회 j+1부터 열 순회해야함 /
정확히 시작, 도착 지점을 제외하고 점프하며 도달한 위치가 2곳뿐이어야한다.
4. 따라서 처음 순회는 내 위치이다. 주의할 점은 (0,0)은 이미 밟았음을 가정하므로
for i in range(1, R):
for j in range(1, C):
로 인덱스 (1,1)부터 밟아야한다.
내가 다음 뛸 수 있는 곳을 또 탐색한다.
for k in range(i+1, R-1):
for l in range(j+1, C-1):
를 통해 순회한다. 행 열 둘다 현재 위치보다 더 크게 순회해야하므로 i+1, j+1 부터로 각각 인덱스 설정을 한다. 마지막으로 뛸 곳은 arr[R-1][C-1] 이어야하므로 이는 제외한다.
다음은 조건에 맞게 확인하는 것이다.
arr[0][0] != arr[i][j] 이면서 arr[i][j] != arr[k][l] 이면서 arr[R-1][C-1] != arr[k][l] 이여야한다
이것은 (0,0) 에서 출발해서 (R-1, C-1) 로 도착해야하는데 두번의 경유지를 지나야하는데 이때 행수는 늘어나고 열수도 늘어나는 곳으로만 이동할 수 있다. 또 같은 색으로는 뛸 수 없다. 같은 색이 아닌 조건에 맞는 수를 카운트해준다.
코드
R, C = tuple(map(int, input().split()))
grid = [
list(input().split())
for _ in range(R)
]
cnt = 0
for i in range(1, R):
for j in range(1, C):
for k in range(i + 1, R - 1):
for l in range(j + 1, C - 1):
if grid[0][0] != grid[i][j] and \
grid[i][j] != grid[k][l] and \
grid[k][l] != grid[R - 1][C - 1]:
cnt += 1
print(cnt)
알게된 사실 :
1. 2차원배열 선언할 때
arr = [ list(input().split()) for _ in range(R) ] 로 처음에 리스트를 만들고 이를 반복하는 방식으로 했는데 리스트 안써줘도 됨
arr = [ input().split() for _ in range(R) ] 로만 써도 된다.
'코드트리 챌린지' 카테고리의 다른 글
[코드트리] 원 모양으로 되어있는 방 / 완전탐색 (0) | 2023.09.26 |
---|---|
[코드트리] 이상한 진수 2 /완전탐색, 이진수to십진수 (0) | 2023.09.26 |
[코드트리] 일렬로 서있는 소 2 / 완전탐색, 1차원배열 (0) | 2023.09.25 |
[코드트리 챌린지] 3주차 실력진단 + 푼 문제들 정리 / 완전탐색, 2차원배열 (0) | 2023.09.20 |
[코드트리] 시간, 공간복잡도 / 기호 변환, (0) | 2023.09.20 |