728x90
반응형
출처 : 소프트웨어 엑스퍼트 아카데미 2819번 문제
#1차 시도 : DFS 재귀함수 이용해 델타 값으로 이동하며 7자리 수 만들기
- FOR문으로 2차원 배열의 모든 점을 시작점으로 재귀함수 시작하기
- 처음에는 배열 입력 받을 때 int값으로 받았지만, 7자리 수들을 결과 리스트 안에 하나씩 넣어주기 위해 나중에 str으로 변환했음 ( 처음부터 스트링으로 받는 것도 방법)
- 결과 리스트 안에 중복된 7자리 수를 없애기 위해, FOR문 not in으로 중복 값을 결과 리스트에 넣지 않을 수도 있지만 set()함수를 통해 중복값을 없애는 게 효율적
- 다만 7자리 숫자를 만들기 위해 재귀를 여러번 돌리기 때문에 시간은 비효율적
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
def dfs(idx,r,c,res):
res += str(arr[r][c])
if idx == 6:
return
for i in range(4):
if 0 <= r+dx[i] < 4 and 0 <= c+dy[i] < 4:
dfs(idx+1, r+dx[i], c+dy[i], res)
for t in range(1,int(input())+1):
arr = [list(map(int,input().split())) for _ in range(4)]
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
n_lst = []
for i in range(4):
for j in range(4):
s_x = i
s_y = j
dfs(0,s_x,s_y,'')
result = set(n_lst)
print(f'#{t} {len(result)}'함
|
# 2차 시도 : 재귀함수를 쓰니까 시간이 비효율적인 거 같아 stack 활용한 DFS로 풀었는데, 연산시간이 절반으로 줄었다.
- 배열 입력 받을 때 문자열로 숫자들을 저장했고, stack 안에 튜플 형태로 변수값들을 넣어주었다. DFS가 조금씩 익숙해지는 것 같다.
- 결과 리스트를 바로 set() 형태로 바꿔줬기 때문에, 결과 리스트 안에 숫자를 추가할 때는 append가 아닌 add 함수 썼다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
for t in range(1,int(input())+1):
#배열에서 int가 아닌 str 형태로 입력받기
arr = [input().split() for _ in range(4)]
result = set()
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
for i in range(4):
for j in range(4):
stack = [(i,j,0,arr[i][j])]
while stack:
x, y, cnt, num = stack.pop()
if cnt == 6:
else:
for k in range(4):
nx, ny = x+dx[k], y+dy[k]
if 0<= nx < 4 and 0<= ny < 4:
print('#{} {}'.format(t,len(result)))
|
반응형
'Algorithm > SW Expert Academy' 카테고리의 다른 글
0303_SW 1861번 : 정사각형 방 (0) | 2020.03.03 |
---|---|
0227_ 오늘도 고생했다 .. SW 1258번 : 행렬찾기 (0) | 2020.02.28 |