[구현 - 시뮬레이션과 완전 탐색] 문제 풀이
2021. 2. 17. 11:40ㆍFront-end/알고리즘
728x90
반응형
2-2 [구현 - 시뮬레이션과 완전 탐색] 문제 풀이
<문제1>시각
문제 설명
- 정수 N이 입력되면 00시 00분 00초부터 N시 59분 59초까지의 모든 시간중에서 3이 하나라도 포함되는 모든 경우의 수를 구하는 프로그램을 작성하시오. 예를 들어 1을 입력했을 때 다음은 3이 하나라도 포함되어 있으므로 세어야 하는 시각임.
- 00시 00분 03초
- 00시 13분 30초
- 반면에 다음은 3이 하나도 포함되어 있지 않으므로 세면 안 되는 시각임
- 00시 02분 55초
- 01시 27분 45초
문제 조건
문제 해결 아이디어
- 이 문제는 가능한 모든 시각의 경우를 하나씩 모두 세서 풀 수 있는 문제임
- 하루는 86,400초이므로, 00시00분00초부터 23시 59분 59초까지의 모든 경우는 86,400가지임.
- 따라서 단순히 시각을 1초씩 증가시키면서 3이 하나라도 포함되어 있는지를 확인하면 됨
- 이러한 유형은 완전 탐색(Brute Forcing)문제 유형이라고 불림.
- 가능한 경우의 수를 모두 검사해보는 탐색방법을 의미함.
내가 작성한 코드
const n = prompt("0~23 입력: ");
let count = 0;
for(let hour = 0; hour <= n; hour++){
for(let min = 0; min < 60; min++ ){
for(let sec = 0; sec < 60; sec++){
if( (String(hour)+String(min)+String(sec)).includes("3") )
{
count++;
}
}
}
}
console.log(count);
자바스크립트의 includes 메소드를 사용하였다.
<문제2> 왕실의 나이트
문제 설명
- 행복 왕궁의 왕실 정원은 체스판과 같은 8 x 8 좌표 평면임. 왕실 정원의 특정한 한 칸에 나이트가 서있음. 나이트는 매우 충성스러운 신하로서 매일 무술을 연마함.
- 나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없음
- 나이트는 특정 위치에서 다음과 같은 두 가지 경우로 이동할 수 있음
- 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
- 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기
- 이처럼 8 x 8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램을 작성하시오. 왕실의 정원에서 행 위치를 표현할 때는 1부터 8로 표현하며, 열 위치를 표현할 때는 a부터 h로 표현함.
- c2에 있을 때 이동할 수 있는 경우의 수는 6가지임.
문제 조건
문제 해결 아이디어
- 요구사항대로 충실히 구현하면 되는 문제
- 나이트의 8가지 경로를 하나씩 확인하며 각 위치로 이동이 가능한지 확인
- 리스트를 이용하여 8가지 방향에 대한 방향 벡터를 정의
내가 작성한 코드(자바스크립트)
//a1 -> (1,a) -> (row,col) -> (1,1)
// 총 8,8 까지 있음
function royalKnight(input){
let col = input.charCodeAt(0) - 96;
let row = Number(input[1]);
let nextRow = row;
let nextCol = col;
let count = 0;
console.log(`input : ${input} = (${row},${col})`);
const move_types = [[-1,-2],[1,-2],[-2,-1],[2,-1],
[-2,1],[2,1],[-1,2],[1,2]];
for(let i = 0; i < move_types.length; i++){
nextRow = row + move_types[i][0];
nextCol = col + move_types[i][1];
if(nextRow >= 1 && nextRow <= 8 && nextCol >=1 && nextCol <= 8){
count++;
console.log(`가능한 경우의 수 : ${i+1} : (${nextRow},${nextCol})`);
}
}
return count;
}
console.log(royalKnight("c2"));
//기댓값 6
2차원 배열을 이용했음, move_types를 썼다는 점에서 앞 전 게시글의 상하좌우(LRUD)문제와 유사한 점이 많음
<문제> 문자열 재정렬
문제 설명
- 알파벳 대문자와 숫자(0~9)로만 구성된 문자열이 입력으로 주어짐, 이때 모든 알파벳을 오름차순으로 정렬하여 이어서 출력한 뒤에, 그 뒤에 모든 숫자를 더한 값을 이어서 출력함
- 예를 들어 K1KA5CB7이라는 값이 들어오면 ABCKK13을 출력함
문제 조건
문제 해결 아이디어
- 요구사항대로 충실히 구현하면 되는 문제
- 문자열이 입력되었을 때 문자를 하나씩 확인함
- 숫자인 경우 따로 합계를 계산함
- 알파벳의 경우 별도의 리스트에 저장함
- 결과적으로 리스트에 저장된 알파벳을 정렬해 출력하고, 합계를 뒤에 붙여 출력하면 정답
내가 작성한 코드(자바스크립트)
const inputString = prompt("문자열을 입력해주세요.");
const stringArray = [];
let numberSum=0;
for(let element of inputString){
if(isNaN(element)){
stringArray.push(element);
}
else{
numberSum += Number(element);
}
}
let result = stringArray.sort(); // 문자부터 우선 정렬
if(numberSum != 0){ // 숫자들의 합이 0이 아니라면 배열에 가장 뒤에 삽입
result.push(numberSum);
}
result = result.join(""); //배열을 문자열로 바꾸기
console.log(result);
728x90
반응형
'Front-end > 알고리즘' 카테고리의 다른 글
[프로그래머스] 두 수 뽑아서 더하기 (0) | 2021.02.25 |
---|---|
[프로그래머스] 크레인 인형 뽑기 게임 (0) | 2021.02.25 |
[구현 - 시뮬레이션과 완전 탐색] 개요 (0) | 2021.02.16 |
그리디 알고리즘(탐욕법) - [문제]모험가 길드 (0) | 2021.02.15 |
그리디 알고리즘(탐욕법) - [문제]곱하기 혹은 더하기 (0) | 2021.02.15 |