Skip to content

Latest commit

 

History

History
172 lines (154 loc) · 4.77 KB

File metadata and controls

172 lines (154 loc) · 4.77 KB

구현(Implementation)

  • 흔히 알고리즘 대회에서 구현 유형의 문제란
    • 풀이를 떠올리는 것은 쉽지만 소스코드로 옮기기 어려운 문제
  • 구현 유형의 예시
    • 알고리즘은 간단한데 코드가 지나칠 만큼 길어지는 문제
    • 실수 연산을 다루고, 특정 소수점 자리까지 출력해야 하는 문제
    • 문자열을 특정한 기준에 따라서 끊어 처리해야 하는 문제
    • 적절한 라이브러리를 찾아서 사용해야 하는 문제

델타 탐색(시뮬레이션)

  • 일반적으로 알고리즘 문제에서의 2차원 공간은 **행렬(Matrix)**의 의미로 사용
for i in range(5):
  for j in range(5):
    print(f'({i}, {j})', end=' ')
  print()
'''
(0, 0) (0, 1) (0, 2) (0, 3) (0, 4) 
(1, 0) (1, 1) (1, 2) (1, 3) (1, 4)
(2, 0) (2, 1) (2, 2) (2, 3) (2, 4)
(3, 0) (3, 1) (3, 2) (3, 3) (3, 4)
(4, 0) (4, 1) (4, 2) (4, 3) (4, 4)
'''
  • 시뮬레이션 및 완전 탐색 문제에서는 2차원 공간에서의 방향 벡터가 자주 활용
# 동, 북, 서, 남
dx = [0, -1, 0, 1]
dy = [1, 0, -1, 0]

# 현재 위치
x, y = 2, 2

for i in range(4):
  # 다음 위치
  nx = x + dx[i]
  ny = y + dy[i]
  print(nx, ny)
'''
2 3
1 2
2 1
3 2
'''

<문제> 상하좌우

  • 문제 설명
    • ...
  • 문제 해결 아이디어
    • 이 문제는 요구사항대로 충실히 구현하면 되는 문제
    • 일련의 명령에 따라서 개체를 차례대로 이동시킨다는 점에서 시뮬레이션(Simulation) 유형으로도 분류되며 구현이 중요한 대표적인 문제 유형
      • 시뮬레이션, 구현, 완전 탐색
  • 예시 답
# 4-1 112
# 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)

<문제> 시각

  • 문제 설명
    • ...
  • 문제 해결 아이디어
    • 이 문제는 가능한 모든 시각의 경우를 하나씩 모두 세서 풀 수 있는 문제
    • 모든 경우는 86,400가지
      • $246060=86,400$
    • **완전 탐색(Brute Forcing)**문제 유형
  • 예시 답
# 4-2 114
# 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)

<문제> 왕실의 나이트

  • 문제 설명
    • ...
  • 문제 해결 아이디어
    • 요구사항대로 충실히 구현하면 되는 문제
    • 나이트의 8가지 경로를 하나씩 확인하며 각 위치로 이동이 가능한지 확인
      • 리스트를 이용하여 8가지 방향에 대한 방향 벡터를 정의
  • 예시 답
# 4-3 117
# 현재 나이트의 위치 입력받기
input_data = input()
row = int(input_data[1])
column = int(ord(input_data[0])) - int(ord('a')) + 1

# 나이트가 이동할 수 있는 8가지 방향 정의
steps = [(-2, -1), (-1, -2), (1, -2), (2, -1), (2, 1), (1, 2), (-1, 2), (-2, 1)]

# 8가지 방향에 대하여 각 위치로 이동이 가능한지 확인
result = 0
for step in steps:
    # 이동하고자 하는 위치 확인
    next_row = row + step[0]
    next_column = column + step[1]
    # 해당 위치로 이동이 가능하다면 카운트 증가
    if next_row >= 1 and next_row <= 8 and next_column >= 1 and next_column <= 8:
        result += 1

print(result)

<문제> 문자열 재정렬

  • 문제 설명
    • ...
  • 문제 해결 아이디어
    • 요구사항대로 충실히 구현하면 되는 문제
    • 문자열이 입력되었을 때 문자를 하나씩 확인
      • 숫자인 경우 따로 합계를 계산
      • 알파벳인 경우 별도의 리스트에 저장
    • 결과적으로 리스트에 저장된 알파벳을 정렬해 출력하고, 합계를 뒤에 붙여 출력하면 정답
  • 예시 답
# 12-2 516
data = input()
result = []
value = 0

# 문자를 하나씩 확인하며
for x in data:
    # 알파벳인 경우 결과 리스트에 삽입
    if x.isalpha():
        result.append(x)
    # 숫자는 따로 더하기
    else:
        value += int(x)

# 알파벳을 오름차순으로 정렬
result.sort()

# 숫자가 하나라도 존재하는 경우 가장 뒤에 삽입
if value != 0:
    result.append(str(value))

# 최종 결과 출력(리스트를 문자열로 변환하여 출력)
print(''.join(result))