관리 메뉴

HeeJ's

[02] 구현(Implementation) 본문

<Algorithm>_study

[02] 구현(Implementation)

meow00 2021. 10. 12. 18:53

구현

머릿속에 있는 알고리즘을 소스코드로 바꾸는 과정

원하는 풀이과정을 원하는 프로그래밍 언어로 정확히 구현해낼 수 있어야 함.

 

모든 알고리즘 문제를 '구현'해야하기 때문에,

주로 구현 문제로 정의되는 것은

풀이를 떠올리는 것은 쉽지만 소스코드로 옮기기 어려운 문제들을 의미한다.

 

구현하기 어려운 문제 예시

1. 알고리즘은 간단한데 코드가 길어지는 문제

2. 특정 소수점 자리까지 출력해야하는 문제

3. 문자열이 입력으로 주어졌을 때 한 문자 단위로 끊어서 리스트에 넣어야하는(파싱 하는) 문제 등

 

=> 프로그래밍 문법을 정확하게 숙지하거나, 라이브러리 사용 경험이 충분해야한다.

 

+ 완전 탐색(모든 경우의 수를 주저 없이 다 계산하는 해결 방법),

시뮬레이션(문제에서 제시한 알고리즘을 한 단계씩 차례대로 직접 수행) 도 구현이 핵심이 되는 경우가 많다.

 

 

구현 알고리즘의 대표적인 문제들

 

1. 상하좌우

여행가 A는 N X N 크기의 정사각형 공간 위에 서있다. 이 공간은 1 X 1 크기의 정사각졍으로 나누어져있다. 가장 왼쪽 위 좌표는 (1, 1)이며, 가장 오른쪽 아래 좌표는 (N, N)에 해당한다. 여행가 A는 상, 하, 좌, 우 방향으로 이동할 수 있으며, 시작 좌표는 항상 (1, 1)이다. 우리 앞에는 여행가 A가 이동할 계획이 적힌 계획서가 놓여있다.

계획서에는 하나의 줄에 띄어쓰기를 기준으로 하여 L, R, U, D 중 하나의 문자가 반복적으로 적혀있다. 각 문자의 의미는 다음과 같다.

L : 왼쪽으로 한 칸 이동

R : 오른쪽으로 한 칸 이동

U : 위로 한 칸 이동

D : 아래로 한 칸 이동

이때 여행가 A가 N X N 크기의 정사각형 공간을 벗어나는 움직임은 무시된다. 예를 들어 (1, 1)의 위치에서 L 혹은 U를 만나면 무시된다.

계획서가 주어졌을 때 여행가 A가 최종적으로 도착할 지점의 좌표를 출력하는 프로그램을 작성하시오.

 

[입력 조건]

첫째 줄에 공간의 크기를 나타내는 N이 주어진다.(1 <= N <= 100)

둘째 줄에 여행가 A가 이동할 계획서 내용이 주어진다. (1 <= 이동 횟수 <= 100)

[출력 조건]

첫째 줄에 여행가 A가 최종적으로 도착할 지점의 좌표 (X, Y)를 공백으로 구분하여 출력한다.

 

답안 예시

# N을 입력받기
n = int(input())
x, y = 1, 1
plans = input().split()

# L, R, U, D에 따른 이동 방향
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
move_types = ['L', 'R', 'U', 'D']

# 이동 계획을 하나씩 확인
for plan in plans :
	# 이동 후 좌표 구하기
    for i in range(len(move_types)):
    	if plan == move_types[i]:
        	nx = x + dx[i]
            ny = y + dy[i]
        # 공간을 벗어나는 경우 무시
        if nx < 1 or ny < 1 or nx > n or ny > n:
        	continue
        # 이동 수행
        x, y = nx, ny

print(x, y)

 

2. 시각

정수 N이 입력되면 00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중에서 3이 하나라도 포함되는 모든 경우의 수를 구하는 프로그램을 작성하시오. 예를 들어 1을 입력했을 때 다음은 3이 하나라도 포함되어 있으므로 세어야 하는 시각이다.

00시 00분 03초

00시 13분 30초

반면에 다음은 3이 하나도 포함되어 있지 않으므로 세면 안되는 시각이다.

00시 02분 55초

01시 27분 45초

 

[입력 조건]

첫째 줄에 정수 N이 입력된다.

[출력 조건]

00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중에서 3이 하나라도 포함되는 모든 경우의 수를 출력한다.

 

문제 해설

이러한 유형은 완전 탐색 유형으로 분류되기도 한다.

(가능한 경우의 수를 모두 검사해보는 탐색 방법)

탐색해야 할 전체 데이터 수가 100만개 이하일 경우 완전 탐색을 사용하면 적절하다.

 

위의 문제는 매 시각을 문자열로 바꾼 다음 문자열에 '3'이 포함되었는지 검사한다.

즉, 00시 00분 00초부터 23시 59분 59초까지 1초씩 늘리며 시, 분, 초를 문자열 자료형으로 변환하여 합친다.

예를 들어 03시 20분 35초일 때를 확인한다면, ㅇ;를 '032035'로 만들어서 '3'이 '032035'에 포함되었는지 체크하는 방식을 이용한다.

 

답안 예시

# H를 입력받기
h = int(input())

count = 0
for i in range(h+1):
	for j in range(60):
    	for k in range(60):
        # 매 시각 안에 '3'이 포함되어 있다면 카운트 증가
        	if '3' in str(i) + str(j) + str(k):
            	count += 1

print(count)

'<Algorithm>_study' 카테고리의 다른 글

[06] 동적 프로그래밍  (0) 2021.11.28
[05] 이진 탐색  (0) 2021.11.17
[4] 정렬  (0) 2021.11.09
[03] DFS/BFS  (0) 2021.11.03
[01] 그리디 (greedy) 알고리즘  (0) 2021.10.06