👉🏻 구현 (Implementation)
- 구현이란, 머릿속에 있는 알고리즘을 소스코드로 바꾸는 과정
- 아무리 알고리즘을 잘 세워도 실제로 코드로 작성해서 프로그램으로 만들지 않으면 알고리즘이 실제로 동작하지 않는다
- 알고리즘 문제를 푸는 과정에서 구현은 반드시 필요한 과정
- 그래서 모든 문제가 구현 유형이라고 할 수 있긴 하다
- 하지만 특별히 '구현 유형'이라고 부르는 것은 문제에서 요구하는 내용이 구현에 맞춰져 있거나 구현이 어려운 문제
- 흔히 알고리즘 대회에서 구현 유형의 문제란 무엇을 의미할까?
- 풀이를 떠올리는 것은 쉽지만 소스코드로 옮기기 어려운 문제를 지칭
- 구현 유형의 예시
- 알고리즘은 간단한데 코드가 지나칠 만큼 길어지는 문제
- 실수 연산을 다루고, 특정 소수점 자리까지 출력해야하는 문제
- 문자열을 특정한 기준에 따라 끊어 처리해야 하는 문제
- 적절한 라이브러리를 찾아서 사용해야하는 문제
- 적절한 라이브러리를 알지 못할 경우 하나하나 다 구현해야해서 난이도가 높아짐
- 대표적으로 모든 순열, 모든 조합을 찾는 문제
- 파이썬에서는 itertools라이브러리
- 많은 연습이 필요
- 일반적으로 알고리즘 문제에서의 2차원 공간은 행렬(Matrix)의 의미로 사용된다
- 2D 게임 개발 등에서 이차원 공간을 행렬 같은 형태로 표현해 내부적으로 처리
- 코테에서도 다양한 시뮬레이션 문제에서 2차원 공간을 가정하는 상황 많이 등장
- Ex. 2차원 맵(map) 상 한 좌표에 존재하는 캐릭터가 반복적으로 어떤 위치로 이동한다
- 행렬(Matrix): 2차원 데이터를 일종의 표와 같은 형태로 쉽게 나타내줄 수 있는 수학 개념 중 하나
- 2차원 배열과 동일
- 2차원 리스트와 동일
- 왼쪽 위((0,0))부터
오른쪽으로 갈 수록 열 위치(인덱스)가 증가
아래로 갈 수록 행 인덱스가 증가
- 완전탐색, 시뮬레이션 문제를 접할 때 문제에서 정의하는 내용을 확인해보면 가장 왼쪽 위 위치를 (0,0)으로 부르는 경우가 많다
- 옛날에 배웠던 x축, y축 개념과 다를 수 있음
- 시뮬레이션 및 완전 탐색 문제에서는 2차원 공간에서의 방향 벡터가 자주 활용된다
- 특정 캐릭터나 사물 등이 특정 위치에 존재했다가 상하좌우로 이동할 수 있다는 등의 문제상황
- 특정 위치에서 위로 이동한다면 행 데이터가 1만큼 감소한다
- 동북서남 각각의 방향 벡터를 정할 수 있음
- x는 세로축(행), y는 가로축(열)
- 동: 행은 가만히, 열을 오른쪽으로 한 칸 이동
- 북: 행을 한칸 위로 이동, 열은 가만히
- 서: 행은 가만히, 열을 왼쪽으로 한 칸 이동
- 남: 행을 한 칸 아래로, 열은 가만히
👉🏻 문제1: 상하좌우
🧩 문제 설명
- 문제에서 가장 왼쪽 위가 (1,1)이라고 명시했다면
- 첫 번째 인덱스는 사용하지 않는 방식을 택하거나
- (1,1)을 (0,0)인 것 처럼 처리하도록 소스코드를 작성하거나
🧩 문제 조건
💡 스스로 풀어보기
N = int(input())
move = list(input().split())
map_ = [(N, N), " "]
x = 1
y = 1
dx = [0, -1, 0, 1]
dy = [1, 0, -1, 0]
nx = 0
ny = 0
for i in move:
if i == "R":
nx = x + dx[0]
ny = y + dy[0]
if nx > N or ny > N:
continue
else:
x += dx[0]
y += dy[0]
elif i == "U":
nx = x + dx[1]
ny = y + dy[1]
if nx > N or ny > N:
continue
else:
x += dx[1]
y += dy[1]
elif i == "L":
nx = x + dx[2]
ny = y + dy[2]
if nx > N or ny > N:
continue
else:
x += dx[2]
y += dy[2]
else:
nx = x + dx[3]
ny = y + dy[3]
if nx > N or ny > N:
continue
else:
x += dx[3]
y += dy[3]
print(x, y)
- 반복되는 부분은 함수로 뺄 수 있으면 빼야겠다
- 일단 답이 안 나왔다
🧩 문제 해결 아이디어
- 이 문제는 요구사항대로 충실히 구현하면 되는 문제
- 일련의 명령에 따라서 개체를 차례대로 이동시킨다는 점에서 시뮬레이션(Simulation)유형으로도 분류되며 구현이 중요한 대표적인 문제 유형이다
- 다만, 알고리즘 교재나 문제 풀이 사이트에 따라서 다르게 일컬을 수 있으므로, 코딩 테스트에서의 시뮬레이션 유형, 구현 유형, 완전 탐색 유형은 서로 유사한 점이 많다는 정도로만 기억
💡 예시 답안
- 현재 위치를 의미하는 x, y 초기화 및 주어지는 N과 계획 입력 받기
- 방향 벡터 설정
- 이동 가능한 문자는 정해져있기 때문에이것들을 리스트로 만들어준다
- 계획서 내의 이동 계획을 하나씩 확인하며
- 이동 가능한 문자 리스트 내에 일치하는 것의 인덱스를 활용해 이동 후 좌표 구하기
- 다음 위치가 범위를 벗어나지 않는다면 이동을 수행한다
* C++ ver
* Java ver
https://github.com/ndb796/python-for-coding-test/blob/master/4/1.java
👉🏻 문제2: 시각
🧩 문제 설명
🧩 문제 조건
💡 스스로 풀어보기
- 문제점
- s와 m을 초기화 시켜주지 않았다 (초기화 시켜주니 답이 제대로 나옴)
- to_str()을 굳이 함수로 만들 필요가 있었을까
🧩 문제 해결 아이디어
- 모든 경우의 수에 대해서 충분히 컴퓨터가 빠르게 처리할 수 있다
- 1초에 2천만번 연산 수행
💡 예시 답안
- i는 시, j는 분, k는 초
- 시분초를 문자열로 만든다 (쭉 이어 나열한 문자열)
* C++ ver
* Java ver
👉🏻 문제3: 왕실의 나이트
🧩 문제 설명
- 시뮬레이션, 완전탐색, 구현 문제
🧩 문제 조건
💡 스스로 풀어보기
- 못 풀었다
🧩 해결 아이디어
- 여기서 8개는 내가 코드에 쓴 '동동남'... 이것들
💡 예시 답안
- 문자로 들어온 값을 아스키코드 값으로 바꾸고 a를 아스키코드로 바꾼 값을 뺀 다음 1을 더해주면 컬럼위치 구해짐
✅ ord() 함수
- 문자를 컴퓨터가 이해할 수 있는 문자(유니코드, 아스키코드)로 변환해준다
✅ 컬럼 위치
- input_data[0]의 아스키코드 값에서 'a'에 대한 아스키코드 값을 빼주면 'a'를 기준으로 한 상대적인 위치가 나온다
- 'a' = 0, 'b' = 1, 'c' = 2, .... 'z' = 25
- 상대적 위치에 1을 더해주면 'a' = 1, 'b' = 2, 'c' = 3, ... 이 된다. 이를 활용해 컬럼 위치로 사용하는 것
- 이차원 배열을 이용해 방향 벡터 정의
- dx, dy 두 개의 리스트를 사용하지 않고도 문제를 풀 수 있다
- 원소로 들어간 튜플들 각각이 방향 벡터
- 각 방향을 확인하며 체스판을 벗어나는지 확인함
*C++ ver
*Java ver
👉🏻 문자열 재정렬
🧩 문제 설명
✅ 수와 숫자 구분하기
- 수: 100, 1000, 700 등 실제 정수와 같은 데이터
- 숫자: 0 ~9 같이 하나의 글자로 이루어진 숫자 데이터
🧩 문제 조건
💡 스스로 풀어보기
- 답은 나옴
🧩 문제 해결 아이디어
💡 예시 답안
- isalhpa()를 오나전 잊고 있었다..
* C++ ver
* Java ver
(깃허브에 있다고 했는데 없음..)
출처: https://youtu.be/puH2p1CQEg4?si=I52Hym_PwFn0kDcA
https://youtu.be/QhMY4t2xwG0?si=724nZ3oc4yjgIvOr
'Python > 이것이코딩테스트다with파이썬' 카테고리의 다른 글
17강 재귀 함수 (0) | 2023.11.22 |
---|---|
16강 스택과 큐 자료구조 (0) | 2023.11.21 |
12~13강 :: 그리디 알고리즘 개요와 문제 풀이 (0) | 2023.11.09 |
11강 :: 자주 사용되는 표준 라이브러리 (2) | 2023.11.09 |
10강 :: 함수와 람다 표현식 (0) | 2023.11.07 |