728x90
문제 출처
문제 설명
JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다.
단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.
제한 사항
입력 형식
- 입력으로 판의 높이 m, 폭 n과 판의 배치 정보 board가 들어온다.
- 2 ≦ n, m ≦ 30
- board는 길이 n인 문자열 m개의 배열로 주어진다. 블록을 나타내는 문자는 대문자 A에서 Z가 사용된다.
출력 형식
입력으로 주어진 판 정보를 가지고 몇 개의 블록이 지워질지 출력하라.
내가 작성한 코드
const solution = (m, n, board) => {
//m은 높이 n은 너비
board = board.map((e) => e.split(''));
while(true){
const breakArr = [];
// 1. 겹치는 블럭 체크
for(let i=0; i<m-1; i++){
for(let j=0; j<n-1; j++){
if(
board[i][j] &&
board[i][j] === board[i][j + 1] &&
board[i][j] === board[i + 1][j] &&
board[i][j] === board[i + 1][j + 1]
) {
// i는 col, j는 row
breakArr.push([i, j]);
}
}
}
// 2. 더 깰 블럭이 없을 때 return
if(breakArr.length === 0){
// return [].concat(...board).filter((e) => e === 0).length
return [].concat(...board).filter((e) => !e).length
}
// 3. 겹치는 블럭 제거(0으로 대체)
for(let i=0; i<breakArr.length; i++){
const col = breakArr[i][0];
const row = breakArr[i][1];
board[col][row] = 0;
board[col][row + 1] = 0;
board[col + 1][row] = 0;
board[col + 1][row + 1] = 0;
}
// 4. 빈 블럭 위에 있는 블럭을 끌어와 채우기
for(let i=m-1; i>0; i--){
// 해당 열에 빈 블럭이 있는지 some 메서드를 이용해 확인(런타이 줄이기)
if(!board[i].some((e) => !e)) continue;
for(let j=0; j<n; j++){
// 해당 줄에서 연속된 0을 무시하고 맨 위에 존재하는 값을 가져온다.
for(let k=i-1; k>=0 && !board[i][j]; k--){
if(board[k][j]){
board[i][j] = board[k][j];
board[k][j] = 0;
break;
}
}
}
}
}
}
해설
- 우선 주어지는 블럭을 2차원 적으로 나열 하기위해 board의 각 열을 split 메서드로 나눈뒤
map 메서드로 얕게 복사된 배열을 board로 할당해주었다. - 1. 겹치는 블럭 체크
이제 정돈된 블럭들 중 4개가 겹친 블럭들을 알아내야된다.
이때, 4개중 왼쪽 맨 위 블럭의 인덱스 값을 저장할 것이다.
이유는 계산 흐름상 가장 자연스럽기 때문이고 4개 이상으로 붙어있을 수 있기 때문에
계산의 간략화를 위해 이렇게 했다. - 2. 더 깰 블럭이 없을 때
이 조건은 이후에 있을 블럭 당기기를 한 뒤 더이상 깨질 블럭이 없는 경우 while문을 끝내며
값을 반환하기 위한 코드이다.
이 코드를 다른 코드들 보다 먼저 작성한 이유는 이미 breakArr라는 깰 블럭들의 리스트의 집계가
끝난 뒤 더 깰 블럭이 없다면 다른 계산을 할 필요가 없기 때문이라 생각했다. - 3. 겹치는 블럭 제거
간단한 코드이다.
breakArr의 요소 개수만큼 4개의 블럭 집합이 있다는 뜻이기에
인덱스 값을 조절하여 4개의 블럭에 0을 넣어준다. - 4. 빈 블럭 위에 있는 블럭 끌어와 채우기
이 부분이 가장 어려웠다....
가장 아래 블럭 부터 채워야 하므로 주어진 m을 이용해 board의 인덱스 중 m-1부터 시작했다.
이후, 해당 행에 빈 블럭이 있는지 검증을 한다.(some 메서드를 알게됬다...)
행에 빈 블럭이 있다면 그 행에서 0이 있는 열을 확인 후 바로 위에도 빈칸이면 값이 나올 때
그 값을 가져올 수 있게 코드를 작성한다.
(우선 0이 있는 행을 찾고 전체 board에서 그 행에 0이 연속되었다면 맨 위 값을 가져와야 한다 생각했다.)
728x90
'코딩 테스트 > 프로그래머스 코딩 테스트 연습' 카테고리의 다른 글
2Level / 2020 KAKAO BLIND RECRUITMENT / 문자열 압축 (0) | 2023.05.22 |
---|---|
2Level / 연습문제 / 숫자 블럭 (0) | 2023.05.18 |
1Level / 연습문제 / 제일 작은 수 제거하기 (0) | 2023.05.12 |
2Level / 연습문제 / JadenCase 문자열 만들기 (0) | 2023.05.12 |
1Level / 연습문제 / 핸드폰 번호 가리기 (0) | 2023.02.05 |