[구현 알고리즘] 왕실의 나이트

doyeonjeong_·2023년 1월 5일
0

Algorithm

목록 보기
2/8

구현 알고리즘에 대한 소개

어떤 공식이 있다기 보다는 말 그대로 "구현"에 초점을 두는 것이다.
아이디어를 떠올리기는 쉽지만 막상 구현하려면 코드가 길어진다거나 하는 문제들!

보통 N x M 칸을 주고 상,하,좌,우로 움직이는 시뮬레이션 문제 또는
00시 00분 00초 단위의 시간 계산같은 완전탐색으로 풀어야하는 문제들이 있을 수 있다.

구현 알고리즘의 중요성

프로그래밍은 기본적으로 어떤 아이디어를 구체화 시켜 문제를 해결하는 것이다.
이 능력을 판별하기 가장 쉬운 문제유형이기에 대기업에서 복잡하고 어려운 구현 문제가 많이 출제 되는 듯 하다.

결론

구현 알고리즘은 구체적인 실행과 효과적인 코드를 만드는 데 도움이 된다.
잘 풀기 위해서는 문제를 빠르게 파악하고 그에 알맞은 해결 방법을 도출하는 연습이 필요하다.
특히 풀이에 맞는 라이브러리, 적절한 함수를 많이 알고있으면 도움이 된다.


[문제] 왕실의 나이트

행복 왕국의 왕실 정원은 체스판과 같은 8 × 8 좌표 평면이다.
왕실 정원의 특정한 한 칸에 나이트가 서있다.
나이트는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다.
나이트는 특정 위치에서 다음과 같은 2가지 경우로 이동할 수 있다.

1. 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
2. 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기

이 때, 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램을 작성하라.
행 위치를 표현할 때는 1부터 8로,
열 위치를 표현할 때는 a 부터 h로 표현한다.

입력 조건

  • 첫째 줄에 8x8 좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력된다. 입력 문자는 a1 처럼 열과 행으로 이뤄진다.

출력 조건

  • 첫째 줄에 나이트가 이동할 수 있는 경우의 수를 출력하시오.

풀이

  1. 나이트가 움직일 수 있는 8가지 경우를 튜플 형태의 배열로 설정한다.
  2. 현재 위치에서 한 번 이동 시 범위 내인지 확인한다.
  3. 범위 내라면 +1, 아니라면 through
  4. 모든 경우 탐색 후 결과 출력
  • 시뮬레이션 + 완전탐색 문제
  • 모든 이동 가능한 경우를 체크해야한다.
  • 입력받는 문자가 2글자이기에 map은 사용하지 않았다.
  • input.last!Character 형식이기에 바로 Int로 형변환이 불가능하여 String으로 한 번 더 바꿔주었다.
  • (1, 1)이 편해서 'a'의 아스키코드값 97대신 96을 사용했다.
  • 튜플 처리 속도가 빠르기 때문에 dx, dy 배열로 각각 나누는 대신 한번에 처리했다.
  • 가독성을 위해 isInRange() 를 만들었다.

코드

import Foundation

let input = readLine() ?? ""
let row = Int(String(input.last!))!
let col = Int(input.first!.asciiValue!) - 96 // 97은 'a'의 아스키 코드, a일 경우 1로 표시 되어야 하기 때문에 96을 빼준다.

let moves = [(-2, -1), (-1,-2), (2,-1), (1,-2), (2,1), (1,2), (-1,2), (-2,1)]
var result = 0

for move in moves {
    var nextX = row + move.0
    var nextY = col + move.1
    
    if isInRange(nextX,nextY) {
        result += 1
    }
}

print(result)

func isInRange(_ x: Int, _ y: Int) -> Bool {
    return (1...8 ~= x) && (1...8 ~= y) // ~= 볌위 연산자 : Bool 값
}

그룹 스터디 피드백

  • 처음엔 함수를 (x >= 1) && (x <= 8) .. 이런식으로 작성했는데
    만도스님이 사용한 범위연산자 ~=를 보고 고쳤다.
  • 구현 문제는 함수를 쪼개서 푸는 방법에 익숙해지는게 좋을 것 같다는 결론을 얻었다.
  • 백준의 삼성 기출 문제에 어려운 구현 문제가 많아서 다음엔 그 문제들을 연습해야겠다.
profile
블로그 이사중 🚚 byukbyak.tistory.com

0개의 댓글