새소식

Algorithm/파이썬 알고리즘 문제풀이 강의

[탐색 & 시뮬레이션] 3. 카드 역배치

  • -

1. 문제

 

2. 내 알고리즘 및 풀이

 

알고리즘

1. card_list에 1부터 20까지 값을 넣는다 (이 때, 조건을 만족하기 위해 index가 0이 아니라 1부터 시작하도록 한다)
2. range_list 빈 배열을 선언한다. range_list 자리에는 내가 입력하는 10개의 범위 case가 튜플로 들어간다.
3. current_interval을 선언한다. currnet_interval은, range_list에서 각각의 room에 위치한 현재 튜플을 나타낸다.
4. 임시 변수 tmp를 선언한다.

5. 10번 for문을 돈다. map함수를 이용하여, 띄어쓰기로 입력 받은 값을 int형으로 변환한다. 두 값을 띄어쓰기로 입력받고, 각각을 start와 end에 매핑시켜서 저장한다.
6.start와 end에 들어온 값을 튜플화하여 interval 변수에 저장한다.
7. 튜플 값(범위)을 저장하기 위해 2에서 선언했던 range_list리스트에 append한다

8. 리스트의 길이만큼 for문을 돈다.
9. current_interval변수에 현재의 range_list에 들어있는 튜플값을 넣는다.
10. 튜플의 0번째원소(왼쪽)을 start_value에 넣고, 튜플의 1번째원소(오른쪽)을 end_value에 넣는다.
11. 나와 대칭되는 위치의 카드를 바꾸기 위해, for문을 몇번 돌아야 될지 생각한 알고리즘을 num 변수로 표현하였다. 범위가 짝수인 경우와, 홀수인 경우를 나누어서 구현했지만, //2연산자에서는 몫만 얻어지므로, 구분하는 것이 무의미하다는 것을 깨달았다.

12. for문을 돌면서, 대칭되는 위치의 카드 값을 바꾸었다. 이 때 tmp라는 임시변수를 활용하였다.
13. 바꾸는 작업이 끝나면, 대칭점을 기준으로 왼쪽의 경우(start_value) 1을 증가시켰고, 대칭점을 기준으로 오른쪽의 경우(end_value) 1을 감소시켰다.
14. 출력 

코드

card_list = [None] + list(range(1,21))
range_list = []
current_interval = 0

tmp = 0


for i in range(10):
    start,end = map(int,input().split())
    interval = (start,end) #튜플에 저장
    range_list.append(interval) #이제, range_list 안에는, 범위(구간)을 나타내는 10개의 튜플이 들어있다. (0번 방~9번 방)
  

for i in range(len(range_list)): #10번 돌겠지..? 튜플이 10개 있으니까
    currnet_interval = range_list[i] #튜플을 하나씩 꺼내서, currnet_interval에 대입 #(3,5) 
    start_value = currnet_interval[0] #3
    end_value = currnet_interval[1] #5
    num = ((end_value - start_value) + 1)//2
    for x in range(num): #구간 내 갯수만큼 순회
        tmp = card_list[start_value]
        card_list[start_value] = card_list[end_value]
        card_list[end_value] = tmp
        start_value +=1
        end_value -=1
  
    

for i in range(1, 21):
    print(card_list[i], end=' ')

 

 

3. 강의 풀이

for문을 돌면서 구간을 하나씩 돌면서 구간의 값 뒤집어준다

 

언더바(_) : 변수가 없음을 의미 #i라고 하면, i=0,1,2..가 대입되지만, 변수에 값을 대입하는 시간도 줄이고 싶을 때, 언더바 사용

 # ((end - start) + 1 )//2 바퀴를 돌면 됨! (몫만큼 돌게 하기 때문에, 구간의 갯수가 짝수건 홀수건 차이 없다.)

 

a=list(range(21)) #0부터 20까지의 숫자가 자동으로 리스트화 #인덱스 번호도 0부터
for _ in range(10):
    s,e=map(int,input().split())
    for i in range((e-s+1)//2):
        a[s+i],a[e-i] = a[e-i],a[s+i] #swap
    a.pop


for x in a:
    print(x, end=' ')

 

4. 아 맞다

 

  • 파이썬에서의 swap은 아래와 같이 다이렉트로 할 수 있다. 

 

 

C++에서 값을 바꾸는 swap을 생각해서, 임시변수 tmp를 도입했는데, 파이썬에서는 그렇게 할 필요가 없었다는거..

 

  • 리스트에서, 원소만 띄어쓰기해서 출력하고 싶을 때 -> for문으로 리스트 원소 탐색한 후, ' '기준으로 변수 출력

for x in a:
    print(x, end=' ')

 

5. 새롭게 알게된 점

 

  • index가 1부터 시작하는 배열
card_list = [None] + list(range(1,21))
  •  언더바(_) : 변수가 없음을 의미 #i라고 하면, i=0,1,2..가 대입되지만, 변수에 값을 대입하는 시간도 줄이고 싶을 때, 언더바 사용

 

 

  • 튜플 값을 하나씩 꺼내고 싶을 때
 currnet_interval = range_list[i] #튜플을 하나씩 꺼내서, currnet_interval에 대입 #(3,5) 
    start_value = currnet_interval[0] #3
    end_value = currnet_interval[1] #5

 

 

  • 리스트에서, 가장 뒤의(오른쪽)원소 제외하고 출력하고 싶을 때 => pop()매서드!

 

  • 리스트에서, 가장 앞의(쪽)원소 제외하고 출력하고 싶을 때 => pop(0) : 0번 인덱스에 있는 것을 pop해라!

   (출력 시, 앞에 0만 제거해주고 싶을 때) 

 

 

5. 반성한 점

강의에서는 매우매우 간단하게 풀이하였지만, 내 코드는 너어무 길다.

swpa같은 기본적인거 생각하지 못한 탓이 아닐까 쉽다.

 

나는 자리 change에서 매우 복잡했는데, 강의에서는 단지 index만 조금 조정하여서, 결과를 얻었다.

6. 요약

 

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.