구현?
시뮬레이션과 완전탐색에 초점을 맞춘다.
어떤 알고리즘문제라더라도 -> 소스코드로 구현
= 모든문제가 구현문제 ?
하지만 일반적으로 구현문제라고 특정지어서 표현할때는
구현 유형의 문제란
풀이를 떠올리는 것은 쉽지만 소스코드로 옮기기 어려운 문제를 지칭한다.
구현 유형의 예시는 다음과 같다.
언어에따라서 구현 유형의 경우 난이도가 많이 다를수있다 (그래서 코테때는 Python인건가..역시)
2차원배열 = 2차원리스트
유클리드 좌표계랑 다르다. 조심
// 동, 북, 서, 남
// 동쪽 -> 오른쪽
// 북쪽 -> 위로
// 서쪽 -> 왼쪽
// 남쪽 -> 아래쪽
let dx = [0, -1, 0, 1];
let dy = [1, 0, -1, 0];
//현재 위치
let x=2;
let y=2;
//다음 위치 변수
let nx,ny;
for(let i=0; i<4; i++){
//다음 위치
nx = x + dx[i]
ny = y + dy[i]
console.log(nx, ny)
}
방향벡터에 주목
여행가 A는 N x N 크기의 정사각형 공간 위에 서 있습니다. 이 공간은 1 x 1 크기의 정사각형으로 나누어져 있습니다. 가장 왼쪽 위 좌표는 (1, 1)이며, 가장 오른쪽 아래 좌표는 (N, N)에 해당합니다. 여행가 A는 상,하,좌,우 방향으로 이동할 수 있으며, 시작 좌표는 항상 (1,1)입니다. 우리 앞에는 여행가 A가 이동할 계획이 적힌 계획서가 놓여 있습니다.
계획서에는 하나의 줄에 띄어쓰기를 기준으로 하여 L, R, U, D 중 하나으 ㅣ문자가 반복적으로 적혀 있습니다. 각 문자의 으미는 다음과 같다.
이때 여행가 A가 N x N 크기의 정사각형 공간을 벗어나는 움직임은 무시됩니다. 예를 들어 (1, 1)의 위치에서 L 혹은 U를 만나면 무시됩니다. 다음은 N = 5인 지도와 계획서 입니다.
R R R U D D
정답 : 3 4
시간제한 2초
1 <= N <= 100
1 <= 이동횟수 <=100
해답
function solution(n,move){
let x=1;
let y=1;
let plans = move.split(" ")
let dx = [0,0,-1,1];
let dy = [-1,1,0,0];
let move_types = ['L','R','U','D'];
let nx,ny;
for(let plan in plans){
for(let i in move_types){
if(plans[plan] === move_types[i]){
nx = x + dx[i];
ny = y + dy[i];
}
}
if(nx < 1 || ny < 1 || nx > n || ny > n){
continue;
}
x = nx;
y = ny;
}
return `${nx} ${ny}`
}
정수 N이 입력되면 00시 00분 00초 부터 N시 59분 59초 까지의 모든 시각 중에서 3이 하나라도 포함되는 모든 경우의 수를 구하는 프로그램을 작성하세요. 예를 들어 1을 입력했을 때 다음은 3이 하나라도 포함되어 있으므로 세어야 하는 시각입니다.
반면에 다음은 3이 하나도 포함되어 있지 않으므로 세면 안되는 시각 입니다.
시간제한 2초
정수 N (0<=N<=23)
해답
function solution(h){
let count = 0;
for(let i=0; i<h+1; i++){
for(let j=0; j<60; j++){
for(let k=0; k<60; k++){
if(`${i}${j}${k}`.includes('3')){
count++;
}
}
}
}
return count;
}
?? 이거 체스판 나이트 움직이는거..
이 문제는 전형적인 시뮬레이션, 완전탐색 문제 유형이면서도, 2차원좌표를 이용하는 구현 문제 유형이기도 하다.
해답
function solution(input){
let input_data = input.split("");
let row = Number(input_data[0].charCodeAt()) - Number("a".charCodeAt()) + 1
// 위부분 아스키코드로 a를 1로 바라보고 계산해줄수있는 코드
let column = Number(input_data[1])
let steps = [[-2, -1], [-1, -2], [1, -2], [2, -1], [2, 1], [1, 2], [-1, 2], [-2, 1]]
let result = 0;
let next_row;
let next_column;
for(let step in steps){
next_row = row + steps[step][0];
next_column = column + steps[step][1];
if(next_row >= 1 && next_row <= 8 && next_column >= 1 && next_column <= 8){
result ++;
}
}
return result;
}
시간제한 1초
입력 1<= S <= 10,000
해답
function solution(input){
let sum = input.match(/[0-9]/gm).reduce((acc,cur)=>Number(acc)+Number(cur),0)
let array = input.match(/[A-Z]/gm)
array.sort()
return array.join("")+sum;
}
문자열을 다루는 알고리즘에서는 정규표현식을 어느정도 숙달해두면 편하게 풀리는경우가 많다.
그러므로 연습을 좀 해두는것이 좋다.