어떤 공식이 있다기 보다는 말 그대로 "구현"에 초점을 두는 것이다.
아이디어를 떠올리기는 쉽지만 막상 구현하려면 코드가 길어진다거나 하는 문제들!
보통 N x M 칸을 주고 상,하,좌,우로 움직이는 시뮬레이션 문제
또는
00시 00분 00초 단위의 시간 계산같은 완전탐색
으로 풀어야하는 문제들이 있을 수 있다.
프로그래밍은 기본적으로 어떤 아이디어를 구체화 시켜 문제를 해결하는 것이다.
이 능력을 판별하기 가장 쉬운 문제유형이기에 대기업에서 복잡하고 어려운 구현 문제가 많이 출제 되는 듯 하다.
구현 알고리즘은 구체적인 실행과 효과적인 코드를 만드는 데 도움이 된다.
잘 풀기 위해서는 문제를 빠르게 파악하고 그에 알맞은 해결 방법을 도출하는 연습이 필요하다.
특히 풀이에 맞는 라이브러리, 적절한 함수를 많이 알고있으면 도움이 된다.
행복 왕국의 왕실 정원은 체스판과 같은 8 × 8 좌표 평면이다.
왕실 정원의 특정한 한 칸에 나이트가 서있다.
나이트는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다.
나이트는 특정 위치에서 다음과 같은 2가지 경우로 이동할 수 있다.
1. 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
2. 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기
이 때, 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램을 작성하라.
행 위치
를 표현할 때는 1부터 8
로,
열 위치
를 표현할 때는 a 부터 h
로 표현한다.
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) ..
이런식으로 작성했는데~=
를 보고 고쳤다.