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