반응형

반응형

프로그래머스 코딩테스트 124 나라의 숫자 : https://school.programmers.co.kr/learn/courses/30/lessons/12899

문제보기


124나라의 숫자 어떻게 풀어야할까?

자연수 n을 124 나라에서 사용하는 숫자로 바꾸는 문제를 해결하기 위해서는 아래와 같이 생각할 수 있어요.

124 나라에서는 1, 2, 4만 사용하므로 10진법 수를 3진법처럼 생각하여 변환해봅시다.

단, 3으로 나누어 떨어지는 경우 0 대신 4를 사용합니다.

따라서 while 문을 사용하여 n을 3으로 나눈 나머지에 따라 124 나라에서 사용하는 숫자로 변환합니다.

이때 3으로 나누어 떨어지는 경우 n을 1만큼 감소시키고 124 나라에서 사용하는 수에 따라 0 대신 4를 사용합니다.

자 여기까지 어느정도의 힌트를 드렸으니 혼자 풀어보실 의향이 있으시다면 풀어보시면 됩니다.

 

만약 정답을 보고싶으시다면 아래를 참고해주세요.

 


function solution(n) {
    let answer = ''; // 변환한 124 나라에서 사용하는 숫자를 저장할 변수
    while(n > 0){ // n이 0보다 크면 계속 반복
        switch(n % 3){ // n을 3으로 나눈 나머지에 따라 분기 처리
            case 1:
                answer = '1' + answer; // 나머지가 1이면 1을 추가
                n = Math.floor(n / 3); // n을 3으로 나눈 몫으로 업데이트
                break;
            case 2:
                answer = '2' + answer; // 나머지가 2이면 2를 추가
                n = Math.floor(n / 3); // n을 3으로 나눈 몫으로 업데이트
                break;
            case 0:
                answer = '4' + answer; // 나머지가 0이면 4를 추가
                n = Math.floor(n / 3) - 1; // n을 3으로 나눈 몫에서 1을 빼서 업데이트
                break;
        }
    }
    return answer; // 변환한 124 나라에서 사용하는 숫자를 반환
}
반응형
반응형

 

1. document.write를 활용한 간단한 구구단 만들기

1
2
3
4
5
6
7
forvar i = 2 ;  i < 10 ; i++){ // 
    forvar j = 1; j <10 ; j++ ){
        document.write( i+"x"+j+"="+(i*j)+"</br>" );   
    }
// 너무 간단함으로 설명은 생략. for문안에 for문쓰는건 왜인지
// 쓸때마다 기분이 매우 안좋다 ㅠㅠ

1 - 결과물

어렵지않게 만들 수 있는데요 지금부터 하나하나 간략하게 설명해보겠습니다.

간단하게 for문을 활용하여 이런식으로 표현이 가능합니다.

 

2. prompt를 활용해, 원하는 구구단 받아내기

 

1
2
3
4
5
6
7
8
var gugu = prompt("원하는 구구단을 입력해주세요");
if(!isNaN(gugu)){ ===> // isNaN을 통하여 숫자인지 아닌지를 판별.
    for(var i = 1; i<10; i++){ // 숫자라면 for문을 진행
        document.write(gugu+"x"+i+"="+(i*gugu)+"입니다.</br>"); // 구구단을 화면에 출력.
    }
}else// 숫자가 아닐경우
    alert("숫자가 아닙니다."// alert를 통해 숫자가 아님을 전달.
}

prompt를 활용했기때문에 시작하려면 Run Pen을 눌러주세요 :)

2 - 결과물

 

 

isNan을 활용하여 숫자,문자를 파악 후 원하는 구구단을 받아낼 수 있습니다.

 

 

 

 

 

반응형
반응형

 

프로그래머스 코딩테스트 나누어떨어지는숫자배열 링크 : 여기를 눌러주세요.

 

프로그래머스에 있는 코딩테스트 나누어떨어지는숫자배열 라는 제목의 문제입니다.

 

 

 

 

 

 

코딩테스트 나누어떨어지는숫자배열 어떻게 풀지 생각해보기

 

파라미터로 받은 배열 각각의 index값과 2번째 파라미터로 받은 divisor이 나누어떨어지는지 확인한 후, 나누어 떨어진다면 List에 넣으려고 했습니다.

 

그리고 만약에 list의 사이즈가 0이라면 나누어 떨어진 수가 없으므로

 

리턴하는 정답배열에 -1을 넣어 리턴을 해주고,

 

그게 아니라면 list를 정렬한 뒤 answer배열에 넣어주면 됩니다!

 

List정렬은 sort를 이용하였습니다.

 

크게 어려운 문제가 아닌듯하여 이정도만 말씀드려도 될 것 같습니다.

 

아래는 정답이 공개되어 있으니 혼자 풀어보고싶으신 분들은

 

지금부터 해결해 보시면 될 것같습니다.

 

 

 

 

 

코딩테스트 통과한 소스보기

 

(점수를.. 고작 또 1점을... 하아 ㅠㅠ...)

 

역시나 크게 어려운 문제가 아닌만큼 1점밖에 주질 않네요...

 

제가 어려운 문제가 아니라했지만 아직 프로그래머스의 경험이 많이 없으신분들은

 

어려울 수 있다고 생각합니다.

 

코딩은 100번 보는것 보다 1번 직접 작성하는게 더 좋으니

 

경험을 쌓으시길 바랍니다 :)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static int[] solution(int[] arr, int divisor) {
        List<Integer> list = new ArrayList<Integer>();
        for(int i=0; i<arr.length; i++) {
            if(arr[i]%divisor==0) {
                list.add(arr[i]);
            }
        }
        list.sort(null);
        if(list.size()==0) {
            int[] answer = {-1};
            return answer;
        }
        int[] answer = new int[list.size()];
 
        for(int i=0; i<list.size(); i++) {
            answer[i]=list.get(i);
        }
        System.out.println(Arrays.toString(answer));
        return answer;
    }

역시나 제가 푼 뒤에 다른사람들이 푼 코드들을 보면 한없이 초라해집니다..

 

저 또한 그분들처럼 효율적으로 코드를 짜기위해 많은 노력이 필요할 것 같습니다.

 

(사실 이 문제푸는데도 시간이 저는 꽤 걸렸네요...)

 

모든 코드에는 정답이 없으며 저 또한 코드를 잘 짜는게 아니기 때문에

 

제 코드는 참고용으로만 사용해주시면 감사하겠습니다.

 

최대한 매일매일 1개 이상의 코딩테스트 문제를 풀려고 노력중입니다.

 

아직 많이 부족해서 포스팅이 늦을 수 있으니 양해 부탁드립니다.

 

조언이나 가르침은 항상 기쁜마음으로 받겠습니다.

 

감사합니다 (_ _)

 

반응형
반응형

 

프로그래머스 코딩테스트 같은숫자는싫어 링크 : 여기를 눌러주세요.

 

프로그래머스에 있는 코딩테스트 같은숫자는싫어 라는 제목의 문제입니다.

 

 

 

 

프로그래머스 코딩테스트 JAVA 레벨 1에 있는 ‘같은숫자는싫어’ 문제입니다.

 

 

 

코딩테스트 같은숫자는싫어 어떻게 풀지 생각해보기

 

배열을받아서 같은숫자들을 제거한 뒤 남은 숫자를 리턴해주는 문제입니다.

 

일단 반복문을 돌려 배열의 index값과 그 다음 index값을 비교한 뒤,

 

같으면 넘어가고 다른숫자면 리턴해주는 배열에 넣어주고,

 

마지막 index에서는 비교할 값이 없기때문에 리턴해주는 배열에 넣어줄 수 없어

 

강제로 넣어줘야겠다고 생각했습니다.

 

하지만 마지막 인덱스값에서 다음 숫자가 없기때문에 에러가 뜹니다...

 

네... 반복문의 에러에 빠져들었었습니다 ㅠㅠ...

 

(제가 많이 부족해서... 나중에 정답을 확인해보니 for in문처럼 쓰는 방법도 있더라구요)

 

그래서 생각한게 맨 뒤에서부터 비교하는 방법이였습니다.

 

예를들면 )

 

 

 

이렇게 거꾸로 반복문을 돌리는 것 이였습니다.

 

아래는 정답이 공개되어 있으니 혼자 풀어보고싶으신 분들은

 

지금부터 해결해 보시면 될 것같습니다.

 

 

 

코딩테스트 통과한 소스보기

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Solution {
    public static int[] solution(int[] arr) {
        
        List<Integer> preAns = new ArrayList<>();
        for(int i=arr.length-1; i>=0; i--) {
            System.out.println(i);
            if( i == 0) {
                preAns.add(arr[i]);
                break;
            }
            if(arr[i] != arr[i-1]) {
                preAns.add(arr[i]);
            }
        }
        System.out.println(preAns);
        int[] answer = new int[preAns.size()];
        int j=0;
        for(int i=preAns.size()-1; i>=0; i--) {
            answer[j] = preAns.get(i);
            j++;
        }
        return answer;
    }
}
 

뭔가 List안에 넣은뒤 다시 역순으로 answer 배열에 넣어주는게 뭔가 찝찝하긴 하지만...

 

이 방법외에 다른방법이 있다면 알려주세요 ..ㅠ ㅠ

 

모든 코드에는 정답이 없으며 저 또한 코드를 잘 짜는게 아니기 때문에

 

제 코드는 참고용으로만 사용해주시면 감사하겠습니다.

 

최대한 매일매일 1개의 코딩테스트 문제를 풀려고 노력중입니다.

 

아직 많이 부족해서 포스팅이 늦을 수 있으니 양해 부탁드립니다.

 

조언이나 가르침은 항상 기쁜마음으로 받겠습니다.

 

감사합니다 (_ _)

반응형
반응형

프로그래머스 코딩테스트 가운데글자가져오기 링크 : 여기를 눌러주세요.

프로그래머스에 있는 코딩테스트 가운데글자가져오기 라는 제목의 문제입니다.

프로그래머스 코딩테스트 JAVA 레벨 1에 있는 ‘가운데글자가져오기’ 문제입니다.


코딩테스트 가운데글자가져오기 어떻게 풀지 생각해보기

이 문제를 보자마자 들었던 생각이

'아! 글자들을 자른뒤에 남은 글자를 return 해주면 될 것 같았습니다'

반복문속에 넣어서 글자들의 길이가 2보다 크다면,

맨앞과 맨뒤 글자를 자르고 다시 반복문 속에들어와

2보다 크다면 위 행동을 반복하고 2와 같다면 2글자를 리턴,

2보다 작다면 그 글자를 리턴 해주면 될 것같습니다!

잘라줄때 String을 사용하지않고 StringBuffer을 사용했습니다.

굳이 StringBuffer을 선언하지않고 String만으로도 문제풀이는 가능합니다.

저도 제가 왜 StringBuffer을 썼는지 모르겠네요...

이번문제는 생각보다 간단하게 풀 수 있었습니다.

(쉬워서 그런지 프로그래머스 1점오르더라구요...)


코딩테스트 통과한 소스보기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Solution {
    @Test
    public void test() {
        assertEquals(Solution.solution("123"), "2");
    }
    public static String solution(String str) {
        String answer = "";
        StringBuffer cutStr = new StringBuffer();
        cutStr.append(str);
        for(int i =0; i<str.length()/2; i++) { //2번 돈다.
//                System.out.printf("%d회\n",i);
            if(cutStr.length()>2) {
                cutStr = cutStr.deleteCharAt(0);
                cutStr = cutStr.deleteCharAt
                        (cutStr.length()-1);
            }else if(cutStr.length()==2){
                break;
            }
        }
        answer = cutStr.toString();
//            System.out.println(cutStr);
        return answer;
    }
}
 

조금이라도 효율성을 높이고자 반복문 속에 조건을 str.length/2를 해주었습니다.

나중에 다른분들의 소스코드를 보고 알았지만

꼭 반복문을 사용하지않아도 문제해결이 가능합니다.

혹시라도 이 글을 미리 보시고 아직 정답을 제출하지 않으신 분들이 있다면

반복문을 사용하지 않고 문제해결하는 방법을 생각해보는것도 좋을 것 같습니다.

(저도 보자마자 아..? 했네요 ㅋㅋㅋ)

모든 코드에는 정답이 없으며 저 또한 코드를 잘 짜는게 아니기 때문에

제 코드는 참고용으로만 사용해주시면 감사하겠습니다.

최대한 매일매일 1개의 코딩테스트 문제를 풀려고 노력중입니다.

아직 많이 부족해서 포스팅이 늦을 수 있으니 양해 부탁드립니다.

조언이나 가르침은 항상 기쁜마음으로 받겠습니다.

감사합니다 (_ _)

반응형
반응형

프로그래머스 코딩테스트 2016년 링크 : 여기를 눌러주세요

프로그래머스에 있는 코딩테스트 2016년 이라는 제목의 문제입니다.

프로그래머스 코딩테스트 JAVA 레벨 1에 있는 ‘2016년’ 문제입니다.


코딩테스트 2016년 문제 이해하기

2016년 1월 1일은 금요일이고,

파라미터로 int a (월) , int b(일) 을 전달했을때 무슨요일인지를

String으로 리턴해주는 문제입니다.

제한조건에는 2016 년도는 윤년이라고 적혀있습니다.

윤년이란?

간단하게 말해서 2월이 28일까지가 아닌 29일까지인 년을 말합니다.

자세한 사항은

여기를 클릭해주세요

기본적으로 매월의 일수와, 답으로 제출할 String을 배열로 선언해주도록 하겠습니다.

마지막 int calc는 추후 계산을 위해 선언해줬습니다.

이제부터는 그냥 차근차근 하나씩 풀어나가면 될 것같습니다.

1
2
3
4
5
6
7
8
9
public static String solution(int a, int b) {
        String answer = "THU";
        int[] days = {31,29,31,30,31,30,31,
                     31,30,31,30,31};
        String[] date = {"FRI","SAT","SUN",
                        "MON","TUE","WED","THU"};
        int calc = 0;
}
        

코딩테스트 2016년 이렇게 푸시면 됩니다

우선적으로 전달인자 a를 받아왔을때 a월 이전의 일수들과 b을 더해줍니다.

(Ex. a=2월 b=2일 일때, 1월의 31일과 b의 1일을 계산합니다)

계산한 값들을 %7로 다시 계산한 뒤, 나오는 숫자를

date배열에 넣어줍니다.

아래는 테스트 통과한 코드를 넣어두겠습니다.

감사합니다.


코딩테스트 통과한 코드 보기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static String solution(int a, int b) {
        String answer = "THU";
        int[] days = {31,29,31,30,31,30,31,
                     31,30,31,30,31};
        String[] date = {"FRI","SAT","SUN",
                        "MON","TUE","WED","THU"};
        int calc = 0;
        if(a>0) {            
            for(int i=0 ; i < a-1; i++) {
                calc += days[i];
            }
        }
        calc += (b-1);
        answer = date[(calc%7)];
        return answer;
}

모든 코드에는 정답이 없으며 저 또한 코드를 잘 짜는게 아니기 때문에

제 코드는 참고용으로만 사용해주시면 감사하겠습니다.

최대한 매일매일 1개의 코딩테스트 문제를 풀려고 노력중입니다.

아직 많이 부족해서 포스팅이 늦을 수 있으니 양해 부탁드립니다.

조언이나 가르침은 항상 기쁜마음으로 받겠습니다.

감사합니다 (_ _)

반응형
반응형

프로그래머스 코딩테스트 문제풀이 “모의고사” 링크 : 여기를 클릭해 주세요.

프로그래머스 코딩테스트 JAVA 레벨 1에 있는 ‘모의고사’ 문제입니다.


코딩테스트 [모의고사] 문제 이해하기

수포자 1은 1,2,3,4,5 를 반복해서 정답을 제출하고

수포자 2는 2,1,2,3,2,4,2,5를 반복해서 정답을 제출하고

수포자 3은 3,3,1,1,2,2,4,4,5,5를 반복해서 정답을 제출한다고 합니다.

문제의 정답들을 받아서 가장 많이 맞추는 사람을 return 해주는 문제인데요.

시험은 최대 10,000문제로 구성되어 있다고합니다.

그말은 시험이 몇문제인지 알 수 없기때문에 저희는 수포자들의

정답을 계속 반복시켜야 한다는것을 알 수 있습니다.

또한 정답을 배열로 받아서 배열로 가장 많이 맞춘 수포자를 리턴해줘야합니다.

(높은 점수를 사람이 여럿일 경우 오름차순으로 정렬도 하라고합니다.)

그렇다면 기본적인 Class를 생성하고 하나씩 풀어가보도록 하겠습니다.




1

2

3

4

5

6

7

8

9

10

11

12

13

14


public class Solution {

    public static int[] solution(int[] answers) {

        //수포자들을 각각 a,b,c로 선언하고

        //그들이 적을 답들을 배열로 넣었습니다.

        int[] a = {1,2,3,4,5};

        int[] b = {2123242521232425};

        int[] c = {33112244553311224455};

        //각각의 수포자들의 점수를 세어주기위해 각각 변수도 선언합니다.

        int acnt = 0;

        int bcnt = 0;

        int ccnt = 0;

    }

}

 



1

2

3

4

5

6

7

8

9

10

11


for(int i=0; i<answers.length; i++) {

    if(answers[i%answers.length== a[i%a.length]) {

        acnt++;

    } 

    if(answers[i%answers.length== b[i%b.length]) {

        bcnt++;

    }

    if(answers[i%answers.length== c[i%c.length]) {

        ccnt++;

    }

}
   

이렇게 각각의 수포자들이 적을 정답들을 실제 answers의 길이만큼 반복시킵니다. 그리고 정답들이 맞을때마다 각수포자들의 cnt를 1씩 늘려줍니다.

여기까지 했다면 각각의 수포자들이 몇개를 맞췄는지 알 수 있습니다.

이제 그 들중 가장 많이 맞춘 사람을 찾아 내면 될 것 같습니다.




1


int max = Math.max(acnt , Math.max(bcnt, ccnt));

이렇게 가장 많이 맞춘사람의 갯수를 max라는 변수에 담아준 뒤,




1

2

3

4

5

6

7

8

9

10

11

12

13

14


List<Integer> preAns = new ArrayList<Integer>();

        if(max == acnt) {

            preAns.add(1);

        }

        if(max == bcnt) {

            preAns.add(2);

        }

        if(max == ccnt) {

            preAns.add(3);

        }

        int[] answer = new int[preAns.size()];

        for(int i=0; i<preAns.size(); i++) {

            answer[i] = preAns.get(i);

}

ArrayList를 만들어 준 뒤, 각각의 cnt들을 max와 비교해 주고 list에 넣어줍니다.

마지막으로 저희는 배열로 정답을 return 해줘야하기때문에

list에 넣은 값들을 배열 answer에 넣어주면 끝이 납니다.





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46


public class Solution {

    @Test

    public void test() {

        assertArrayEquals(Solution.solution(new int[] {1,2,3,4,5}), new int[] {1});

        assertArrayEquals(Solution.solution(new int[] {1,3,2,4,2}), new int[] {1,2,3});

    }

    public static int[] solution(int[] answers) {

        int[] a = {1,2,3,4,5};

        int[] b = {2123242521232425};

        int[] c = {33112244553311224455};

        int acnt = 0;

        int bcnt = 0;

        int ccnt = 0;

        

        for(int i=0; i<answers.length; i++) {

            if(answers[i%answers.length== a[i%a.length]) {

                acnt++;

            }

            if(answers[i%answers.length== b[i%b.length]) {

                bcnt++;

            }

            if(answers[i%answers.length== c[i%c.length]) {

                ccnt++;

            }

        }

        int max = Math.max(acnt , Math.max(bcnt, ccnt));

        List<Integer> preAns = new ArrayList<Integer>();

        if(max == acnt) {

            preAns.add(1);

        }

        if(max == bcnt) {

            preAns.add(2);

        }

        if(max == ccnt) {

            preAns.add(3);

        }

        int[] answer = new int[preAns.size()];

        for(int i=0; i<preAns.size(); i++) {

            answer[i] = preAns.get(i);

        }

        

        

        return answer;

    }

}

 
반응형
반응형

프로그래머스 코딩테스트 완주하지 못한 선수 링크 : 여기를 눌러주세요.

 

프로그래머스에 있는 코딩테스트 완주하지 못한 선수 라는 제목의 문제입니다.

 

 

 

 

완주하지 못한 선수 어떻게 풀지 생각해보기

 

처음에는 파라미터로 받은 참여자배열과 완주자 배열에 있는 각각의 이름들을 하나씩 지워가며 마지막에

남은 이름을 return 하면 될 거라 생각했습니다.

 

그런데 이게 왠일? 

 

참여자 명단에 동명이인이 있을경우 계속해서 실패가 이루어졌습니다 ㅠㅠ...

 

어떻게하지 어떻게하지 하다가 생각한 수가

 

참여자 배열과 완주자배열을 "정렬" 합니다.

 

두가지 배열을 정렬한 다음 배열의 n번째가 달라진다면 그때의 참여자는 완주하지 못한 사람이 됩니다.

 

 

 

 

 

코딩테스트 통과한 소스보기

 

(점수를 5점 받았는데 지워졌스빈다...파일이..ㅠㅠ어디갔지)

 

1
2
3
4
5
6
7
8
9
10
11
public static String solution(String[] participant, String[] completion) {
        Arrays.sort(participant);
        Arrays.sort(completion);
        int i;
        for( i=0; i<completion.length; i++) {
            if(!participant[i].equals(completion[i])) {
                return participant[i];
            }
        }
        return "";
    }
cs

역시나 제가 푼 뒤에 다른사람들이 푼 코드들을 보면 한없이 초라해집니다..

 

저 또한 그분들처럼 효율적으로 코드를 짜기위해 많은 노력이 필요할 것 같습니다.

 

(사실 이 문제푸는데도 시간이 저는 꽤 걸렸네요...)

 

모든 코드에는 정답이 없으며 저 또한 코드를 잘 짜는게 아니기 때문에

 

제 코드는 참고용으로만 사용해주시면 감사하겠습니다.

 

최대한 매일매일 1개 이상의 코딩테스트 문제를 풀려고 노력중입니다.

 

아직 많이 부족해서 포스팅이 늦을 수 있으니 양해 부탁드립니다.

 

조언이나 가르침은 항상 기쁜마음으로 받겠습니다.

 

감사합니다 (_ _)

 

반응형

+ Recent posts