오후 : 알고리즘 테스트
특이사항
문제가 3가지가 주어졌는데, 그 중 1, 2번 문제는 백준 문제를 단순화해서 가져온 문제였다. OX문제와 잔돈처리 문제였다. 나는 잔돈처리 문제를 for문을 돌리지 않고 깡으로 if문 뭉텅이를 박치기해서 클리어했다. OX문제는 문자열을 받은 값을 split으로 쪼갠 뒤 for문으로 하나하나 확인해서 값을 리턴했다. 다른 동기들은 그냥 문자열의 length를 받아와 했던데, 그것이 꽤 깔끔해보였다.
그리고 대망의 3번 문제. 지뢰찾기 문제. 이건 그냥 코드를 적어놓겠다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
function solution(N, arr1){
let Minefield = [[]];
for(let i = 0 ; i < N; i++){
Minefield[i] = []
for(let x = 0 ; x < arr1[i].length; x++){
if(arr1[i][x] != '.'){
Minefield[i].push('*')
}
else{
let a= 0;
for(let y = x-1; y < x+2; y++){
if(i - 1 >= 0 && arr1[i - 1][y] != undefined && arr1[i - 1][y] != '.')
{
a += parseInt(arr1[i - 1][y])
}
if(arr1[i][y] != undefined && arr1[i][y] != '.')
{
a += parseInt(arr1[i][y])
}
if(i + 1 < N && arr1[i + 1][y] != undefined && arr1[i + 1][y] != '.')
{
a += parseInt(arr1[i + 1][y])
}
}
a >= 10 ?Minefield[i].push('M') :Minefield[i].push(a.toString())
}
}
}
return Minefield;
}
let N = 5;
let arr1=[['.', '.', '.', '.', '.'],
['.', '.', '3', '.', '.'],
['.', '.', '.', '.', '.'],
['.', '4', '.', '.', '.'],
['.', '.', '.', '9', '.']];
console.log(solution(N, arr1))
|
cs |
지뢰가 들어있는 배열이 arr1, 지뢰가 없는 인덱스는 '.', 지뢰가 n개 박혀있는 인덱스는 'n'으로 표기되어 있다.
여기서 우선 for문으로 한 번 크게 돌리면서 arr1[i]을 확인하고, 그 안에 arr1[i][x]를 for문으로 돌리면서 로직이 돌아간다. 일단 arr1[i][x]의 문자값이 '.'이 아닌지 체크하고 숫자 문자열이 들어간 걸 확인하면 '*'를 푸쉬한다. 여기까지는 간단하다. 문제는 다음으로 들어가는 else부터 이제 본격적으로 로직이 돌아간다. 만약 arr1[i][x]의 값이 '.'이라면, 즉 주변 지뢰의 숫자를 체크해야 하는 부분이라면 이 else안에서 해결해야하기 때문이다.
우선 숫자 값을 리턴해야하므로 초기값 a = 0을 선언한다다. 그 다음 arr1[i][y]의 좌우 1칸씩 돌아가는 for문을 돌린다. 이것이 체크해야하는 건 상하 줄까지 포함하므로 이 for문 안에 윗줄, 중간 줄, 아랫줄을 체크할 if문을 3번 넣는다.
이때 if문 안에 예외처리를 넣어야한다. 윗줄이나 아랫줄이 없는 경우에는 값이 error가 나기 때문에, 우선 윗줄을 체크하는 if의 경우 I -1이 0보다 큰지를 체크, 아랫줄은 초기에 받은 N값보다 작은지를 체크한다. 그 다음 왼쪽이나 오른쪽이 없는 경우도 따져야 하기 때문에 엔드 연산자로 arr[i + 1][y]의 값이 undefined인지를 체크한다. 이렇게 두 조건을 따지면 무조건 값이 있는 이중배열의 인덱스를 가져오는데, 이것이 '.'이 아닌, 지뢰가 심겨진 칸인지를 체크한다.
이 모든 체크를 거치면 a에다 해당 이중배열 인덱스의 값을 파서인트로 문자형으로 되어있던 숫자를 넘버형으로 바꾸고 더한다. 마지막으로 주의해야할 것이, 만약 이게 10 이상이라면 M이라고 해야하므로 삼항연산자를 활용해 M을 푸쉬할 것인지, 숫자를 푸쉬할 것인지를 따진다.
다른 동기들은 map내장함수를 쓰는 식으로 깔끔하게 했는데, 나는 너무 클래식 스타일로 해결한 것이 아닌가 싶다. 깔끔하게 짰다고 칭찬받았지만, 클래식하다는게 IT 바닥에서 마냥 좋은 것은 아니잖아...
'항해99 개발일지' 카테고리의 다른 글
01 - 30 ~ 02 - 05 정산 (0) | 2023.02.05 |
---|---|
02 - 03 일지 (0) | 2023.02.04 |
02 - 01 일지 (1) | 2023.02.01 |
01 - 31 일지 (0) | 2023.01.31 |
01 - 30 일지 (0) | 2023.01.31 |