[boj][python] 2210 숫자판 점프

ppparkta·2022년 12월 18일
1

Problem solving

목록 보기
54/65

2210 숫자판 점프

오랜만에 올리는 ps리뷰

오전에 pccp로 탈탈 털리고 dfs문제에 화풀이했다.

DFS에 dx,dy로 사방향 이동을 적용시켜야 하는데 이 부분은 다른 사람의 풀이를 참고했다. 파이썬의 for문에 익숙해져서 cpp로 for문 작성할 때 괄호를 빼먹게 된다.

arr = []
for _ in range(5):
    arr.append(list(map(int, input().split())))

이 부분은 한 줄로 줄일 수 있다.

arr = [list(map(int, input().split())) for _ in range(5)]

이렇게 줄이면 더 간단하지만 바로 쓸 정도로 적응하려면 연습이 더 필요할 것 같다.

dfs의 리턴 조건을 어떻게 줄까 하다가, 문자열 길이로 처리하기로 했다. 항상 6자리가 답이므로 6자리일 때 리턴하게 했다.

만들어진 문자열은 set으로 저장해서 출력할 때 여러번 값이 나와도 한번만 처리하게 했다.

사방향의 좌표를 구해서 그 좌표가 표 범위 내라면 재귀하도록 했다.

<python>

arr = []
for _ in range(5):
    arr.append(list(map(int, input().split())))
ans = set()
d = [(0, 1), (0, -1), (1, 0), (-1, 0)]


def dfs(y, x, s):
    s += str(arr[y][x])
    if len(s) == 6:
        ans.add(s)
        return
    for dx, dy in d:
        ny = dy+y
        nx = dx+x
        if 0 <= ny < 5 and 0 <= nx < 5:
            dfs(ny, nx, s)


for i in range(5):
    for j in range(5):
        dfs(i, j, "")

print(len(ans))

<c++>

#include <iostream>
#include <unordered_map>
using namespace std;

char arr[5][5];
int dx[4] = { 1, -1, 0, 0 };
int dy[4] = { 0, 0, 1, -1 };
unordered_map<string, int> ans;

void dfs(int y, int x, string s)
{
	s += arr[y][x];
	if (s.length() == 6)
	{
		ans[s] = 1;
		return;
	}
	for (int i = 0; i < 4; i++)
	{
		int nx = dx[i] + x;
		int ny = dy[i] + y;
		if ((0 <= nx && nx < 5) && (0 <= ny && ny < 5))
			dfs(ny, nx, s);
	}
}

int main()
{
	for (int i = 0; i < 5; i++)
		for (int j = 0; j < 5; j++)
			cin >> arr[i][j];

	for (int i = 0; i < 5; i++)
		for (int j = 0; j < 5; j++)
			dfs(i, j, "");
	cout << ans.size()<< endl;
}

2022 하반기 목표 달성

하반기에는 스트릭프리즈 안 쓰고 100연속 스트릭 달성하겠다고 다짐했는데 성공했다. 실력이 기대만큼 늘었는지는 모르겠다. 그래도 다른 공부 하면서 조금씩 꾸준히 했던 나를 칭찬하고 싶다. 100일(훨씬 넘는) 동안의 여정 고생했음!ㅋㅋ

profile
겉촉속촉

0개의 댓글