프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1, 2, 4로만 이루어진 3진수 체계로 주어진 n을 나타내면 되는 문제입니다.

 

어떻게 해결해야 할까 고민 많이 했는데, 노트에 적어보면서 규칙을 찾을 수 있었습니다.

거꾸로 생각했을 때,

answer = "124" 인 경우

$n = 18$일 때 answer = "124" 임을 도출할 수 있었고,

1. n % 3 이 각각 0, 1, 2일 때 뒷자리가 4, 1, 2 임을 알 수 있었습니다.

그다음 규칙을 찾는 것이 어려웠는데,

$n = \frac{(n - 1)}{3}$

2. 위와 같이 적용했을 때, 1번이 다시 적용됨을 알 수 있었습니다.

 

위와 같이 문자열을 만들어주면 거꾸로 저장이 되니까,

return 전에 완성된 문자열을 뒤집어주면 정답입니다.

 

 

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

string solution(int n) {
    string answer = "";
    while(n) {
        int tem = n % 3;
        if(tem == 1) answer += "1";
        else if(tem == 2) answer += "2";
        else if(tem == 0) answer += "4";

        n = (n - 1) / 3;
    }
    reverse(answer.begin(), answer.end());
    return answer;
}

보잘것없는 문제 정답 도출까지의 제 필기입니다.

'프로그래머스' 카테고리의 다른 글

[C++] 프로그래머스 | 광물 캐기  (0) 2023.07.31
[C++] 프로그래머스 | 요격 시스템  (0) 2023.07.31
 

1790번: 수 이어 쓰기 2

첫째 줄에 N(1 ≤ N ≤ 100,000,000)과, k(1 ≤ k ≤ 1,000,000,000)가 주어진다. N과 k 사이에는 공백이 하나 이상 있다.

www.acmicpc.net

구현 문제이며,  수학적 감을 필요로 한다.

한 자리 수인 1 ~ 9는 9개
두 자리 수인 10 ~ 99는 90개

세 자리 수인 100~999는 900개

...
라는 점을 기반으로 구현해서 푼다.

이런 류의 수학적인 구현력이 많이 부족하다고 느꼈다.

생동성 시험을 하며 병원에서 피 뽑으면서 풀어서 집중하지 못했다. 
결과적으로 오래 걸려서 아쉽다.

/*
https://www.acmicpc.net/problem/1790
백준 1790 수 이어 쓰기 2
*/

#include <iostream>
using namespace std;
int main() {
    long long aa = 0, n,k,temp = 9, l = 1;
    cin>>n>>k;
    while(k > 0) {
        k -= temp * l;
        aa += temp;
        temp *= 10;
        l++;
    }
    temp /= 10;
    k += temp * --l;
    aa -= temp;
    long long num = (k + l - 1)/ l, mod = (k + l - 1) % l;    
    long long m = aa + num;
    if(m > n) cout<<-1;
    else {
        for(long long i = 0; i < l - mod - 1; i++) {
            m /= 10;
        }
        cout<<m % 10;
    }
}

 

2학년 1학기와 가장 달라진 점은 소프트웨어공학과 복수전공을 늦게라도 시작하기로 마음먹었다는 점이다.
2학기에 수학 1을 이수하며 조건을 채웠고, 신청했고, 최종적으로 면접을 거쳐서 합격했다.
코딩 열풍이 불며 이번 학기 경쟁률이 너무 높아 걱정했다.

짧은 기간 공부하고 전남대학교 프로그래밍 경진대회에서 은상 받은 것을 면접 담당 교수님이 기억하고 계셔서 면접에 도움이 됐다. 여름방학 중 짧은 기간 성균관대학교 학생들과 PS 관련된 공부를 한 것, 도전장학생 준비한 것 등도 도움이 됐다.
특히, 도전장학생 면접을 준비하고 직접 면접을 보면서 쌓은 경험이 복수전공 면접에 도움이 됐다.

도전장학생으로 선발된 것 또한 큰 경사이지만, 복수전공 합격보단 큰일이 아닌 것 같아 후순위로 뒀다.

토익 공부를 아예 안 하고 봐봤는데 작년에 공부한 실력이 유지되고 있었다.

물론 865점은 군대 가기 전과 비슷한 수준이라 다시 일주일 정도는 공부를 해야겠다는 생각이 들었다.

마지막으로 이미 늦은 시작이라고 생각하지만, 웹 개발 공부를 시작했다.
지금이라도 시작을 안 하면 영영 시작하지 못할 것 같아 기본적인 부분을 배우고 클론코딩으로 시작했다.

다행인 점은 예상과 달리 꽤나 재밌다는 것이다.
불행인 점은 공부 방향 설정이 어렵다는 것이다. 복수전공 합격은 했지만, 학교에서도 개발 공부는 안 가르쳐준다던데.. 동아리나 교육 기관에 빨리 들어가서 체계적으로 배우고 싶다는 생각이 자꾸 든다. 누군가가 내 공부 순서를 세워준다면 행복할 것 같다.

여기까진 즐거운 내용이었고...

안 좋은 일이 많이 겹치면서 PS 공부에 차질이 있었다.

첫 번째로는 개인적으로 안 좋은 일이 하나 있었고,
두 번째로는 맥북에 콜라를 쏟았다.
망가진 맥북으로 인해 2학기 전남대학교 프로그래밍 경진대회에 참여하지도 못했고, 결정적으로 내가 공부를 거의 하지 못했다.
맥북이 망가진 동안 PS를 하며 머리 쓰지 않으려 했고, 휴대폰으론 구현이 힘들어 쉬운 문제만 풀다 보니 실력이 정말 많이 떨어졌다.

1학기를 마쳤을 땐 내 빠른 성장속도와 대회 결과 등으로 인해 자신감이 있었지만,
2학기에 맥북을 고치고, 내가 과거에 풀었던 그리디 문제의 정해가 떠오르지 않을 땐 마음이 아팠고 위기감을 느꼈다.
dp도 몇 문제는 내가 이미 풀었지만 정해가 떠오르지 않았다.

다행인 점은 공부 방향을 새로 짰다는 점이다.
삼성 sw 역량테스트, 카카오 코딩테스트 등의 문제를 보면서 내가 그리디, dp, 수학, 구성적 문제에만 지나치게 매몰되고 문제를 편식한다는 것을 알게됐다. 그리고 이런 편식은 코딩테스트나 코드포스에서 내가 아는 유형만이 나오기를 비는 원인임을 깨달았다.
정말 중요한 내용이라, 지금이라도 알아서 다행이라고 생각한다.

현재까진 내가 풀고 싶은 문제를 백준에서 풀었다.
하지만 앞으론 나도 남들처럼 랜덤디펜스를 하며 문제의 유형을 가리지 않고 풀어나갈 예정이다.
코드포스 오렌지가 직접 해준 말인데, 랜덤디펜스가 실력 향상에 큰 도움이 된다고 한다.
정말 백준 티어작이 덧없음을 느꼈다..

BFS, DFS, 백트래킹은 이제 어느 정도 감을 잡았고,
우선순위 큐, 그래프, 트리를 개강 전까지 배울 예정이다. 꼭 배우자 ㅠ

==> 배움

 

Dashboard - Codeforces Round #851 (Div. 2) - Codeforces

 

codeforces.com

A, C 풀고 B 못 풀었습니다.

B도 막상 풀이 보니까 많이 아쉽도록 쉽네요.

 

 

Problem - A - Codeforces

 

codeforces.com

 

1, 2로 이루어진 배열에서 a1~ ak 까지의 곱과 a(k+1) ~ an까지의 곱이 같은 k 중, 가장 작은 k를 출력하면 됩니다.

 

풀이:

2의 총 개수가 홀수라면, k = -1.

2의 총 개수가 짝수라면, (2의 총 개수 / 2) 번째 2가 등장하는 위치가 정답입니다.

 

 

 

Problem - B - Codeforces

 

codeforces.com

 n = x + y 인 x와 y를 구해야합니다.

x 자릿수의 총합과 y 자릿수의 총합은 1을 초과해서 차이나면 안 됩니다.

 

풀이:

각 자릿수를 2로 나눠서 x와 y에 나눠주면 됩니다.

 

 

 

Problem - C - Codeforces

 

codeforces.com

풀이:

n이 짝수라면 알맞게 짝을 지어줄 수 없습니다.

n이 홀수일 때, n = 9일 때를 생각해서 한 번 짝을 지어봤습니다.

n = 9

↓

1  2  3  4  5  6  7  8  9
10 11 12 13 14 15 16 17 18

15 부터 23 까지의 합을 만들어야함.

↓

1 - 14
3 - 13
5 - 12
7 - 11
9 - 10
18 - 2
17 - 4
16 - 6
15 - 8

이렇게 되길래, 똑같이 작동하도록 짝을 지어주는 코드를 작성했고 AC를 받았습니다.

정말 오랜만에 코포 했는데 아쉽기도 하고,

여태 그리디 안 한 거 생각하면 다행이란 생각이 들기도 하네요.

+ Recent posts