구현

minjun kim·2024년 4월 17일

구현 : 시뮬레이션과 완전 탐색.

구현(implementation)

구현이란, 머릿속에 있는 알고리즘을 소스코드로 바꾸는 과정입니다.

흔히 알고리즘 대회에서 구현 문제란 ?

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

완전탐색 : 모든 경우의 수를 주저 없이 다 계산하는 해결 방법
시뮬레이션 : 문제에서 제시한 알고리즘을 한 단계씩 차례대로 직접 수행

구현 예시

  • 알고리즘은 간단한데 코드가 지나칠 만큼 길어지는 문제
  • 실수 연산을 다루고, 특정 소수점 자리까지 출력해야 하는 문제
  • 문자열을 특정한 기준에 따라서 끊어 처리해야 하는 문제
  • 적절한 라이브러리를 찾아서 사용해야 하는 문제

일반적으로 알고리즘 문제에서의 2차원 공간은 행렬(Matrix)의 의미로 사용된다.

  • 시뮬레이션 및 완전 탐색 문제에서는 2차원 공간에서의 방향 벡터가 자주 활용된다.

    예제1) 상하좌우

    요구사항대로 충실히 풀면된다.
    일련의 명령에따라 개체를 차례대로 이동시킨다는 점에서 시뮬레이션 유형으로도 분류되고, 구현이 중요한 대표적인 문제 유형이다.
  • 코딩 테스트에서의 시뮬레이션 유형, 구현, 유형, 완전탐색 유형은 서로 유사한 점이 많다는 정도로만 기억하자.
n = int(input())
ns = list(input().split())

dx = [0,0,-1,1]
dy =  [1,-1,0,0]
data =  ["R","L","U","D"]
x,y = 0, 0

for n in ns:
    for i in range(len(data)):
        if ns == data[i]:
            nx = x + dx[i]
            ny = y + dy[i]
    
    if nx < 0 or nx >= n or ny < 0 or ny >= n:
        continue
    
    x,y = nx,ny
    
print(x+1,y+1)            

예제2) 시각

  • 가능한 모든 시각의 경우를 하나씩 모두 세서 풀 수 있는 문제

  • 하루는 86,400초이므로, 00시 00분 00초 부터 23시 59분 59초 까지의 모든 경우는 86,400가지 이다.
    python은 1초에 2천만번 계산함.

  • 따라서 단순히 시각을 1씩 증가하며 3이 포함 확인

  • 이러한 유형은 완전탐색(Brute Forcing) 문제 유형이라고 한다.
    가능한 경우의 수를 모두 검사해보는 탐색 방법을 의미.

h = int(input())

cnt = 0

for i in range(h+1):
    for j in range(60):
        for k in range(60):
            if '3' in str(i) + str(j) + str(k):
                cnt += 1
                
print(cnt)

예제3) 왕실의 나이트

전형적인 시뮬레이션 완탐 2차원 좌표를 이용하는 구현 문제이다.

  • 요구사항대로 충실히 구현
  • 나이트의 8가지 경로를 하나씩 확인하며 각 위치로 이동이 가능한지 확인한다.
  • 리스트를 이용하여 8가지 방향에 대 한 방향 벡터를 정의한다.

n = input()
t = ['a','b','c','d','e','f','g','h']

x = int(n[1]) - 1
y = n[0]

for i in range(len(t)):
    if y == t[i]:
        y = i
        

dx = [2,-2,1,-1,2,-2,1,-1]
dy = [1,1,2,2,-1,-1,-2,-2]

cnt = 0
for i in range(8):
    nx = x + dx[i]
    ny = y + dy[i]
    
    if nx < 0 or nx >= 8 or ny < 0 or ny >= 8:
        continue
    else:
        cnt += 1
print(cnt)
    

단순히 t배열을 선언해서 값을 할당 받았었는데

ord(n[0]) - ord('a') 

을 통해 해당값을 바로 가져오는 방법이 있다.

또한 dx,dy로 두배열을 선언해서 가져오는 방법만을 고수 했는데 튜플로도 가져올수 있다는 것을 인지하자.

예제4) 문자열 재정렬

수 = 정수를 의미 ex) 100 ,2200 , 700
숫자 = 0~9

요구사항대로 충실히 구현하면 되는 문제
문자열이 입력되었을 때 문자를 하나씩 확인한다.

  • 숫자인 경우 따로 합계 계산
  • 알파벳의 경우 별도의 리스트에 저장

결과적으로 리스트에 저장된 알파벳은 정렬해 출력하고, 합계를 뒤에 붙여 출력하면 정답.

data = input()
res = []
cnt = 0

for i in data:
    if i.isalpha():
        res.append(i)
    else:
        cnt += int(i)
        
res.sort()

print("".join(res) + str(cnt))

isalpha를 몰라서 배열로 다선언하거나 숫자를 제거해야하나라고 생각했었는데, 좋은 방법이 있었다.

profile
배움의 흔적을 남기고 싶습니다.

0개의 댓글