고양이와 코딩
[프로그래머스] 12월18일 ~ 12월25일 본문
12월18일
특별한 이차원 배열2
내 풀이
function solution(arr) {
for (let i = 0; i < arr.length; i++){
for (let j = 0; j < i; j++){
if (arr[i][j] !== arr[j][i]){
return 0;
}
}
}
return 1;
}
만약 if문을
if (arr[i][j] === arr[j][i]){
return 1;
이런식으로 작성하면 오류가 나는데요 !! 문제에서는 모든 조건이 같은 경우에 1을 리턴하도록!! 을 말하는 것 같아요..
그래서 같은 경우가 하나 나왔을때 바로 1을 return 해버리면 안댐 ..
정사각형으로 만들기
내 풀이
function solution(arr) {
const rowNum = arr.length;
const colNum = arr[0].length;
// 행의 수가 열의 수보다 많으면 열의 수를 현재 행의 수와 동일하게 맞춰준다
if (rowNum > colNum) {
for (let i = 0; i < rowNum; i++) {
while (arr[i].length < rowNum) {
arr[i].push(0);
}
}
}
// 열의 수가 행의 수보다 많으면 행의 수를 현재 열의 수와 동일하게 맞춰준다
else if (colNum > rowNum) {
while (arr.length < colNum) {
arr.push(new Array(colNum).fill(0));
}
}
return arr;
}
이차원 배열 대각선 순회하기
처음 코드
function solution(board, k) {
var answer = 0;
for (let i = 0; i < board.length; i++){
for (let j = 0; j < i; j++){
if (i + j <= k){
answer += board[i][j];
}
}
}
return answer;
}
여기서 두 번째 for문의 조건에 문제가 있습니다!
j가 i보다 작을 때만 반복하도록 설정하면 j가 i보다 작을 때만 반복하게 되므로 이렇게 하면 안됩니다 ㅎㅎ
제출 코드
function solution(board, k) {
var answer = 0;
for (let i = 0; i < board.length; i++){
for (let j = 0; j < board[i].length; j++){
if (i + j <= k){
answer += board[i][j];
}
}
}
return answer;
}
이걸로 기초 문제를 끝냈어요 ~~~ ( ´͈ ꇴ `͈)੭⁾⁾·°˖✧˖°
12월19일
[PCCP 기출문제] 1번 / 붕대 감기
내 풀이
function solution(bandage, health, attacks) {
let time = 0;
const [t, heal, y] = bandage;
let currentHealth = health;
let continuousSuccess = 0; // 연속 성공 횟수
const maxHealth = health;
attacks.sort((a, b) => b[0] - a[0]);
const lastAttackTime = attacks[0][0];
for (time = 0; time <= lastAttackTime; time++) {
let isAttacked = false; // 몬스터의 공격을 받았는지 여부
// 공격 시간에 따라 현재 체력 갱신
for (let i = 0; i < attacks.length; i++) {
if (time === attacks[i][0]) {
currentHealth -= attacks[i][1];
isAttacked = true; // 공격을 받음
continuousSuccess = 0; // 공격 받으면 연속 성공 초기화
}
}
// 연속으로 붕대 감기를 성공한 경우
if (!isAttacked && currentHealth < maxHealth) {
currentHealth += heal;
continuousSuccess++;
// 붕대 감기로 회복한 경우 추가 회복량 적용
if (continuousSuccess === t) {
currentHealth += y;
continuousSuccess = 0; // 추가 회복 적용 후 연속 성공 초기화
}
// 최대 체력 초과 방지
if (currentHealth > maxHealth) {
currentHealth = maxHealth;
}
}
// 현재 체력이 0 이하라면 -1 반환 후 종료
if (currentHealth <= 0) {
return -1;
}
}
return currentHealth; // 마지막 공격 시간 이후 남은 체력 반환
}
처음에는 while문을 사용해서 time <= lastAttackTime 의 조건을 걸고, time++로 시간을 증가시키는 코드를 작성했는데
몇 테스트 케이스가 계속 통과하지 못했습니다 ..
찾아보니 for문을 사용해 time을 증감식으로 작성하면 루프가 반복 될 때 마다 조건을 검사하고 time이 증가하는데,
while문을 저렇게 작성하면 이미 time이 증가하고 조건을 보게 되어 문제가 발생한다고 합니다 !
또 continuousSuccess = 0으로 추가 회복을 적용 한 후 연속 성공 변수를 초기화 시켜주는걸 생각도 못하고 있어서 계속 테스트 케이스를 통과하지 못했네요 ,,, ㅎㅎ,,,,,,,,,
짝수와 홀수
내 풀이
function solution(num) {
return num % 2 == 0 ? "Even" : "Odd";
}
약수의 합
내 풀이
function solution(n) {
let answer = 0;
for (let num = 1; num <= n; num++){
if (n % num === 0){
answer += num
}
}
return answer;
}
12월21일
나머지가 1이 되는 수 찾기
내 풀이
function solution(n) {
for (let i = 0; i < n; i++){
if (n % i == 1){
return i;
}
}
}
다른 사람의 풀이
function solution(n, x = 1) {
while (x++) {
if (n % x === 1) {
return x;
}
}
}
while문 조건으로 증감을 넣을수 있다는 사실을 알았다 !!
문자열을 정수로 바꾸기
내 풀이
function solution(s) {
return Number(s);
}
평균 구하기
내 풀이
function solution(arr) {
let answer = 0;
arr.forEach((value) => {
answer += value;
})
const avg = answer / arr.length;
return avg;
}
최댓값과 최솟값
내 풀이
function solution(s) {
const arr = s.split(" ").map(Number);
const max = Math.max(...arr);
const min = Math.min(...arr);
return `${min} ${max}`;
}
템플릿 리터럴 사용
다른 사람의 풀이
function solution(s) {
const arr = s.split(' ');
return Math.min(...arr)+' '+Math.max(...arr);
}
문자열인데 max, min 사용이 된다니요,,,
자유로운 우릴 봐 자유로워
JadenCase 문자열 만들기
내 풀이
function solution(s) {
const words = s.toLowerCase().split(" ");
for (let i = 0; i < words.length; i++) {
if (words[i].length > 0) {
words[i] = words[i][0].toUpperCase() + words[i].substring(1);
}
}
return words.join(" ");
}
맨 첫 글자만 대문자로 바꾸고 substring(1)로 인덱스 1부터 문자열 끝까지를 반환한다.
12월23일
최솟값 만들기
내 풀이
function solution(A,B){
A.sort((a, b) => a - b); // 오름차순 정렬
B.sort((a, b) => b - a); // 내림차순 정렬
let answer = 0;
for(let i = 0; i < A.length; i++){
answer += A[i] * B[i];
}
return answer;
}
배열에서 가장 큰 값, 다음 배열에서 가장 작은 값을 곱해주면 되므로 정반대로 정렬 한 뒤 곱한다.
이진 변환 반복하기
12월25일
타겟 넘버(DFS탐색)
내 풀이(한 50퍼만)
function solution(numbers, target) {
let answer = 0;
const dfs = (idx, sum) => {
if(idx === numbers.length) {
if(sum === target) {
answer++;
}
return;
}
// 현재 숫자를 더하거나 빼는 경우를 재귀탐색
dfs(idx + 1, sum + numbers[idx]);
dfs(idx + 1, sum - numbers[idx]);
};
dfs(0, 0);
return answer;
}
입력값이 [4, 1, 2, 1] , 4 인 경우에
'javascript' 카테고리의 다른 글
[프로그래머스] 12월26일 ~ 12월30일 (0) | 2023.12.26 |
---|---|
[프로그래머스] 게임 맵 최단거리(BFS) (0) | 2023.12.26 |
[프로그래머스] 정수를 나선형으로 배치하기 (1) | 2023.12.17 |
[프로그래머스] 12월11일 ~ 12월17일 (0) | 2023.12.11 |
[프로그래머스] 12월04일 ~ 12월10일 (0) | 2023.12.04 |