[알고리즘, #3] 1주차 과제

권필제·2020년 11월 25일
0

알고리즘

목록 보기
3/15

1. 과제 설명

① 소수 찾기

- 문제: 정수를 입력 했을 때, 그 정수 이하의 소수를 모두 반환하기

▶ 소수란? 자신보다 작은 두 개의 자연수를 곱하여 만들 수 없는 1보다 큰 자연수를 의미함

② 동일 숫자 만들기

- 문제: 주어진 숫자열을 모두 0 혹은 모두 1로 같게 만드는 최소 횟수 구하기

2. 문제 풀이

① 소수 찾기

- 큰 그림: 주어진 숫자보다 작은 자연수를 array에 할당한 후, 각 자연수보다 작은 자연수로 나누었을 때 나머지가 0일 경우 제외하기

- 예시:

1) 입력값: 10
2) array만들기: [1,2,3, ..., 9,10]
3) 4의 경우, 4보다 작은 수(2,3)으로 나누어 0이 된다면 탈락시키기

-슈도코드:

# 입력값 선언
input = 150

# 함수 선언
	# array 만들기

	# input 이하의 자연수로 array 채우기(for)
    
	# 결과를 담을 list 선언하기
	# array의 각 자리에 접근하기(for)
   	
	# array의 담긴 수가 1이라면 담긴 수를 0으로 대체하기(if)
    
	# array의 담긴 수가 2 또는 3이라면 그냥 지나가기(elif, continue)
    
	# array의 담긴 수가 4 이상이라면(else)
		# array의 담긴 수보다 작고 2보다 큰 수로 나눈 나머지가 0이라면 빠져나오기(if, break)
		# 그렇지 않으면 결과에 첨부하기(.append)
# 결과 반환하기

-시간 복잡도: O(N)

② 동일 숫자 만들기

- 큰 그림: 연속하는 자리 수를 비교할 때, 이전과 다른 숫자가 나오면 기록하고, 그 결과를 기록하여 중복된 개수가 가장 적은 것을 선택하기

- 예시:

1) 입력값: 010010
2) 이전과 다른 숫자가 나오면 기록하기: 0, 1, 0, 1, 0
3) 결과에서 중복된 개수 찾기: 0= 3개, 1=2개
4) 가장 적은 것: 2개
5) 각 자리에 있는 1을 2번 뒤집으면 최소한의 기회로 동일한 숫자를 만들 수 있음

-슈도코드:

# 입력값 선언

# 함수 선언

    # 결과 array 선언
	
    # 입력값을 하나하나 돌아다니며 
    # 입력값 자리 index가 0이면 입력값 결과 array에 0번째 숫자 넣기
    # 입력값 자리 index가 0이 아니면, 
    	# 만약 결과 array의 마지막 수와 현재 입력값의 자리 수가 같다면 지나치고(continue)
        # 그렇지 않다면 결과 array에 현재 입력값의 자리수를 추가하라(.append)
    
    # 결과 array의 중복 개수 출력하기(key:value)
    # 오름차순으로 정렬하기
    # 가장 적은 숫자 출력하기

-시간 복잡도: O(N)

3. 배운 점

① 큰 그림, 전략, 슈도코딩:

코딩하는 시간보다 문제 해결을 위한 큰 그림, 문제 해결 전략 형성, 슈도 코드 만드는데 더 오랜 시간이 걸린다. 하지만 결과적으로, 최소의 시간으로 문제를 해결하는 유일한 방법일 것이다.

② .append

list.append('a')를 사용하면 list에 'a'가 추가된다.
이 때 주의해야 할 점은 list = list.append('a')로 작성하면 에러가 발생한다는 것이다.
자칫 헷갈려 위와 같이 작성할 수 있고, 문제가 무엇인지 인지하지 못할 가능성이 있다. 위와 같이 작성하여 1시간을 헤메었다. 시행착오라고 생각하고 다음부터는 꼭 기억하고 사용하자.

③ break

for i in range(10)
	if i == 1:
   	   break

위와 같이 사용할 경우 if문에서 탈출할까? 아니면 for문을 탈출할까? 정답은 for문을 탈출한다. 그러므로 break가 실현되면 for문은 더이상 돌지 않는다.

profile
몰입하는자

0개의 댓글