Algorithm/SW Expert Academy

0305_SW 2819번 : 숫자 이어 붙이기

728x90
반응형

출처 : 소프트웨어 엑스퍼트 아카데미 2819번 문제

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV7I5fgqEogDFAXB&categoryId=AV7I5fgqEogDFAXB&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

#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:
        n_lst.append(res)
        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 = [-1100]
    dy = [00-11]
    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 = [-1100]
    dy = [00-11]
 
    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:
                    result.add(num)
                else:
                    for k in range(4):
                        nx, ny = x+dx[k], y+dy[k]
                        if 0<= nx < 4 and 0<= ny < 4:
                            stack.append((nx,ny,cnt+1,arr[nx][ny]+num))
    print('#{} {}'.format(t,len(result)))
반응형