반응형

오늘도 돌아온 코테 공부 시간
이번 문제는 "저주의 숫자 3"입니다.

문제 내용

3x 마을 사람들은 3을 저주의 숫자라고 생각하기 때문에 3의 배수와 숫자 3을 사용하지 않습니다.
정수 n이 매개변수로 주어질 때, n을 3x 마을에서 사용하는 숫자로 바꿔 return 하도록 solution 함수를 완성해 주세요.
3x 마을 사람들의 숫자는 다음과 같습니다.
10진법 3x 마을에서 쓰는 숫자 10진법 3x 마을에서 쓰는 숫자
1 1 6 8
2 2 7 10
3 4 8 11
4 5 9 14
5 7 10 16
제한사항
1 ≤ n ≤ 100

입출력 예
n = 15, result = 25
n = 40, result = 76

작성 코드

class Solution {
    public int solution(int n) {
        int answer = 0;
        for (int i=1; i<=n; i++){
            answer++;
            // 앞 자리가 3, 13이면 하나씩 패스해서 10개 점프
            // 3의 배수이거나, 끝자리가 3이면 +1해서 패스
            while ((answer/10 == 3) || (answer/10 == 13) || (answer%3 == 0) || (answer%10 == 3)) {
                answer += 1; 
            }
        }
        return answer;
    }
}

맨 처음에 바보 같이 if 문으로만 해결하려고 했는데
생각해 보니 조건에 따라서는 숫자 패스를 많이 해야 하는 경우도 있고 해서
while에서 조건에 해당하는 동안은 계속 넘기는 방식으로 해결을 했다.

하지만 내 방식의 단점은 제약조건 n이 커지면 오류가 난다는 것

다른 분들 풀이를 보니 3의 배수인 경우는 나와 동일하게 %(나머지) 연산자로 작업했다.
하지만 숫자 3이 들어가는 경우는 아래와 같이 문자열로 바꾼 후에 "3"이 있는지 판별하는 방식을 쓰더라.

String.valueOf(answer).contains("3")

오늘도 하나 배웠다...!

(문제 출처 : 프로그래머스 https://school.programmers.co.kr/learn/courses/30/lessons/120871)

반응형

'공부 > 코딩' 카테고리의 다른 글

[프로그래머스/입문] 분수의 덧셈  (1) 2024.12.04
반응형

다시 돌아온 코딩 테스트 타임이다. 진짜 다 까먹어서 기초의 기초의 기초부터 튀기려고 한다.
근데 나 첫 취준 때 코테 보기 싫어서 공기업 커리어 탄건데...
결국 공공도 코테 보는 엔딩^^ 이럴 거면 그냥 사기업 갈까 봐요

각설하고 시작하는 이번 문제는 "분수의 덧셈"입니다.
사실 이것도 n트만에 성공했어요.
그래도 자바가 공통적으로 많이 쓰인대서 자바 하려고 하는데... 낯설다.
나 전에 자바로 어떻게 어플도 만들고 했지? 과거의 나 칭찬해~ 

문제 내용

첫 번째 분수의 분자와 분모를 뜻하는 numer1, denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2, denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.

제한사항
0 <numer1, denom1, numer2, denom2 < 1,000

입출력 예
numer1 denom1 numer2 denom2 result
1 2 3 4 [5, 4]
9 2 1 3 [29, 6]

작성 코드 (1차 도전)

class Solution {
    public int[] solution(int numer1, int denom1, int numer2, int denom2) {
        int[] answer = {0, 0};
        int[] divn = new int[1000]; // 기약분수를 위해, 최대공약수 찾는 용도
        int i = 1; int n = 0;
        
        // 일단 분수 덧셈 먼저 해준다
        answer[0] = numer1*denom2 + numer2*denom1;
        answer[1] = denom1*denom2;
        
        // 덧셈 결과물을 기약분수로 나누기 위해 최대 공약수를 찾는 부분
        for (i=1; i<=answer[0] || i<= answer[1]; i++){
            if ((answer[0]%i==0) && (answer[1]%i==0)){
                divn[n] = i; 
                n++;
            } // 가장 마지막에 들어간 n이 최대 공약수임
              // 근데 생각해보니 배열 안쓰고 그냥 변수 하나로 해도 되잖아?
        }
        
        answer[0] = answer[0]/divn[n-1];
        answer[1] = answer[1]/divn[n-1];
        
        return answer;
    }
}

작성 코드(2차 도전)

class Solution {
    public int[] solution(int numer1, int denom1, int numer2, int denom2) {
        int[] answer = {0, 0};
        int i = 1;
        int divmax = 0; // 최대공약수를 저장할 수 있는 변수로 바꿈
        
        answer[0] = numer1*denom2 + numer2*denom1;
        answer[1] = denom1*denom2;
        
        for (i=1; i<=answer[0] || i<= answer[1]; i++){
            if ((answer[0]%i==0) && (answer[1]%i==0)){
                divmax = i; // 제일 마지막에 저장되는 애가 최대공약수
            } 
        }
        
        answer[0] = answer[0]/divmax;
        answer[1] = answer[1]/divmax;
        
        return answer;
    }
}

사실 뇌가 굳어서 구글의 힌트를 조금 보고 풀긴 했다.
사실 진짜진짜 처음에는 이프엘즈 난무함...ㅋ
어려운 문제도 척척 푸는 그 날까지 노력해보겠어

(문제 출처 : 프로그래머스 https://school.programmers.co.kr/learn/courses/30/lessons/120808)

반응형

'공부 > 코딩' 카테고리의 다른 글

[프로그래머스/입문] 저주의 숫자 3  (0) 2024.12.05

+ Recent posts