반응형

현대캐피탈 코딩테스트에 합격하고 인적성 안내 연락을 받았다. 인적성은 LG, 기업은행 이후로 처음으로 보는 데 너무 싫다. 개발자인 내가 왜!! 인적성을 봐야하는가?

 

여튼, 안내문을 보아하니 10 ~ 12:20분 사이에 적성, 인성 순서로 본다고 한다. 근데 적성 문제는 "눈" 으로 "손" 도 못대고 풀어야 한다는점?! 그 흔한 계산기도 주어지지 않는다. 아니 이럴수가 눈으로 수학문제 추리문제를 풀어야한다니.. 추리에 너무나도 약한 나에게 이건 천벌이었다.

 

부랴부랴 후기를 찾아보니 뭔 후기가 2개밖에 없다. 그래도 이 후기가 없었다면 나는 준비조차 제대로 하지 못했을 것이다.

 

https://community.linkareer.com/starter_review/2331715

 

[현대캐피탈] 하반기 인적성 합격 후기 "추리 문제 OO랑 비슷함" - 링커리어 커뮤니티

🎯현대캐피탈 공고 보러가기 🎯현재 모집중인 신입 공고 보러가기 🎯인적성/필기 후기 보러가기 🎯신입 합격 자기소개서 보러가기 남자친구가 현대캐피탈 서류, 인적성 둘다 대신 확인했다.

community.linkareer.com

 

https://community.linkareer.com/starter_review/2880819

 

[현대캐피탈] 2023 하반기 신입 인적성 후기 - 링커리어 커뮤니티

🌱대학생고민방 🌱취업/문과 고민방 🌱SK멘토질문방 🌱LG멘토질문방 🌱취업/이과고민방 🌱직장인고민방 🌱삼성멘토질문방 🌱현대멘토질문방   🎯현대캐피탈 공고 보러 가기 🎯현재 모.

community.linkareer.com

 

후기에 나온대로 skct 와 개별적으로 hmat 기출을 풀기로했다. 온라인으로 눈으로 푸는것을 고려해 ebook으로 구매해 공부를 하기로 했다.

 

 

 

SKCT 는 후기에서 나온 것 처럼 온라인으로 보는 시험으로 현대캐피탈과 비슷한 느낌을 받았다고 나와 풀게 되었다. 20문제를 15분내로 풀어야하는데 속도가 중요한게 그래도 도움이 되었던 것 같다.

 

HMAT 기출은 중간에 현대캐피탈 기출이 나온다. 시험 본 후기로는 전개도 유형과 수열, 수리 쪽이 도움이 됐다. 확실히 전개도 유형 문제가 많이 없다보니 도움이 되었던 것 같다.

 

특히 두번째 후기 작성자 분이 말한대로 거의 똑같이 유형이 나왔다. 유형은 총 6가지로 구성되어서 나왔다.

적성


  1. 언어 추리(어휘)
  2. 응용 수리
  3. 전개도
  4. 글자 찾기
  5. 수열
  6. 추리 문제
언어추리

언어 추리는 단어를 좀 많이 알면 좋았을 것 같다. 이해는 되는데 단어를 몰라서 애매하게 풀었던 것 같다.

응용 수리

확실히 방정식 문제나 등산로 문제를 눈으로 보고 풀어보는 연습이 부족했다. 나는 수리 문제를 풀면서 한 번 멘탈이 나가니 그 이후문제들을 거의 못풀었다. 하하;; 머릿속으로 분수 꼴 방정식을 풀려고하니 유독 준비를 적게 했던 파트라 그런지 머리가 안돌아가서 꼬여버렸다. ㅠ

전개도

전개도는 내가 자신있는 문제여서 그런지 다 풀 수 있었다.

글자 찾기

한 5 * 12 정도되는 테이블에서 똑같은 글자를 찾거나 없는 글자를 찾아야하는데 속독이 느린 나에게 너무 힘들었다. 2/3 정도만 풀었다.

수열

가장 쉬웠던 수열 문제

추리

추리는 정말 쥐약이다. 문제를 보고 상상하며 풀어야 하는데 기법을 잘모르는 탓인지 머릿속으로 상상하며 풀기가 어려웠다. 그놈의 거짓말하는 애들은 왜그러는거야 증말

인성


인성은 전에 현대 오토에버에서 본 기억을 토대로 보긴했는데.. 오픈채팅방에서는 현대가 인성으로도 많이 거른다고 하더라.. 그래도 '난 소신있게 하겠어!' 하면서 따로 연습은 안하고 바로 봤다. ㅋㅋㅋ

결과


운전하면서 갑자기 결과가 떴다길래 부랴부랴 차를 멈춰서 확인했다.

 

 

안가!!!!!!

반응형
반응형

오픈톡방에 눈에 띄는 한 채팅

What? 나의 쭈꾸미 메뉴 사이트는 vercel 로 배포가 되어있는데 링크를 타고 들어가보았다.

 

대충 알고보니 LG uplus 가 해당 도메인을 차단한듯 보인다. 그간 무슨 문제가 많았던 vercel .. 차단 엔딩이라니.. 언제 복구가 되려나? 당장 서비스가 완성되면 바로 사용해야하는데..

 

https://www.youtube.com/shorts/yWdFwIlsIqc

 

제로초님이 설명해주신 영상 참고해보자

 

나에게 선택지는 두 가지가 있다.

  1. 도메인 구입 후 적용
  2. 새로운 사이트에서 배포

도메인 구입


일단 나의 서비스도 아닐 뿐 더러 AWS 로 이것저것 귀찮게 해야하는게 싫었다. 또, 도메인 구입비용도 드는게 좀 그래서 선택하지 않았다.

새로운 사이트 배포


결국, 새로운 사이트에 배포를 하기로 결정했고, 저번에 한 번 이용한 적이 있는 Netlify에 배포하기로 결정했다.

 

vercel 과 비슷하게 깃헙과 연동 후 배포를 원하는 리파지터리를 선택하면 알아서 배포가 된다.

 

 

배포완료

 

반응형
반응형

배경


필자는 열정도 쭈꾸미 음식점에서 일하고 있다. 일을 하면서 외국인 손님이 하루에 한 팀은 꼭 오는 것을 알게 되었다. 일본인 비중이 많아 일본인 전용 메뉴판을 하나 만들어 두었다. 하지만, 가끔, 중국, 대만, 태국, 등 다양한 국적의 사람들이 오고 쭈꾸미라는 상상하기 어려운 음식을 사진없이 메뉴판만으로는 어렵다는 생각이 들었다. 메뉴판을 일일이 만들기 어려워 웹 사이트로 간단히 QR 코드 한방에 확인가능 하면 좋을 것 같아. 계획했다.

 

개발환경


프론트엔드 개발자를 목표로 하고 있기에 왠만하면 서버없이 구동을 하려고 한다. 혹시나, 서버를 사용할 수도 있기에 요새 배우고 있는 NextJS 를 이용하고자 한다. 배포 서버는 역시 무료 업체인 Vercel에 배포를 하려고 한다.

사용 프레임워크 : NextJS
배포 환경 : Vercel

 

요구사항


우선, 요구사항을 분석해보겠다.

  1. 외국인 손님을 위한 언어변환이 가능한 메뉴판
  2. 이해하기 쉬운 메뉴와 사진 제공

당장에 구현해야할 요구사항은 다음과 같다고 생각한다.

 

1. 언어변환


처음에는 실시간 변환을 하는게 어떨까 생각이 들었는데 Next에 대한 이해가 부족해서 그런지 Next i18 을 사용하기엔 조금 개발이 걸릴 것 같아 노가다로 진행하기로 했다.

 

Dropdown Button

 

한국어, 영어, 일본어, 중국어, 태국어 총 5가지 언어를 지원하기로 했다. 일해본 결과 5개언어면 될 것 같다.

"use client";

import { useRouter, usePathname } from "next/navigation";

type Language = 'ko' | 'en' | 'ja' | 'th' | 'ch';

type Props = {
    selectedLanguage: Language;
    setselectedLanguage: (language: Language) => void;
};


const MenuDropdown = ({ selectedLanguage, setSelectedLanguage }: Props) => {
    const router = useRouter();
    const changeLanguage = (lng: Language) => {
        setSelectedLanguage(lng);
    };
    return (
        <select
            value={selectedLanguage}
            onChange={(e) => changeLanguage(e.target.value as Language)}
            className="block  px-4 py-2 text-base text-gray-700 bg-white border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-primary-500 focus:border-primary-500"
        >
            <option value="ko">한국어</option>
            <option value="en">English</option>
            <option value="ja">日本語</option>
            <option value="ch">中國語</option>
            <option value="th">ภาษาไทย</option>
        </select>
    );
};

export default MenuDropdown;

 

이렇게 5개언어를 그다지 이쁘지 않은 드롭다운 디자인과 함께 배치해 보았다.

2. 메뉴카드


이제 사진과 함께 메뉴설명을 적을 차례. 직원 친구가 외국어 메뉴와 함께 한글도 있으면 주문받기 편할 것 같다고 말해줘 적용하기로 했다.

 

 

우선 결과물 부터

 

처음에는 언어별 메뉴판 데이터를 구성해보았다. ts 를 써서 그런지 타입 정의하는 것부터 해맸다.

const translations :MenuTranslations = {

    ko: {

        title: "3인 세트 메뉴",

        dishes: ["쭈꾸미 시그니처 세트", "쭈꾸미삼겹 시그니처 세트"],

        prices:["51,000원","55,000원"],

        imageUrl :[img,img2],

        discriptions:["철판 쭈꾸미2 + 우동사리 + 계란찜(치즈변경 +1,500) + 소금구이","철판 쭈꾸미삼겹2 + 우동사리 + 계란찜(치즈변경 +1,500) + 소금구이"],

        title2:"2인 세트 메뉴",

        dishes2: ["쭈꾸미 세트", "쭈꾸미삼겹 세트", "구이 세트"],

        prices2:["36,000원","40,000원","38,000원"],

        imageUrl2 :[img3,img4,img5],

        discriptions2:["철판 쭈꾸미2 + 우동사리 + 계란찜(치즈변경 +1,500)","철판 쭈꾸미삼겹살2 + 우동사리 + 계란찜(치즈변경 + 1,500)","택2 (소금/쭈삼(+2,000)/양념/꼼장어(+1,000) + 떡사리 + 계란찜(치즈변경 + 1,500)"],

        title33:"단품 메뉴",

        dishes33: ["철판 쭈꾸미", "철판 쭈꾸미 삼겹살", "소금구이", "쭈삼구이", "양념구이","꼼장어구이"],

        prices33:["14,000원","16,000원","15,000원","17,000원", "15,000원","16,000원"],

        imageUrl33 :[img6,img7,img8,img9,img10,img11],

        discriptions33:[],

        title3:"사이드 메뉴",

        dishes3: ["화산폭발계란찜", "화산폭발치즈계란찜", "깨불고기 주먹밥", "철판볶음밥", "볶음밥 치즈추가","바지락 백탕"],

        prices3:["5,000원","6,500원","5,000원","4,000원", "3,000원","8,000원"],

        imageUrl3 :[img12,img13,img14,img15,img16,img17],

        discriptions3:[],

        title4:"사리 메뉴",

        dishes4: ["우동 사리", "떡 사리", "치즈 사리", "삽겹 사리(200g)", "미나리 사리", "날치알"],

        prices4:["3,000원","3,000원","3,000원","6,000원","4,000원","3,000원"],

        imageUrl4 :[img18,img19,img20,img21,img22,img23],

        discriptions4:[],

        title5:"주류 / 음료",

        dishes5: ["소주(참이슬, 처음처럼, 진로, 새로)", "청하", "한라산","맥주(카스, 테라, 켈리, 크러시)","논알콜 맥주(칭따오, 하이네켄)","음료(콜라, 사이다, 제로콜라, 제로사이다)","하이볼","열정 하이볼"],

        prices5:["5,000원","6,000원","6,000원","5,000원","6,000원/8,000원","2,000원","8,000원","8,000원"],

        imageUrl5 :[img24,img25,img26,img27,img28,img29,img30,img31],

        discriptions5:[],

    },
    en:{
    //
    //
    }
    ...
    };

 

코드는 이렇게 달랑 하나지만 포맷을 자꾸 바꿔서 정말 힘들고 귀찮고 막그랬다. 이렇게 언어별로 다하니까 정말 가독성 떨어지는데 나중에 리팩토링을 하던가 해야겠다.

 

const MenuList = ({ selectedLanguage }: Props) => {

    const [menu, setMenu] = useState(translations[selectedLanguage] || defaultMenu);



    useEffect(() => {

        setMenu(translations[selectedLanguage] || defaultMenu);

    }, [selectedLanguage]);



    return (

        <div className="space-y-8">

            {[menu.title, menu.title2,menu.title33, menu.title3, menu.title4, menu.title5].map((title, index) => (

                <div key={index}>

                    <h1 className="text-3xl font-bold text-center mb-4" id={index.toString()}>{title}</h1>

                    <div className="menu-list">

                        {[menu.dishes, menu.dishes2,menu.dishes33, menu.dishes3, menu.dishes4, menu.dishes5][index].map((dish, dishIndex) => (

                            <MenuItemCard

                                key={dishIndex}

                                name={dish}

                                price={[menu.prices, menu.prices2,menu.prices33, menu.prices3, menu.prices4, menu.prices5][index][dishIndex]}

                                imageUrl={[menu.imageUrl, menu.imageUrl2, menu.imageUrl33, menu.imageUrl3, menu.imageUrl4, menu.imageUrl5][index][dishIndex]}

                                discription={[menu.discriptions,menu.discriptions2,menu.discriptions33,menu.discriptions3,menu.discriptions4,menu.discriptions5][index][dishIndex]}

                            />

                        ))}

                    </div>

                </div>

            ))}

        </div>

    );

};

 

이제 만든 데이터를 통해 map 함수를 이용해서 카드를 생성한다.

다른 언어일때의 모습은

 


요로코롬 아주 이쁜 카드가 만들어진다.

사진은 아직 직원친구가 이쁜 사진들을 안보내줘서 대체사진을 사용중이다. 이정도면 쓸만하겠지?

3. 메뉴별 이동버튼


개발을 하고나니 스크롤이 너무 길다는 불편함이 있었다. 그래서 버튼 두개를 만들어 하나는 맨위로 올라가는 버튼과 하나는 누를 때 마다 다음 메뉴 카테고리로 이동하는 버튼을 구현했다.

현재 위치 확인

useEffect를 통해 현재 위치와 가장가까운 title id를 찾는다.

    useEffect(() => {

        window.addEventListener("scroll", handleScroll);
        return () => {
            window.removeEventListener("scroll", handleScroll);
        };
    }, []);

    const handleScroll = () => {
        const offsets = titles.map(title => {
            const element = document.getElementById(title);
            // 요소가 존재하지 않는 경우, 매우 큰 값을 반환하여 화면 밖으로 간주하도록 합니다.
            return element ? window.pageYOffset + element.getBoundingClientRect().top : Number.MAX_VALUE;
        });
        const closest = offsets.reduce((prev, curr, index) => {
           if (curr !== Number.MAX_VALUE && (Math.abs(curr - window.pageYOffset) < Math.abs(offsets[prev] - window.pageYOffset))) {
                return index;
            }
            return prev;
        }, 0);
        setCurrentIndex(closest);
    };
  • titles 배열에서 각 타이틀의 ID를 사용하여 해당하는 DOM 요소를 찾는다. document.getElementById(title)는 ID가 title인 요소를 반환한다.
  • 각 요소의 위치는 element.getBoundingClientRect().top + window.pageYOffset을 통해 계산된다. 여기서 getBoundingClientRect().top은 요소의 상단 경계로부터 뷰포트 상단까지의 거리를 제공하고, window.pageYOffset은 문서가 수직으로 얼마나 스크롤 되었는지를 나타낸다. 이 두 값을 더하면 페이지 최상단으로부터의 절대적인 거리가 된다.
  • 만약 특정 타이틀의 요소가 없다면(elementnull인 경우), Number.MAX_VALUE를 반환하여, 해당 타이틀을 스크롤 위치 계산에서 제외시킨다.
  • reduce 함수는 offsets 배열을 순회하면서 각 요소와 현재 스크롤 위치와의 차이가 가장 작은 요소의 인덱스를 찾는다. 이 인덱스는 현재 뷰포트에 가장 가까운 요소를 나타낸다.
  • 계산된 closest 인덱스는 setCurrentIndex를 통해 상태로 저장되어, 다른 부분의 렌더링이나 로직에서 사용될 수 있다.

이렇게 저장된 currentIndex를 통해 다음 타이틀 이동 함수를 만들 수 있다.

const scrollToNextTitle = () => {

        if (currentIndex + 1 < titles.length) {

            const nextTitleElement = document.getElementById(titles[currentIndex + 1]);

            if (nextTitleElement) {

                nextTitleElement.scrollIntoView({ behavior: "smooth" });

                setCurrentIndex(currentIndex + 1);

            }

        }

    };

 

현재 인덱스보다 하나 앞선 인덱스의 위치를 가져오고 smooth 하게 움직이는 함수다.

맨 위로 가는 함수는 상당히 간단하다.

 

const scrollToTop = () => {

        window.scrollTo({

            top: 0,

            behavior: "smooth"

        });

    };

 

이렇게 하고 이쁜 버튼과 함께 배치해보겠다.

 

 

 

 

다음에는 사진을 좀 제대로 넣고 수정하고 싶다. 그리고, 메뉴가 오류가 났는데 그냥 메뉴 이름만 수정하면돼서 문제없을 것 같다.

 

그리고 맛있게 먹는 방법과 메뉴 눌렀을 때, 메뉴 상세정보도 띄우고싶다. 그리고 방문수 확인하는것도! 이건 백있어야하나?

반응형
반응형

서류전형 → 코딩/과제테스트 → 인적성검사 → 면접 → 트라이얼 위크(3주)

 

에 걸친 현대캐피탈의 지원 절차다.

자기소개서에서는

  1. 현대캐피탈에 지원하게 된 동기와 지원 직무에 필요한 역량을 기르기 위해 노력했던 경험을 기술해 주십시오. (최소 300자, 최대 500자 입력가능)
  2. 실패에 대한 두려움을 극복하고 새로운 일에 도전하여 깨달음을 얻은 경험에 대해 기술해 주십시오. (최소 300자, 최대 500자 입력가능)
  3. 가치관이 다른 구성원들과 협업했던 과정에서 본인의 역할은 무엇이었는지, 그 경험을 통해 어떤 역량이 향상되었는지 기술해 주십시오. (최소 300자, 최대 500자 입력가능)

작년 하반기와 똑같은 자기소개서양식 이었다.

이번에는 작년과 달리 서류 합격 이후에 코딩테스트를 진행했다.

서류 합격은 했지만 사람들 말들이 적부 수준의 합격이다. 라는 평이 많아 코딩테스트에서 거르려는 것 같다는 생각이 들었다.


코딩 테스트

플랫폼 : 프로그래머스

문제수 : 알고리즘 4문항

시험 시간 : 2시간

화상감독 : 모니토, 검색불가, 외부IDE 불가

응시 직무 : IT

응시 가능 언어 : FE : Javascript, BE : Java, IT : C++, JS, Java, Python

 

이번에도 직무별로 코딩테스트 언어제한이 있었다.

 

후기

  1. 구현 (상태구현)
    • 상당히 간단한 구현 문제였다. 브론즈 난이도의 문제 (제출)
  2. 문자열, DP
    • DP라고 적긴했지만 DP가 아닐수도있다.(?) n 입력 값이 적어 for loop로 계속 순회하면서 풀긴했는데 맞으려나 실버1 (제출)
  3. DFS
    • 아 까먹었다 무슨 문제였더라? 경우의 수마다 최솟값 찾는거였다
  4. DP
    • dp 로 푸는게 맞는 것같은데 잘 모르겠다. ㅠㅠ 그때 당시 3차원 dp로 생각했는데 그정도 까진 아닌 것 같은디..

 

4문제 3제출!

작년엔 서류가 부족해서라고 생각된다. 이번엔 가보자고!

 

4일 뒤 결과 발표!

 

 

IT 직무 기준 3솔이 컷인것 같다! 이제 인적성이라니..

반응형

+ Recent posts