SWEA

[D3] SWEA 1244. [S/W 문제해결 응용] 2일차 - 최대 상금

코테봇 2024. 5. 1. 12:01

1. 접근 방식

SWEA에서 처음으로 풀어보는 DFS 문제 같다.

숫자를 요리조리 옮기고 관찰해봤으나

어떠한 규칙성도 발견되지 않았다.

그래서, DFS로 접근하기로 했다. 

2. 디테일한 구현

dfs(cnt) -> cnt= 교환 횟수

1) 재귀 함수의 종료 조건

-> 교환 횟수를 다 채웠을 때

 

2) 교환하는 방법

arr[i],arr[j]=arr[j],arr[i]

dfs(cnt+1)

arr[j],arr[i]=arr[i],arr[j]

->돌려놨으면 다시 복구 시켜야한다.

왜냐하면, 다음 줄기에서는 특정 하나의 문자열을 가지고

이중 for문을 계속 도는 형태이여하기 때문이다.

이건 말로 설명하기 어려운데 그림을 그려보면 이해가 갈 것이다.

결국 재귀란 시스템도 규칙과 반복성이다.

 

3. 코드 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
def dfs(cnt):
    global res
    if cnt==k:
        tmp=''
        for x in arr:
            tmp+=str(x)
       
        if res<int(tmp):
            res=int(tmp)
        return
 
    else:
        for i in range(len(arr)-1):
            for j in range(i+1,len(arr)):
                    arr[i],arr[j]=arr[j],arr[i]
                    tmp=''.join(map(str,arr))
                    if (tmp,cnt) not in ch:
                        ch.append((tmp,cnt))
                        dfs(cnt+1)
                    arr[j],arr[i]=arr[i],arr[j]
 
 
 
 
if __name__=='__main__':
    sys.stdin=open('input2.txt','r')   
    
    
    test_case=int(input()) ## 총 테스트 케이스 개수
   
    for tc in range(test_case):
       s,k=map(str,input().split())
 
       arr=list(map(int,s)) ##문자열
       std=arr[:]
       k=int(k) ##교환 횟수
       res=-1
       ch=[]
       dfs(0)  
       print(f'#{tc+1} {res}')
 
cs

 

 

 

4. 깨달은 점 및 반성

풀이에 성공했으나,

역시나 어려운 것 같다.

그림을 많이 그려보자.