Python/이것이코딩테스트다with파이썬

14~15강 :: 구현 유형 개요 및 문제 풀이

묘걍 2023. 11. 15. 19:58

👉🏻 구현 (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