[이코테] 구현(Implementation)

728x90

구현 

  • 머릿속에 있는 알고리즘을 소스코드로 바꾸는 과정
  • 풀이를 떠올리는 것은 쉽지만 소스코드로 옮기기 어려운 문제
  • 완전 탐색: 모든 경우의 수를 주저 없이 다 계사하는 해결 방법
  • 시뮬레이션: 문제에서 제시한 알고리즘을 한 단계씩 차례대로 직접 수행

 

구현 문제 접근법

  • 구현 유형의 문제는 입력 조건 등을 문제에서 명시해주기 때문에 문제의 길이가 긴 편이나 문법에 익숙하다면 쉽게 풀 수 있음

 

예제 1. 상하좌우

내 풀이(오답)

# (1,1) 시작 
# L: 좌, R: 우, U: 위, D: 아래

# 내 풀이(오답)
n = int(input())
move = list(map(str, input().split())) 
x,y = 1,1

for i in move:
     if i == 'R':
         y += 1
     elif i == 'L':
         y -= 1
     elif i == 'U':
         x -= 1
     elif i == 'D':
         x += 1
print(x, y)
  • "n * 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. 시각

정답

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)
  • 00시부터 N시 까지의 시각 중 3이 하나라도 포함되는 경우의 수 구하기
  • 시, 분, 초를 3중 반복문으로 나누어 계산 (완전탐색법)

 

실전 1. 왕실의 나이트

정답

# 나이트의 위치에서 이동할 수 있는 경우의 수 구하기
# 이동1: 수평 2 후 수직 1
# 이동2: 수직 2 후 수평 1
# 행: a~h, 열: 1~8
# 공간 벗어나면 무시

# 나이트 위치
# 현재 나이트의 위치 입력받기
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 1 <= next_row <= 8 and 1 <= next_column <= 8:
        result += 1

print(result)
  • 나이트가 이동할 수 있는 8가지 방향을 정의하고, 각 방향으로 이동했을 때 새로운 위치가 체스판 안에 있는지 확인
  • ord: 각 문자에 해당하는 유니코드 값(정수)을 반환

 

기출 1. 럭키 스트레이트

내 풀이 (O)

N = input()

x = 0 #앞부분
for i in range(len(N)//2):
    x += int(N[i])

y = 0 #뒷부분
for i in range(len(N)//2, len(N)):
    y += int(N[i])

if x == y:
    print("LUCKY")
else:
    print("READY")
  • 자릿수 기준 점수 N을 반으로 나누어 각각의 합이 같을 경우 LUCKY, 아니면 READY
  • N은 항상 짝수
  • 길이를 반으로 나누어 풀이

 

기출 2. 문자열 재정렬

정답

data = input()
result = []
value = 0

# 문자를 하나씩 확인하며
for x in data:
  # 숫자인 경우 변수에 저장
  if x.isdigit() :
    value += int(x)
  # 알파벳인 경우 리스트에 삽입
  else :
    result.append(x)

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

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


# 최종결과출력(리스트를 문자열로 변환하여 출력)
print(''.join(result))
  • isalpha(): 알파벳인지 확인
  • isdigit(): 숫자인지 확인

 

728x90