반응형

2011번: 암호코드

 

2011번: 암호코드

나올 수 있는 해석의 가짓수를 구하시오. 정답이 매우 클 수 있으므로, 1000000으로 나눈 나머지를 출력한다. 암호가 잘못되어 암호를 해석할 수 없는 경우에는 0을 출력한다.

www.acmicpc.net

문제

상근이와 선영이가 다른 사람들이 남매간의 대화를 듣는 것을 방지하기 위해서 대화를 서로 암호화 하기로 했다. 그래서 다음과 같은 대화를 했다.

  • 상근: 그냥 간단히 암호화 하자. A를 1이라고 하고, B는 2로, 그리고 Z는 26으로 하는거야.
  • 선영: 그럼 안돼. 만약, "BEAN"을 암호화하면 25114가 나오는데, 이걸 다시 글자로 바꾸는 방법은 여러 가지가 있어.
  • 상근: 그렇네. 25114를 다시 영어로 바꾸면, "BEAAD", "YAAD", "YAN", "YKD", "BEKD", "BEAN" 총 6가지가 나오는데, BEAN이 맞는 단어라는건 쉽게 알수 있잖아?
  • 선영: 예가 적절하지 않았네 ㅠㅠ 만약 내가 500자리 글자를 암호화 했다고 해봐. 그 때는 나올 수 있는 해석이 정말 많은데, 그걸 언제 다해봐?
  • 상근: 얼마나 많은데?
  • 선영: 구해보자!

어떤 암호가 주어졌을 때, 그 암호의 해석이 몇 가지가 나올 수 있는지 구하는 프로그램을 작성하시오.

문제 풀이

알고리즘 : 다이나믹 프로그래밍

왜 와이? : 경우의 수를 세고 최적화 위해

설명

  1. 입력은 문자열로 받고 for loop 순회를 한다.
  2. 현재 인덱스(i) 와 이전 인덱스 (i-1)를 통해 현재 위치에서 26이하인 숫자임을 확인한다.
  3. 26이하라면 DP[i] += DP[i-1] + DP[i-2]
    • 두자리 숫자를 쓸 경우와 한자리의 숫자만 쓸경우를 더한다.
  4. 26초과라면 DP[i] += DP[i-1]
    • 한자리의 숫자만 사용할 수 있다.

하지만 코드가 옳지 않은 경우 0 을 출력해야한다.

 

0이 되는 경우

  1. 두자리 숫자를 합쳤을 시 26 이상
  2. 0이 두번이상 붙어 나올 경우
  3. 맨앞에 0 이 나올 경우

또한, 0이 나와도 가능한 경우 0이 아닐 때 사용되는 풀이와 다른 풀이를 적용해야한다.

즉, 한자리 숫자만 쓸 경우는 빼고 생각해야한다.

 

이렇게 복잡하게 해야하나 싶다. 일단 내 머릿속에 나온거니 정리해본다.

풀이 총정리

  1. 문자열로 입력 받아 for loop
  2. 현재 인덱스와 이전 인덱스 문자를 조합해 두자리 숫자를 만들어본다.
  3. 현재 위치가 0 이거나 이전 위치가 0 이거나 이후 위치가 0 이면 멈출지 말지 본다
  4. dp 배열 업데이트
#include <iostream>
#include <string>
using namespace std;

typedef long long ll;

int N;

ll dp[5010];
int main (){
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    string str;
    cin >> str;
    dp[0] = 1;
    dp[1] = 1;

    //맨앞자리가 0이면 종료
    if(str[0] == '0'){
        cout << 0;
        return 0;
    }

    for(int i = 1;i<str.size();i++){
            //두자리 숫자 만들어보자
        int one = str[i] - '0';
        int ten = str[i-1] -'0';
        int number = ten * 10 + one;

                //현재 인덱스가 0이라면?
        if(str[i] == '0'){
                //0이어도 26안넘으면 오케이, 하지만 00 이면 탈락
            if(number > 26 || number == 0){
                cout << 0;
                return 0;
            }else{
                    //dp 이월
                dp[i+1] = dp[i];
                continue;
            }
            //이전 인덱스가 0이라면?
        }else if(str[i-1] == '0'){
                //dp 이월
            dp[i+1] = dp[i];
            continue;
            //다음 인덱스가 0이라면?
        }else if(i+1 <= str.size() && str[i+1] == '0'){
            dp[i+1] = dp[i];
            continue;
        }

        if(number > 26){
            dp[i+1] =(dp[i+1] + dp[i] )% rest;
        }else{
            dp[i+1] = (dp[i+1] + dp[i] + dp[i-1]) %rest;
        }
    }
    cout << dp[str.size()];
    return 0;
}

나의 코드가 너무 지저분해서 지피티형에게 수정해달라고 할거다

도와줘요 지피티


#include <iostream>
#include <string>
using namespace std;

typedef long long ll;

const int MOD = 1000000;
ll dp[5001];  // 최대 길이 + 1

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    string s;
    cin >> s;

    if (s.empty() || s[0] == '0') {  // 비어있거나 0으로 시작하면
        cout << 0;
        return 0;
    }

    dp[0] = 1;  // 초기 조건 설정
    dp[1] = 1;

    for (size_t i = 1; i < s.length(); i++) {
        int current = s[i] - '0';  // 현재 문자를 숫자로 변환
        int prev = s[i-1] - '0';  // 이전 문자를 숫자로 변환
        int number = prev * 10 + current;  // 두 자리 수

        if (current == 0) {  // 현재 숫자가 '0'인 경우
            if (number == 0 || number > 26) {  // "00"이거나 "30", "40"...
                cout << 0;
                return 0;
            }
            dp[i+1] = dp[i-1];  // "10"이나 "20"
        } else {  // '0'이 아닌 경우
            dp[i+1] = dp[i];  // 일단 현재 위치에서 이전 위치를 이어 받음
            if (number <= 26 && prev != 0) {  // "10" ~ "26" 사이의 유효한 두 자리 수
                dp[i+1] = (dp[i+1] + dp[i-1]) % MOD;
            }
        }
    }

    cout << dp[s.length()];
    return 0;
}

다른점

  1. 현재위치에서 0인 경우만 판별
  2. 0인경우 dp[i+1] = dp[i-1] 을 통해 두자리 숫자 적용
반응형

'BOJ' 카테고리의 다른 글

[코드트리] 마법의 숲 탐색  (3) 2024.09.15
[BOJ 1011] Fly me to the Alpha Centauri  (0) 2024.08.11
[BOJ 2531] 회전 초밥  (0) 2024.03.08
[BOJ 2146] 다리 만들기  (0) 2024.01.26
[백준 1018번] 체스판 다시 칠하기  (0) 2021.05.03
반응형

2024 상반기 최대로 공들여서 쓴 자기소개서가 된 삼성SDS. 여러 친구들에게 첨삭을 받고 읽고 또 읽고를 반복해서 자소서를 써내려갔다.


서류

  1. 삼성SDS를 지원한 이유와 입사 후 회사에서 이루고 싶은 꿈을 기술하십시오.
  2. 본인의 성장과정을 간략히 기술하되 현재의 자신에게 가장 큰 영향을 끼친 사건, 인물 등을 포함하여 기술하시기 바랍니다. (※작품 속 가상인물도 가능)
  3. 최근 사회 이슈 중 중요하다고 생각되는 한 가지를 선택하고 이에 관한 자신의 견해를 기술해 주시기 바랍니다.

삼성의 바뀌지 않는 질문들.. 미리 작성해볼걸 자소서 작성하면서 고생이 많았다..

  1. 공급망 관련해서 지원동기와 블록체인 얘기를 좀 써봤다. (삼성SDS에는 물류부서를 따로 뽑는데 SW 직무에 물류 얘기 쓰면 안되나 싶어서 취업정보방에 문의했더니 그냥 쓰라고 하더라 ㅎㅎ 그냥 썼다.)
  2. 프로젝트 2개에 대해 썼다.
  3. 친환경 및 ESG에 관해 작성했다.

1번 내용을 썼다가 처음부터 다시 개조하는 바람에 조금 힘들었다 ㅎㅎ 그래도 내 인생 첫 삼성 서류! 기도합니다. 삼멘..
 

 
호레이!!!!!!! 기분 좋다. 이제 코테 준비하자!


SW역량테스트

삼성은 대대로 코딩테스트가 2문제 주어진다. 구현 문제 즉, 시뮬레이터 문제만 두 개를 낸다. 백준에서 삼성 기출 문제를 풀면 알겠지만 여간 까다로운 문제가 아니다. 문제를 파악하는데만 오래걸리는 그런 문제들.. 하나은행 면접준비하느라 코테 준비를 많이 못했다. 그래도 상어 문제들은 다 풀고 가야지! 하고 도전했다.
 
그래도 몇 문제 빼고는 다 풀었다.
 
잠실 본사로 걸어가면서 날씨가 정말 좋고 커다란 건물이 나의 자신감을 배로 끌어올려주었다. ‘와 진짜 크다.’
 



지하로 이어지는 길을 걸어 강의장에 들어갔다. 강의실처럼 생긴 곳에서 삼성 모니터와 삼성 마우스 삼성 키보드가 놓여있었고 물을 하나씩 주셨다. 오리엔테이션에 맞게 컴퓨터를 세팅하는데 마우스랑 키보드가 정말 너무 별로였다. 적응하는데 좀 힘들었다 ㅎㅎ
드디어 문제가 시작 되었다. 총 2문제 4시간이었다.


후기

역시나 구현문제 답게 정말 지문도 길고 문제도 복잡했다. 처음 문제를 읽고 아 이렇게 풀어야겠네 하다가도 풀다보니 문제를 잘못읽어 다시 짜기도 했으며, 몇개 문제는 맞고 몇개 문제는 틀리길래 출력해가며 문제를 겨우 찾아내 해결할 수 있었다. 첫번째 문제 테스트 케이스는 다 맞추고 시간초과되는지 확인도 잘하니 3시간 30분이 지났다. ㅎㅎ 두번째 문제를 잠깐 맛보는데 아니 뭐야 이건 또 정말 어지러운 문제였다. 여튼 조금 깔짝이다가 제출해버렸다.


결과

 

히든 테스트 케이스에 통과하지 못했나보다. 에휴,, 코딩테스트를 하면서 모듈화에 신경써야 할 것 같다. 마구잡이 코드 작성은 디버깅이 너무 힘들다는 걸 알게 되었던 경험

반응형
반응형

상반기 첫 은행 서류를 작성했다. 하나금융티아이 서류가 먼저 떠서 티아이를 준비하고 있었는데 하나은행은 중복 지원이 안된다고 하더라,,!@@@@

쓰던 자소서를 접고 바로 하나은행으로 갈아탔다. 아무래도 티아이 보다는 은행이 더 인프라가 좋다고 생각했다. 하나금융티아이 자소서 첨삭내용을 바탕으로 하나은행 자소서를 재구성했다.


 

서류


1. 하나은행에 지원한 이유를 본인의 지원 분야와 연관지어 구체적으로 작성해 주시기 바랍니다. (800자)
2. (온기) 공동의 목표를 위해, 원팀 마인드셋으로 구성원 간 협업을 이끌어내거나 협업의 어려움을 극복하기 위해 노력했던 경험을 작성해 주시기 바랍니다. (800자)
3. (용기) 미래에 대한 용기로 두려움을 극복하고 새로운 변화를 시도한 경험에 관해 사례를 들어 구체적으로 작성해 주시기 바랍니다. (800자)
4. (동기) 자신의 성장과 발전을 위한 행동의 동기(원동력)에 대해, 입행 후 하나은행에서의 목표 달성을 위한 노력과 연관지어 작성해 주시기 바랍니다. (800자)

하나은행의 바뀐 인재상을 토대로 자소서 문항이 바뀌었다.

1. 프로젝트 원에 대한 동기를 작성하고 입사후 포부에 프로젝트 원에 참여하고 싶다고 서술했다.
2. 협업을 하며 팀원간의 중재를 이끌어낸 경험을 서술했다.
3. 안드로이드 앱 프로젝트를 서술했다.
4. 노인을 위한 챗봇을 서술하고 입사후 포부를 작성했다.

첨삭된 내용을 바탕으로 완벽하게 재구성하지 못해 아쉬웠던 서류 작업이었다.

하지만 그 결과는

(대충 합격 사진)

사진을 깜빡하고 못찍었네 ㅎㅎ

서류 합격이 많이 없다보니 합격마저 신기하다..야호


 

코딩테스트


하나은행의 코딩테스트는 알고리즘 3 + SQL 2 , 총 5 문제로 진행된다. 프로그래머스 환경에서 치뤄지며 다양한 언어를 사용하게 했다. SQL 실력이 부족해 프로그래머스에서 와장창 풀었다.

코딩테스트 후기는 다음과 같다.

1. 구현
    1. unordered_map 을 이용해 날짜별 출금 한도 체크했다.
    2. 날짜 시간 출금액을 모두 문자열로 주는데 화딱지가 났다.
2. dfs
    1. 전형적인 dfs문제
    2. 다른분들은 dp로 풀었다는데 나는 dp형 머리가 아니어서 생각조차 안났다.
3. 해시맵
    1. 문자열 보자마자 토할것같아서 안풀었다 ㅎㅎ(사실 시간이 없었다.)
4. union all
    1. 어떻게 풀지 막막하다가 union all로 따로따로 구했는데 맞는 풀이인지 모르겠다
    2. 일단 예제는 맞았다.
5. union all
    1. 이것도 이렇게 푸는건지 맞는지 모르겠다
    2. 이건 예제 틀렸다. 왜인지 모르겠는데 AVG 가 잘안되는것같다.
    3. timediff, timestampdiff 이라는 함수가 있는지 처음 알았다.

전체적인 후기

요즘 은행권에서 문자열을 활용한 문제를 많이 낸다고한다. C++ 사용자인 나에겐 청천벽력같은 소식.. 역시나 하나은행도 알고리즘 3문제 모두 문자열 활용한 문제여서 골때렸다.

데이터베이스 문제는 풀만했지만 많이 어려워지고 있는 것 같다. 열심히 준비해야겠다.


총 3제출했는데 결과가 어떻게 되려나..



다음엔 면접 후기로!!

반응형
반응형

2024 상반기 웅진IT WEB 개발 인턴십 후기

웅진의 IT를 책임지는 웅진IT의 WRMS WEB 개발 직무를 위한 공고에 지원하게 되었다. 우대사항에 JAVA 개발역량을 우대한다는 것을 보니 전형적인 한국 웹 개발이라는 느낌이 들었고 프론트엔드를 준비하는 나에게는 직무가 약간 안 맞는다는 것을 느꼈지만 자바를 배우고 약간 서비스 해본 경험을 믿고 결국 프론트도 필요할 것이라는 생각에 지원하게 되었다.

 

웅진의 WRMS는 웅진 대표 렌탈 서비스 솔루션이고,한국 렌탈 시장에서 가장 독보적이기에 지원서를 작성하면서부터 애사심이 조금씩 생겼다. ㅎㅎ

 

그렇게 어렵게 쓴 자기소개서를 제출하고 나중에 다른 회사 자기소개서를 작성하기 위해 첨삭을 받았다. 하지만 자기소개서를 다 뜯어 고치라는 말에 이전에 제출했던 여러 회사들에 제출한 자기소개서가 불안하게 느껴졌다. 불안함은 역시 현실로 이어졌고, 우수수 서류 불합격 소식이 들려왔다.

 

 

그러던 와중, 웅진에서 뜻밖의 서류합격 소식을 들었다. 야호! 웅진의 채용 프로세스는 원래 원데이 면접으로 이루어지는데 채용 프로세스가 늦어지는 바람에 한 번의 면접만 진행하기로 했다고 한다.

 

면접을 준비하며, 잡코리아, 캐치 등 여러 면접 후기를 보며 기출 면접질문을 수집하고 예상 답안을 준비해갔다. 대면 면접은 싸피 이후로 처음이라 매우매우매우 떨렸다. 면접 전날부터 유튜브 모의 면접을 반복하며 나의 면접 실력에 허탈한 웃음만 보였다. ㅠㅠ

 

면접 당일이 되고 3시까지 도착해서 15분동안은 자기소개 및 지원동기를 계속 되뇌었다. 면접은 면접관 4 : 면접자 2~3 으로 진행됐고 내 타임은 2명이었다.

 

면접을 보고 면접 복기를 해보았다.

면접 복기

기초 면접 도입

  • 자기소개
    • 열심히 달달 외운 자기소개를 얘기했다. 면접 연습을 하면서 변형 자기소개가 나올까봐 두려웠는데 전형적인 자기소개
  • 웅진에 대해서 안것과 인턴십때 할일
    • 웅진이 하는 사업들에 대해 얘기하며 도전하는 모습에 지원하게 되었고, 인턴십에서 눈에 띄는 인턴이 되겠다고 했다. ㅎㅎ

기술 면접

  • 백엔드 프로젝트경험
    • 프론트엔드 준비를 한 것을 알고 있었고, 백엔드 해봤냐길래 개인 프로젝트 진행하면서 노드, jsp 로 서버를 개발했다고 했다.
  • 데이터베이스 사용 경험
    • mysql 을 사용하며 쿼리 작성하고 원하는 데이터를 가져온 경험이 있다고 했다.
  • Spring spring boot 차이점
    • 전혀 사용해본적이 없어 모르겠고 입사해서 배우겠다고 했다. ㅎㅎ,, 모르는걸 어찌하리,,

인성 면접

  • 프로젝트 기간 중 서브 태스크를 처리하며 선배가 준 업무프로세스가 내 아이디어보다 효율적이지 못한다면 어떻게 해결할 것인가?
    • 우선은 선배가 알려준 지침서가 나오기까지 다양한 경험의 농축물일 것이기에 우선적으로 따르고 작업이 끝난이후에 나의 아이디어를 제안하고 변경할 수 있게 하겠다고 했다.
  • 새로운 개발환경이 아닌 고객사를 위한 예전 환경에서 근무할 수 있는데 어떻게 대처할지?
    • 개발자로서 레거시 환경에서도 물론 개발을 해야할 줄 알아야한다. 여기서 발전해서 신사업에 투입되고 싶다.
      • 라고 했더니, 발전해서 다른 부서로 이동할 순 있지만 예전 환경의 개발부서에서 어떻게 적응할 것인지 를 물으셨다. ㅠ
  • 스트레스 해소법
    • 그냥 운동한다고 했다! 운동하면 잡생각도 사라지고 가끔가다 좋은 아이디어가 떠오른다고 했는데 못믿으셨다.. ㅎㅎ.. 진짠데..
  • 마지막으로 궁금한 것과 입사 후 포부
    • 딱히 궁금한건 없지만 wdms 에 대해 물어봤더니 잘 설명해주셨다. 근데 뭔가 wrms에 대해 더 물어봤어야했나 싶기도..?

총평

두명이서 한꺼번에 면접을 보니 한시간이 후딱갔다. 나랑 같이 본 면접자분은 면접관들도 눈치챘듯이 면접경험이 많아 보였고 여유로워보여 대단하다는 생각이 들었다. 그래서 그런지 그 분한테 이목이 더 쏠려보였다. 내 역량이외에 인성 위주의 면접으로 진행되다보니 상당히 아쉬웠다. 그래서 기대는 안해야겠다라는 생각을 했고 결과는 역시나,,

 

뜨거운 합격 ㅠ

반응형

+ Recent posts