문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/12911
레벨 : Level 2
분류 : 연습문제
 

코딩테스트 연습 - 다음 큰 숫자

자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같이 정의 합니다. 조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다. 조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니

programmers.co.kr

이 문제는 2진수의 1의 개수를 구하는 것이 핵심이다.

소스를 보면 getBinarycountOne이라는 2진수에서 1을 구하는 함수를 만들어서 해결했으나 다른 사람들의 풀이를 보면서 복습하다가 Integer에 bitCount 함수를 알게 되었다. 

bitCount함수가 1의 개수를 카운팅 해주어 커스텀 함수를 만들 필요가 없게 되었다.

 

아래와 같이 풀이를 공유합니다.

import java.util.*;

class Solution {
    public int solution(int n) {
        int nc = Integer.bitCount(n);
        
        while(true) {
            if(nc == Integer.bitCount(++n)) break;
        }
        
        return n;
	}
    
    public int getBinaryCountOne(int n) {
        int cnt = 0;
        while(n > 0) {
            int o = n % 2;
            n /= 2;
            if(o == 1) cnt++;
        }
        
        return cnt;
    }
}
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/12913
레벨 : Level 2
분류 : 연습문제
 

코딩테스트 연습 - 땅따먹기

땅따먹기 게임을 하려고 합니다. 땅따먹기 게임의 땅(land)은 총 N행 4열로 이루어져 있고, 모든 칸에는 점수가 쓰여 있습니다. 1행부터 땅을 밟으며 한 행씩 내려올 때, 각 행의 4칸 중 한 칸만 밟

programmers.co.kr

이 문제의 유형은 다이나믹 프로그래밍이다.

지나온 길의 점수를 합산하여 가장 큰 점수를 구하는 문제이다.

 

처음에는 첫 행부터 차례대로 큰 값을 찾고 지난 위치를 기억하여 지난 위치를 제외해 큰 값을 찾는 방식으로 구현하였으나 실패하였다.

 

다이나믹하지 못해 다른 사람의 풀이를 찾아 보았다.

첫 행에서 무조건 큰 값으로 시작하는것이 아닌 두번째 행부터 모든 열을 거쳤을때를 가정하여 가장 큰 값을 구하는 방식으로 구현하였다.

 

아래와 같이 풀이를 공유합니다.

class Solution {
    int solution(int[][] land) {
        int answer = Integer.MIN_VALUE;
        
        for(int i = 1; i < land.length; i++) {
            for(int j = 0; j < land[0].length; j++) {
                int max = Integer.MIN_VALUE;
                for(int k = 0; k < land[0].length; k++) {
                    if(j == k) continue;
                    max = Math.max(max, land[i][j] + land[i-1][k]);
                }
                land[i][j] = max;
                answer = Math.max(answer, max);
            }
        }

        return answer;
    }
}
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/12924
레벨 : Level 2
분류 : 연습문제
 

코딩테스트 연습 - 숫자의 표현

Finn은 요즘 수학공부에 빠져 있습니다. 수학 공부를 하던 Finn은 자연수 n을 연속한 자연수들로 표현 하는 방법이 여러개라는 사실을 알게 되었습니다. 예를들어 15는 다음과 같이 4가지로 표현 할

programmers.co.kr

이 문제는 연속된 수로 입력된 값과 같은 값을 구하는 경우의 수를 구하는 문제이다.

1부터 n까지 첫 번째 배열을 돌려 같은 값을 구할 때까지 두 번째 배열을 돌리면 된다.

값을 구하는것이 아니어서 두 번째 배열에서 입력된 값과 같은 값을 구했다면 카운트를 하면 된다.

 

아래와 같이 풀이를 공유합니다.

class Solution {
    public int solution(int n) {
        int answer = 0;
        
        for(int i = 1; i <= n; i++) {
            int sum = 0;
            for(int j = i; j <= n; j++) {
                sum += j;
                if(n < sum) break;
                if(n == sum) {
                    answer++;
                    break;
                }
            }
        }
        
        return answer;
    }
}
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/12939
레벨 : Level 2
분류 : 연습문제
 

코딩테스트 연습 - 최댓값과 최솟값

문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 최소값과 최대값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요. 예를

programmers.co.kr

이 문제는 문자열에서 최댓값과 최솟값을 구하는 문제이다.

String 배열을 만들어서 하나씩 int로 변환하여 최댓값과 최솟값을 구하면 된다.

 

아래와 같이 풀이를 공유합니다.

class Solution {
    public String solution(String s) {
        String answer = "";
        
        String[] str = s.split(" ");
        
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        
        for(int i = 0; i < str.length; i++) {
            int num = Integer.parseInt(str[i]);
            if(num > max) max = num;
            if(num < min) min = num;
        }
        
        answer += String.valueOf(min) + " " + String.valueOf(max);
        return answer;
    }
}

+ Recent posts