캠프 시작과 동시에 진행됐던 첫 번째 프로젝트가 끝났다.

 

최종 제출한 페이지의 모습

 

 

 

 

 

 

초안과 비교하면 어마어마한 차이를 볼 수 있다.

 

내가 쓰고, 가져오고, 붙인 코드뭉치들

 

중구 난방의 함수명과 변수명,

가독성이 떨어지는 코드 배치,

나름대로 험난했던 과정을 표현한 것일지도 모른다..

 

 

 

프로젝트를 마치며 ...

 

캠프 시작과 동시에 진행된 프로젝트이니 만큼,

마음의 준비가 안된 상태인데다, 코딩에 관한 지식도 너무 부족했다.

 

하지만, 시간이 지나, 뼈대가 잡히자

의외로 순조롭게 프로젝트가 진행되었다.

 

구현 가능할까 걱정이었던 crud 부분도

Update 부분을 제외하고는 잘 작동했다.

 

 

 

Delete  기능을 어떻게 작동시킬까 하는 부분에서 

버튼 자체에 ID값을 넣을 수 있다는 부분은 나름대로 충격이었다.

 

 

프로젝트 중간중간 안풀리는 부분에 있어서는 GPT 를 활용하기도 했는데,

 

기술이 많이 발전했다는걸 뼈부터 느낄 수 있었다.

 

 GPT를 원하는 코드를 짜주는 기계가 아닌,

모르는 부분을 대답해주는 선생으로 생각한다면 계속 활용하는것도 나쁘지 않다고 생각한다.

 

팀 프로젝트 4일차 !

 

내일이 발표이기 때문에 사실상 작업 마지막 날이다.

오늘까지 작업물을 완성하고

시연 영상 제작과 발표자 선정도 필요하다.

(나만 아니면 돼)

 

 

 

1. 수정과 삭제 기능

 

어제 보류했던 기능을 마저 구현해보기로 했다.

나의 역할 중 가장 중요한 부분이기 때문에 집중해 보기로 했다.

 

작동이 잘 안된다거나

데이터 베이스가 달라서 이해가 안되는 등

우여곡절이 많았으나

 

수소문 끝에 통해 방명록 등록 / 삭제 기능을 찾아내었다.

 

삭제 기능 구현에 대한 실마리를 찾은것이다 !

 

 

 

삭제 버튼으로 해당 메세지를 삭제하는기능까지 정상적으로 작동했다.

 

 

중요한 부분을 짚고 넘어가면

                <button class="deleteButton" onclick="deleteEntry('${doc.id}')">삭제</button>

 

데이터를 불러와 메시지를 띄우는 시점에 버튼을 추가하며

해당 버튼은 온클릭= 함수(doc.id) =   파이어 베이스 문서 부분의 id 를 지정한다

 

window.deleteEntry = async (entryId) => {
    if (confirm("이 항목을 삭제하시겠습니까?")) {
        await deleteGuestBookEntry(entryId);
        displayGuestBookEntries(); // 방명록 목록 갱신
    }
};

 

클릭할 경우 deleteEntry함수로 confirm 확인을 한 후에

확인인 경우 deleteGuestBookEntry 함수를 적용한다... 

 

async function deleteGuestBookEntry(entryId) {
    try {
        const docRef = doc(db, "guestBook", entryId);
        await deleteDoc(docRef);
        console.log(`Guest book entry with ID ${entryId} has been deleted.`);
    } catch (error) {
        console.error("Error deleting guest book entry:", error);
    }
}

 

어....... 아직 이해하기가 힘든 코드지만,

대략적으로  deleteDoc을 적용해  db 에서 -> guestBook 에 있는 -> entryId 를 가진 데이터를 삭제한다...

 

 

삭제가 잘 작동하는 모습

 

이제 작업물에 적당히 적용하기만 하면 된다.

 

잘 작동하는 코드를 가져다 쓰는건 크게 어렵지 않다.

 

위의 방명록 코드에서 삭제 부분만 따온뒤 

버튼 부분에 같은 기능을 하는 함수를 달아주면 된다!

(함수명 변수명은 ... 따로 건드리지 않았다)

 

    // 멤버 삭제 함수
    async function deleteGuestBookEntry(entryId) {
      const docRef = doc(db, "ctrl_cv", entryId);
      await deleteDoc(docRef);

    }

    // 멤버 삭제 클릭
    window.deleteEntry = async (entryId) => {
      if (confirm("이 멤버를 삭제하시겠습니까?")) {
        await deleteGuestBookEntry(entryId);
        window.location.reload();
      }
    };

불필요한 부분을 적당히 날려주고

                <button onclick="deleteEntry('${doc.id}')">삭제</button>

 

생성되는 버튼에 함수를 달아주면 된다.

 

잘 작동한다 !

 

 

아무튼 삭제된 모습

 

 

 

남는 시간을 활용해

암호를 맞춰야 멤버 생성이 가능하도록 기능을 추가해 보았다.

 

      const makemempa = document.getElementById("makemempass").value

 

makemempa 변수에 

        <input type="password" id="makemempass" placeholder="암호 입력">

 

암호 입력에 적은 숫자를 대입한다. ( 좀 더 직접적으로는 안되는걸까?)

 

if (makemempa !== '1234') {
        alert("올바른 암호를 입력해 주세요.");
   return;

멤버 생성 할 때, 비밀번호 (1234) 를 체크 한 후  아닌 경우  return; 으로 멤버 생성을 중단해주면 완성?

 

 

아주 낮은 수준이겠지만 잘 작동한다 .

1234 이외를 쓴 경우

 

 

1234 를 입력한 경우

 

 

1234를 입력한 경우에는 기존처럼 멤버 생성이 잘 작동하는걸 확인할 수 있었다.

 

 

수정기능도 비슷한 방향으로 구현이 가능할 것 같으나, 

시간 관계상 제외하는 방향으로 가기로 결정했다.

 

다행히 기능구현 부분은 성공적으로 마무리했다. 

 

 

 

최종 완성본 ! 

 

프로젝트 진행상황

뭔가 ..뭔가 일어나고 있음

 

 

 

오늘 목표는 총 3가지이다.

 

1. 멤버 상세보기 작업

2. 멤버 등록하기 기능

3. 수정과 삭제 기능

 

 

 

 

1. 멤버 상세보기 작업

 

멤머 상세보기를 어떻게 만들까 부터 문제였다.

새 페이지 에서 띄우는 방법, 팝업창 으로 띄우는 방법, 모달을 이용해서 띄우는 방법.

 

새 페이지에서 띄우는 방법은 일단 제외했다.

상세보기와 어울리는 방식이 아닐 뿐더러 번거로운건 마찬가지다.

 

모달은 멤버 등록하기 기능에 사용할 예정이기 때문에 팝업창으로 만들어 보았다.

 

 

 

 

 

어디선가 풍겨오는 금단의 향기...

네비게이션 탭 부분을 만드는게 너무나 힘들었던 나머지 GPT의 힘을 빌렸다.

 

 

그 외에도, 간단 할 것만 같던 작업이

그저, 내용배치를 좌 우로 하는것만 해도 css를 이리저리 만져봐야 했고,

직접 네이게이션 탭을 만들어 보다가 계속된 실패에 시간이 많이 소모됐다.

 

그래도, 어찌어찌 완성이 되었고, 시간이 남을때 네비게이션 탭 부분의 구성을

자세히 뜯어봐야 할 것 같다.

 

 

2. 멤버 등록하기 기능

 

 

생각보다 모달창의 구현이 복잡했다.

html, css, js 모든 부분에서 정교하게 코드를 짜야 작동을 한다.

 

멤버 생성도 잘 작동한다.

 

웹개발 강의에서 알려준 그대로, 파이어 베이스를 통해 데이터를 저장하고 불러오게 만들었다.

 

3. 수정과 삭제 기능

 

수정과 삭제 기능을 등록한 멤버카드에 적용하게 하려고 했으나, 너무나 큰 벽이었다.

 

강의에서 알려주지 않은 부분이기에 더욱 진전이 되지 않았다.

 

파이어 베이스 기준으로, 

삭제 버튼을 눌렀을 경우, 해당 문서 데이터가 통째로 삭제되어야 하는데

 

어떻게 버튼과 해당 데이터를 연결시키고 특정할 수 있을지? 

이런 방식으로 작동되는게 맞기는 한건지 조차 알 수 없었다.

 

급한 불은 모두 꺼진것 같으니, 내일 이어서 알아보도록 하자.

 

 

[왕초보] 웹개발 종합반  5주차

해당 강의를 모두 들었다.

 

혹시 모른다.

강의 마지막 주차인 5주차에 중요한 내용이 몰아져 있기 때문에

프로젝트 진행에 어려움을 느끼고 있는걸지도??

 

 

5주차 강의 내용은,

1. 파이어 베이스를 이용하여 서버와 상호작용하는 웹페이지를 만드는 것

2. Github 를 통해 만들어진 코드를 배포하는것 

그리고  파이썬 맛보기가 있었으나, 너무 맛보기 였기에 잊혀졌다.

 

 

드디어, 데이터 베이스 서버를 통해 새로고침을 해도 정보가 유지되는

역사적인 순간이 됐다.

 

 

↑  firebase 와  js가 손을 잡는 순간

 

물론 그 과정에서 완벽히 이해하지 못하고, 그저 복붙하는 코드도 많았지만

객관적으로 봐도 그건 힘든일이 아닌가..?

 

 

 

이제 기록하기 버튼을 통해 생성된 데이터는 더 이상, 새로고침 해도 휘발되지 않는다.

 

또한, Github 를 통해 해당 페이지를 공유를 했더니 

 

페이지에 정체 불명의 이메일들이 우후죽순 생겨났다

 

 

누구나 접근 가능한 깃허브 리포지토리에, 누구나 사용할 수 있는 '기록하기' 기능이기 때문인듯 하다.

 

(인간 외의 영향이 있을지도... ㄷㄷ)

 

 

아무튼간에... , 이것으로

[왕초보] 웹개발 종합반  학습은 끝났다 !

 

 

다시 팀 프로젝트로 돌아와서,

오늘은 Github 에 대한 실시간 강의가 있었다. 

 

 

 

팀 프로젝트를 위한 리포지토리가 만들어졌다.

브랜치 까지 !!

 

앞으로 각자 만든 작업물을 git 을 통해 공유하고 수정하게 될 듯 하다.

 

 

 

일단, html과 css 작업으로 어느정도 뼈대를 만들었다...

 

사실, 뼈대를 만들었다기 보다

웹개발 강의를 복습하고,

 

팀원 회의간에 내가 생각하는 기능과 구현난이도에 대해

논의를 하기 위해 그냥 가시용 자료? 정도 였는데 

 

생각보다 반응이 좋아서 이 뼈대를 토대로 웹페이지를 만들게 될 것 같다.

괜찮은거겠지...?

 

 

아무튼, 프로젝트가 잘 진행될것 같은 느낌이 든다 !

 

드디어 사전캠프기간이 지나고 본 캠프가 시작되었다.

 

본 캠프 OT를 듣고난 후 새로운 팀 편성에 따라

새로운 팀원들을 만나 볼 수 있었다.

 

첫날에 뭘 하게 될까?

 

두근 거릴 새도 없이 바로 프로젝트를 시작하게 되었다.

 

 

 

심지어 그냥 프로젝트도 아니고

웹 페이지를 만드는 팀 프로젝트 였다.

 

금요일 까지, 팀원 소개를 하는 웹 페이지를 만드는 것.

 

사실, 그다지 어려운 일은 아니다.

 

사전캠프 때 배운 내용대로, html~~ css 복사 붙여넣기로 

상황에 맞게 코드를 때려넣으면, 자료 취합한 당일날 끝날 일이다.

 

서버를 이용하지 않아도 된다면 말이다

 

이번 프로젝트는 데이터베이스와 상호하여 텍스트와 이미지를 불러오고

수정과 삭제, 저장 또한 가능해야 하기 때문에,  ( CRUD 구현 필수 )

반드시 서버를 통해야 한다.

 

게다가, 오늘 당장 해야할 일은 

 

1. 와이어 프레임 

2. API 명세서 

3. ERD 

 

세 가지를 오늘 내로 끝내야 한다.

 

저 세 가지를 전부 전혀 모르는 상태이기 때문에 학습과 동시에 작업이 진행 되어야 했다.

 

1. 와이어 프레임

 

 

와이어 프레임은,

프론트 엔드의 영역으로, 보여지게 될 내용들을 간락하게 표현한 것이다.

만화로 치면 콘티와 같다고 볼 수 있다.

만들어질 웹 페이지가 어떠한 형태를 가지고 있는지 간략하게 그려내는 것

 

2.  API 명세서 

 

 

API 명세서는 우리가 만드는 웹 페이지가 원하는대로 작동하기 위해서

서버에게 어떤 데이터를 요구하고 받을 것인가 정리한 표라고 생각하면 된다. 

 

 

3. ERD 

ERD 에 대해서는 아직 확실하게 이해가 되지 않았다.

아무래도 SQL 의 데이터 베이스 방식이 생각나게 되는데, 

서버에 저장될 데이터들의 상관 관계에 따라 보기 쉽게(?) 다이어그램 식으로 정리한 것이다.

 

라고 하는데 아직 이해가 잘 안되는 부분이 많다. 

 

오늘 만든 ERD 이다.  기존에는 하나가 아닌 2개의 표로 나누어져,

 [멤버 상세 보기]  했을 경우 불러오게될 데이터가 따로 있었으나, 

 

피드백을 받은 이후,

메인 페이지를 띄우는 과정에서 전부 불러오게 만들어 구분이 필요 없어진 상태가 되었다.

 

프로그래밍 캠프를 일전에 진행한 팀원이 있어 어찌저찌 진행은 되었으나,

과연 이게 [왕초보] 웹개발 종합반을 막 마친 사람 네 명이 모여서

진행이 가능한 프로젝트인가 의구심이 들었다.

 

앞으로 얼마나 많은것을 배워야 하는지를 알려주는 본보기 같은것 일지도 모른다.

 

오랜만에 SQL 문제를 풀어보자

당장은 html 이나 javascript 쪽이 중요하지만

그래도 까먹지 않을 정도로만 SQL도 학습하려 한다.

 

 

성분으로 구분한 아이스크림 총 주문량

 

늘 하던대로, 테이블을 합치고 정렬을 하면 될듯하다.

 

딱히 함정은 없는듯해 보임

 

select  i.ingredient_type, sum(f.total_order) as TOTAL_ORDER
from first_half f left join icecream_info i on f.flavor = i.flavor
group by i.ingredient_type
order by f.total_order

 

역시, 간단한 문제였다

 

 

 

 

루시와 엘라 찾기

 

마찬가지로 간단한 문제인데,

여러 이름을 찾아야 하기 때문에 

where name like 를 여러번 적는것 보다 

 

where name in  을 써주면 간단하다.

select animal_id, name, sex_upon_intake
from animal_ins
where name in ('Lucy','Ella','Pickle','Rogan','Sabrina','Mitty')
order by 1

 

 

'사전캠프' 카테고리의 다른 글

27일차 - 알고리즘 풀이  (0) 2024.07.29
26일차 - 알고리즘 풀이  (0) 2024.07.25
25일차 - 알고리즘 풀이  (3) 2024.07.24
24일차 - 알고리즘 풀이  (1) 2024.07.23
23일차 - 알고리즘 풀이  (3) 2024.07.22

 

행렬의 덧셈

 

행렬이란게 처음 나왔다.

아마 JS의 새로운 배열방식 이라기 보다는

그냥 평범한 배열중 하나라고 생각하는게 좋을 듯 하다.

 

arr1 =  [[1,2],[2,3]]   일때

arr1[0] =  [1,2]     ///   arr1[1] = [2,3]   라는 것 !

 

더더 중요한것은 

arr1[0][0]  =  1    이라는것으로

배열안의 배열을 지정할 수 있게 된다는 것

 

그럼 문제를 다시 풀어보자.

일단 arr1[0][0] + arr2[0][0] = return[0][0]  을 시작으로

 arr1[0][1] + arr2[0][1] = return[0][1]  ...  다음

 arr1[1][0] + arr2[1][0] = return[1][0]   

이런식의 반복과 적절히 [ ] , [ ] 나눠주는 작업이 필요하겠다

 

저런류의 반복은 이미 이중 for문 으로 해결한 바 있다.

 

당장 문제는 행렬을 더해주는 방법보다는 

더한값을 행렬처럼 만드는 방법을 알아내야 한다.

 

제일 간단한 방법은 

[0][0] 결과 값, [0][1] 결과값 을 배열에 push 해서 행렬을 만드는 법

 

function solution(arr1, arr2) {
    var answer = [];
    for(let i =0; i < arr1.length ; i++) {
        var ans = [];
        for( let j = 0; j < arr1[i].length ; j++) {
            
            ans.push(arr1[i][j] + arr2[i][j]) 
        }
        answer.push(ans);
    }
    return answer;
}

 

완성된 코드는 이러하다

 

결과적으로 

j 반복문으로 

arr1[i][j] + arr2[i][j] 의 값 ans 가  answer [ ]  에 push 되면서   [[ ans[0], ans[1]]]  를 만들고

i 반복문으로 돌아와서

var = ans 로 ans 값이 초기화되고 

다시 j 로 넘어가서 arr[1] 로 넘어가게 된다 .

 

그렇게 해서

[ [arr[0]] , [arr[1]] ]   과 같이 행렬로 만들 수 있게 된다.

 

글로 설명하려니까 오히려 복잡해진 느낌인데, 

 

행렬은 배열 안에 배열이 있는 형태이고, 

배열 arr [a][b].... 으로 배열내의 배열의 index 를 지정할 수 있다.

 

이런 배열을

2차원 배열 ( 다차원 배열)

이라고 하며, 이러한 2차원 배열의 데이터를 활용하기 위해선 

거의 필수적으로 for 문 또한 2차원이 되어야 할 것이다.

 

 

 

 

 

'사전캠프' 카테고리의 다른 글

28일차 - SQL 문제 풀이  (0) 2024.07.30
26일차 - 알고리즘 풀이  (0) 2024.07.25
25일차 - 알고리즘 풀이  (3) 2024.07.24
24일차 - 알고리즘 풀이  (1) 2024.07.23
23일차 - 알고리즘 풀이  (3) 2024.07.22

알고리즘 풀다 죽은 개발자가 때깔도 곱다

 

1. 문자열 내림차순으로 배치하기

 

간단하고 쉬워보이는 문제이다

이전에 풀었던 정수 내림차순으로 나열하기 와 같은 맥락이다

 

sort  정렬 시 대문자가 소문자 앞에 오던가 뒤에 오던가 헷갈리는 부분이 있긴한데...

해보면 알 것이다

function solution(s) {
    s= s.split('').sort();
    return s
}

 

대문자가 소문자보다 앞에 오기 때문에 다행이다.

이러면 여기서 역순 reverse 적용하고 join하면 끝이다

 

function solution(s) {
    s= s.split('').sort().reverse().join('');
    return s
}

 

 

 

2. 부족한 금액 계산하기

 

1회 이용시마다 기본 금액에 무려 100% 할증이 붙는 놀이공원이 되었다

 

내가 생각 한 방법은

반복문으로 count 까지의 총 요금을 구하고, 

소지금 money 에서 총 요금을 뺀 결과가 0 이상이면 0으로 출력,

음수면 (-) 부호만 떼줘서 출력 이다.

 

여기서, 음수 부호만 떼는법만 배워오면 될듯하다

 

Math.abs();   

=  () 내의 수가 음수일 경우 양수로 바꿔준다

 

function solution(price, money, count) {
    var answer = 0;
    for(var i = 1; i <= count ; i++) {
        answer += price * i
    }
    answer = money - answer >= 0 ? 0 : Math.abs(money- answer);
    return answer;
}

위에서 설명한 그대로의 코드가 되었다

 

상당히 부끄럽게도, Math.abs는 필요가 없었다

부족한 금액에 초점을 맞춘 나머지 -를 지워야 한다는 생각을 했는데,

 

애초에  money - answer 가 음수인 경우라면,  answer -money 를 하면 양수로 나오는 것이었다

    return money - answer >= 0 ? 0 : answer - money;

이렇게 !

 

 

 

3.  문자열 다루기 기본

 

 

갑자기 '기본' 이라는 문제가 튀어나온걸 보니

아직 못배운 영역이 나왔을것이 분명하다.

 

아니나 다를까, 간단해보이는 문제이지만 어떻게 해결해야 할 지 모르겠다.

길이 4 || 6 체크는 쉽겠지만, 문자열을 포함할때 true false를 나누는 법을 모르겠다

 

답을 알아내기 위해 검색을 하다가

 

parseInt();  를 활용하는 것을 보았다.

parseInt() 는 , 문자열을 숫자로 반환하는, 기존에 알고있던 함수이다.

 

여기서 중요한건, parseInt() 는 정확하게 

(숫자로 바꿀수 있는것) ~ (숫자로 바꿀 수 있는것) 까지만 반환한다.

즉 "a123" 처럼 알파벳으로 시작하는 경우 반환될 값이 없어  NaN 가 출력된다.

"123a456" 의 경우, 알파벳 a의 이전까지인 123 까지만 반환이 된다.

 

이 문제를 풀기 위한 핵심은

숫자 이외 불순물이 하나라도 있다면 기존의 값과 달라진다는 것이다.

"a123" == parseInt("a123")    ==> false 라는 말이다

이것으로 문자열을 포함하는지를 체크할 수 있다.

최선인지는 모르겠지만 말이다

 

function solution(s) {
    var answer = 0;
    if ( s.length == 6 || s.length ==4 ) {
        if ( s == parseInt(s)) { return true}
        else return false;
    }
        else return false;
    return answer;
}

 

쓰이지도 않은 answer 를 버리고 

조건문을 조금 깔끔하게 고치면

 

function solution(s) {
    if((s.length == 4 || s.length ==6) && (s == parseInt(s))) { return true}
     else return false;
}

 

 

를  삼항연산자로

function solution(s) {
    return (s.length ==4 || s.length == 6) && (s== parseInt(s)) ? true : false
}

 

이렇게 쓸 수 있다..

 

 

'사전캠프' 카테고리의 다른 글

28일차 - SQL 문제 풀이  (0) 2024.07.30
27일차 - 알고리즘 풀이  (0) 2024.07.29
25일차 - 알고리즘 풀이  (3) 2024.07.24
24일차 - 알고리즘 풀이  (1) 2024.07.23
23일차 - 알고리즘 풀이  (3) 2024.07.22

1. 가운데 글자 가져오기

 

s.length 가 짝수인 경우와

s.length 가 홀수인 경우를 구분해서 어찌 저찌 하면 될듯하다

function solution(s) {
    var sl = Math.floor(s.length/2)
    return s.length % 2 == 0 ? s[sl-1]+s[sl] : s[sl];
}

그다지 어려운 문제가 아니었으므로 자세한 내용은 생략한다

슬슬

홀수 짝수를 %2 =0  으로 구분하는것이 뭔가 좀 아쉽긴한데..

 

 

 

2. 수박수박수박...

가장 먼저 생각난 방법은

for문으로 n 까지 홀수짝수로 반복을 하면 될듯 하다

 

function solution(n) {
    var answer = '';
    for( var i = 0; i < n; i++) {
        answer = i % 2 == 0? answer + "수" : answer+"박" ;
    }
    return answer;
}

뭔가... 아쉬운 코드

 

 

일단 새로운 함수

.repeat 을 배워왔다

string.repeat() 은 () 안의 횟수만큼 stirng 을 반복하여 출력해주는 함수이다.

단순히 string을 여러번 반복해야할 경우 for 문을 사용하지 않아도 된다.

function solution(n) {
    var answer = '';
    answer = n % 2 == 0 ? "수박".repeat(n/2) : "수박".repeat(Math.floor(n/2))+"수"
    return answer;
}

 

좀 그럴싸 해지긴 했지만 역시  % 2 ==0  의 늪에선 빠져 나올순 없다

 

 

 

3. 내 적 

 

내적이 뭘까

 

my enemy 인가

 

정의를 찾아봐도 무슨 말인지 알 수가 없다

 

 

 

아무튼간에 같은 인덱스 끼리 곱하고 나온걸 다 합해주면 된다고 한다..

수학이 필요하다면 배워야겠지만 이건 논외인것 같다.

function solution(a, b) {
    var answer = 0;
    for(let i = 0; i < a.length; i++) {
        answer += a[i] * b[i];
    }
    return answer;
}

 

모든 배열 순회 이기 때문에

for ( var i in a) {} 또한 사용할 수 있다.

a의 인덱스인 0 1 2 3이 i 에 들어가며 반복된다

 

4. 약수의 개수와 덧셈

 

오늘..

풀이가 좀 수월했던 관계로 한문제 더  풀려고 했는데 불안한 녀석이 걸렸다.

 

아는방법대로 하면 분명 괴짜 코드가 나올것 같은 예감이 들지만

 

일단 해보는 수밖에 없다

function solution(left, right) {
    var answer = 0; 
    let ia = 0; // 약수의 개수를 카운트할 임의 변수
    for( var i = left; i <= right ; i++ ) { // left ~ right 까지의 연산이 필요
        for( var j = 1; j <= i; j++) {   // left부터 약수의 숫자를 구한다
            if(i % j == 0) { ia += 1 ;}  // 약수로 나눈경우 ia 를 +1 
        }
        answer = ia % 2 == 0 ? answer + i : answer - i // ia 가 홀수 짝수일 때 각각 -i +i 연산
        ia = 0; // ia 카운트 초기화
    }
    return answer
}

 

약수의 개수를 카운트할 ia 변수를 만들어 주고

for문 2개를 돌려서

left (i) 의 약수의 숫자를 구하고 그 갯수가 홀수일때와 짝수일 때  + - 연산을 해준뒤 임의로 ia를 초기화

left (i) 를 1씩 늘려가며 i == right 까지 반복 하는 !!

 

작동이 잘 되다니 오히려 놀랐다 

' 그래도 모자란 코드'  라는 생각과 '뿌듯함'   이 교차한다

 

 

 

 

 

'사전캠프' 카테고리의 다른 글

27일차 - 알고리즘 풀이  (0) 2024.07.29
26일차 - 알고리즘 풀이  (0) 2024.07.25
24일차 - 알고리즘 풀이  (1) 2024.07.23
23일차 - 알고리즘 풀이  (3) 2024.07.22
22일차 - 알고리즘 풀이  (0) 2024.07.19

 

이제 학습의 시작을 알고리즘으로 하는것에 익숙해졌다.

 

학습이 건강해지고 있다는것....

 

 

1. 핸드폰 번호 가리기

 

그다지 어렵지 않은 문제이다. (엄청 헤맸음)

 

반복문을 이용해서 문자열 phone_number를 순회하여 length -4 까지는 * 로, 그외는 그대로 출력해주면 된다

function solution(phone_number) {
    var answer = '';
    for(var i = 0; i < phone_number.length; i++ ) {
     answer = i < phone_number.length - 4 ? answer + '*' : answer + phone_number[i] ;
    }
    return answer;
}

 

 

 

2. 없는 숫자 더하기

 

function solution(numbers) {
    var answer = 0;
    for( var i = 0; i < numbers.length; i ++) {
        answer += numbers[i]
    }
    return 45 - answer;
}

배열의 모든 숫자를 더하고 0~9 의 합인 45에서 빼는 코드를 만들었다.

 

아무래도 (야매)

정답으로 인정받기엔 어려운 답지라고 생각한다.

 

 

.includes() 함수  를 데려오도록 하자

이걸 이용하면 훨씬 그럴싸 한 코드를 만들 수 있다.

 

function solution(numbers) {
    var answer = 0;
    for ( var i = 1; i < 10; i ++) {
        if(!numbers.includes(i)) { answer +=i} 
    }
    return answer;
}

1~9 까지의 숫자를 number가 포함되어 있는지를 체크한 뒤  없는경우 ( ! ) 만 answer 에 더해준다.

 

 

 

3. 제일 작은 수 제거하기

 

우선 아는것만 가지고 풀어보자..

 

function solution(arr) {
    var answer = [];
    for( var i = 0; i < arr.length ; i++) {
        if(arr[i] != Math.min(...arr) ) { answer.push(arr[i])}
    }
    return answer < 1 ? [-1] : answer;
}

 

arr을 순회하여 arr의 최소값이 아닌경우 answer 에 push 한다.

그리고 answer 값이 없는경우 [-1] 을 리턴하고 아닌경우 answer 를 그대로 리턴...

 

 

통과는 되는데, 테스트1의 지연시간이 심상치가 않다.

아마도, arr.length 가 엄청나게 큰 경우인 듯 하다.

 

검색 해본결과, index값을 찾기 위한 for 노가다를 할 필요가 없이

 

 

indexOf() 함수를 사용하면 된다

이 문제는 사실상 Math.min() 과 indexOf() 를 위한 문제였던것

 

function solution(arr) {
    if(arr.length == 1) { return [-1]}
    arr.splice(arr.indexOf(Math.min(...arr)), 1)
    return arr;
}

우선 [-1] 이 리턴될 경우는 arr.length 가 1인 경우 뿐이므로 미리 리턴해버린다

그 후 arr 배열에서 가장 작은 수의 index 값을 splice 로 날려주면 끝이다 !

 

 

'사전캠프' 카테고리의 다른 글

26일차 - 알고리즘 풀이  (0) 2024.07.25
25일차 - 알고리즘 풀이  (3) 2024.07.24
23일차 - 알고리즘 풀이  (3) 2024.07.22
22일차 - 알고리즘 풀이  (0) 2024.07.19
21일차 - Javascript 입문 수업  (0) 2024.07.18

+ Recent posts