반응형

문제 설명

모든 자연수 x에 대해서 현재 값이 x이면 x가 짝수일 때는 2로 나누고, x가 홀수일 때는 3 * x + 1로 바꾸는 계산을 계속해서 반복하면 언젠가는 반드시 x가 1이 되는지 묻는 문제를 콜라츠 문제라고 부릅니다

그리고 위 과정에서 거쳐간 모든 수를 기록한 수열을 콜라츠 수열이라고 부릅니다.

계산 결과 1,000 보다 작거나 같은 수에 대해서는 전부 언젠가 1에 도달한다는 것이 알려져 있습니다.

임의의 1,000 보다 작거나 같은 양의 정수 n이 주어질 때 초기값이 n인 콜라츠 수열을 return 하는 solution 함수를 완성해 주세요.


제한사항

1 ≤ n ≤ 1,000


입출력 예

n result
10 [10, 5, 16, 8, 4, 2, 1]

입출력 예 설명

입출력 예 #1

순서대로 연산한 결과를 표로 만들면 다음과 같습니다.

연산 횟수 x 홀짝 여부
0 10 짝수
1 5 홀수
2 16 짝수
3 8 짝수
4 4 짝수
5 2 짝수
6 1 홀수

따라서 [10, 5, 16, 8, 4, 2, 1]을 return 합니다.


문제풀이

-> n을 받아서 짝수일 때와 홀수일 때로 분기를 나눈 후, 짝수일 경우 n/2, 홀수일 경우 3*n+1을 계산하여 해당 값이 1이 될 때까지 while문을 통해서 반복한다.


코드

import java.util.ArrayList;

class Solution {
    public int[] solution(int n) {
        ArrayList<Integer> answerT = new ArrayList<>();
        int[] answer = {};
        int count = 0;
        while(n!=1){
            answerT.add(n);
            if(n%2==0){
                n=n/2;
            } else {
                n=3*n+1;
            }
            count++;
        }
        answer = new int[count+1]; // 마지막 값 1은 직접 넣기 위해 count+1로 배열 크기 설정
        for(int i=0;i<count;i++){
            answer[i]=answerT.get(i);
        }
        answer[count] = 1;
        return answer;
    }
}
반응형
반응형

문제 설명

 

정수 l과 r이 주어졌을 때, l 이상 r이하의 정수 중에서 숫자 "0"과 "5"로만 이루어진 모든 정수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요. 

만약 그러한 정수가 없다면, -1이 담긴 배열을 return 합니다.


제한사항

1 ≤ l ≤ r ≤ 1,000,000


입출력 예

l r result
5 555 [5, 50, 55, 500, 505, 550, 555]
10 20 [-1]

입출력 예 설명

입출력 예 #1

5 이상 555 이하의 0과 5로만 이루어진 정수는 작은 수부터 5, 50, 55, 500, 505, 550, 555가 있습니다. 따라서 [5, 50, 55, 500, 505, 550, 555]를 return 합니다.

 

입출력 예 #2

10 이상 20 이하이면서 0과 5로만 이루어진 정수는 없습니다. 따라서 [-1]을 return 합니다.


문제 풀이

-> 5 ~ 555 까지의 모든 수에서 각 자리에 5 또는 0 이 아닌 수가 있으면 넘기고, 5와 0으로만 이루어진 수라면 배열에 담아서 answer에 넣어주면 된다. 배열에 담을 때, count도 세어주어서 answer 변수를 초기화하는데 사용한다.


코드

import java.util.ArrayList;
class Solution {
    public int[] solution(int l, int r) {
        ArrayList<Integer> answerT = new ArrayList<>();
        
        int count = 0;
        for(int i=l;i<r+1;i++){
            String temp = String.valueOf(i);
            String[] list = temp.split("");
            int test = 1;
            for(int j=0;j<list.length;j++){
                if(!list[j].equals("0")&&!list[j].equals("5")){ // 각 자리가 0 이나 5가 아닌 다른 수를 포함하는지 확인
                    test=0;
                    break;
                } 
            }
            if(test==1){
                count++;
                answerT.add(i);
            }
        }
        
        if(answerT.isEmpty()){ // 배열에 어떠한 값도 존재하지 않으면 -1 을 담은 배열 리턴
            return new int[]{-1};
        } else {
            int[] answer = new int[count];  
            for(int i=0; i<count; i++){
                answer[i] = answerT.get(i);
            }
        return answer;
            
        }
        
    }
}
반응형
반응형

 

문제 설명

점 네 개의 좌표를 담은 이차원 배열  dots가 다음과 같이 매개변수로 주어집니다.

  • [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]

주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 return 하도록 solution 함수를 완성해보세요.


제한사항

  • dots의 길이 = 4
  • dots의 원소는 [x, y] 형태이며 x, y는 정수입니다.
    • 0 ≤ x, y ≤ 100
  • 서로 다른 두개 이상의 점이 겹치는 경우는 없습니다.
  • 두 직선이 겹치는 경우(일치하는 경우)에도 1을 return 해주세요.
  • 임의의 두 점을 이은 직선이 x축 또는 y축과 평행한 경우는 주어지지 않습니다.

문제 풀이

-> 처음에 점이 4개 있다는 것에만 집중해서 4개로 만들 수 있는 모든 기울기의 경우의 수를 구하려했다. 하지만 '네 개의 점을 두개씩 이었을 때' 라는 내용으로 보아 생길 수 있는 경우의 수는 총 3가지였다. A, B, C, D 4개의 점이라고 한다면 아래와 같이 경우가 생긴다.

- AB : CD / AC : BD / AD : BC

이렇게 3가지 경우만 고려하면 되는 것이었다.

 

두번째로 고려할 내용은 서로 다른 두 개 이상의 점이 겹치는 경우가 없고, 두 직선이 겹치는 경우에도 1을 리턴하라는 것이다. 이 내용으로 두 직선이 일치하는 경우도 1을 리턴하라는 것을 알 수 있고, 이는 즉, x절편이나 y절편은 고려할 필요 없고 오직 기울기만 계산하면 된다는 뜻으로 해석된다.


코드

class Solution {
    public int solution(int[][] dots) {
        int answer = 0;
        double[] line = new double[6]; // 3가지 경우를 담을 배열 생성
        
        line[0] = calculateSlope(dots[0], dots[1]);
        line[1] = calculateSlope(dots[2], dots[3]);
        
        line[2] = calculateSlope(dots[0], dots[2]);
        line[3] = calculateSlope(dots[1], dots[3]);
        
        line[4] = calculateSlope(dots[0], dots[3]);
        line[5] = calculateSlope(dots[1], dots[2]);
        
        for(int i=0; i<6; i+=2){ // 기울기 비교
            if(line[i]==line[i+1]){ 
               answer = 1;
            }    
        }
        return answer;
    }
    
    private double calculateSlope(int[] p1, int[] p2) { // 기울기 계산
        return (double) (p1[1] - p2[1]) / (p1[0] - p2[0]);
    }
    
}

 

반응형
반응형

코딩테스트 문제를 풀다보면 최소공약수를 구해야하는 경우가 있다.

이 때, 사용하면 좋은 것이 유클리드 호제법이다.

유클리드 호제법을 자바코드로 표현하면 다음과 같다.

public static int gcd(int p, int q)
 {
	if (q == 0) return p;
	return gcd(q, p%q);
 }

계산을 한번 해보도록 하자.

예를 들어 p=7, q=20이라고 하면

 

(1) gcd(7, 20) 

-> q==0이 아니기 때문에 return gcd(20, 7%20) = gcd(20, 7)

 

(2) gcd(20, 7)

-> q==0이 아니고 20이기 때문에 return gcd(7, 20%7) = gcd(7, 6)

 

(3) gcd(7, 6)

-> q==0이 아니고 6이기 때문에 return gcd(6, 7%6) = gcd(6, 1)

 

(4) gcd(6, 1)

-> q==0이 아니고 1이기 때문에 return gcd(1, 6%1) = gcd(1, 1)

 

(5) gcd(1, 1)

-> q==0이 아니고 1이기 때문에 return gcd(1, 1%1) = gcd(1, 0)

 

(6) gcd(1, 0)

-> q==0 성립, 따라서 return 1;

 

1이 리턴되므로 7과 20의 최대공약수는 1임을 알 수 있다.

이제 이를 기억해두었다가 사용해서 코딩테스트에 사용하면 된다!

반응형
반응형

문제 설명

머쓱이네 피자가게는 피자를 여섯 조각으로 잘라 줍니다. 피자를 나눠먹을 사람의 수 n이 매개변수로 주어질 때, n명이 주문한 피자를 남기지 않고 모두 같은 수의 피자 조각을 먹어야 한다면 최소 몇 판을 시켜야 하는지를 return 하도록 solution 함수를 완성해보세요.

 

제한사항

1 ≤ n ≤ 100

 

입출력 예

입력 출력
6 1
10 5
4 2

 

입출력 예 설명

입출력 예 #1

  • 6명이 모두 같은 양을 먹기 위해 한 판을 시켜야 피자가 6조각으로 모두 한 조각씩 먹을 수 있습니다.

입출력 예 #2

  • 10명이 모두 같은 양을 먹기 위해 최소 5판을 시켜야 피자가 30조각으로 모두 세 조각씩 먹을 수 있습니다.

입출력 예 #3

  • 4명이 모두 같은 양을 먹기 위해 최소 2판을 시키면 피자가 12조각으로 모두 세 조각씩 먹을 수 있습니다.

풀이

class Solution {
    public int solution(int n) {
        int answer = 0;
        for(int i=1; i<n+1 ; i++){
            if(6*i%n==0){
                answer = i;
                break;
            }
        }
        return answer;
    }
}



풀이 설명

- 6조각씩 i판의 피자가 있을 때, n 명이 남김없이 먹어야 하므로, 6*i%n을 계산했을 때 0이 나와야한다. 이 때의 i(피자의 판수)를 구해서 answer에 담아주면 된다. for문을 사용하여 피자의 판수(i)를 늘려가면서 6*i%n을 계산한다. 여기서 고민되었던 것은 for문을 돌리는 i의 범위였는데, 인원수(n)이 소수일 경우를 생각하면 n이 곱해져야 결국 n으로 나눌수 있으므로 i는 최대 n까지는 입력되어야한다. 따라서 i<n+1로 작성해서 i=n일 경우까지 생각해주었고 break를 통해 for문이 다 돌지 않아도 조건을 만족하면 그 시점에 바로 for문을 빠져나오도록 코드를 작성하였다.

반응형
반응형

코딩테스트 문제를 풀다가 거듭 제곱을 구하는 쉬운 방법이 있나해서 찾아본 후 이 글에 정리하게 되었습니다. java.lang.Math 클래스의 pow() 메소드를 이용하면 쉽게 구할 수 있습니다. Math 클래스가 제공하는 메소드는 모두 정적이라 Import나 Math 클래스 선언 없이 바로 사용할 수 있습니다.

사용법은 다음과 같습니다.

public class Pow {
	public static void main(String[] args) {
    	
        double result = Math.pow(10, 3); // 10의 세제곱
        System.out.println("10의 세제곱은 : " + result);
    }
}

// Math.pow() 메소드의 입력값과 출력값은 모두 double형이며 Math.pow(대상숫자, 지수) 형태로 입력해주면 됩니다.

알고 있으면 유용할 듯 하여 참고하시면 됩니다.

반응형

'Programming > Java' 카테고리의 다른 글

[Java] StringTokenizer 클래스  (0) 2021.09.25
[Java] printf  (0) 2021.09.11
Java Beans란?  (0) 2021.08.22
DAO와 DTO(VO)의 차이점  (0) 2021.08.19
반응형

SampleController 클래스를 생성 후

log4j 어노테이션을 적용하려는데 자꾸 빨갛게 다음과 같은 에러가 나왔다.

 

org.apache.log4j cannot be resolved to a type

org.apache.log4j.Logger cannot be resolved to a type

 

실제 에러 모습

알아보니 이유는 이렇다. Spring Legacy Project로 생성한 프로젝트는 기본적으로 Log4j가 추가되어 있으므로 그 설정과 중복되는 느낌(?)의 이유에서였다.

 

그렇다면 해결책은 두가지인데, 

1. 기본적으로 설정된 Log4j 그대로 사용, @Log4j 어노테이션 지우기.

2. @Log4j 어노테이션을 쓰자!

 

2번의 경우 pom.xml의 Log4j 부분에서

<dependency>
	<groupId>log4j</groupId>
	<artifactId>log4j</artifactId>
	<version>1.2.15</version>
	<exclusions>
		<exclusion>
			<groupId>javax.mail</groupId>
			<artifactId>mail</artifactId>
		</exclusion>
		<exclusion>
			<groupId>javax.jms</groupId>
			<artifactId>jms</artifactId>
		</exclusion>
		<exclusion>
			<groupId>com.sun.jdmk</groupId>
			<artifactId>jmxtools</artifactId>
		</exclusion>
		<exclusion>
			<groupId>com.sun.jmx</groupId>
			<artifactId>jmxri</artifactId>
		</exclusion>
	</exclusions>
	<scope>runtime</scope> 
</dependency>

맨 아래에

<scope>runtime</scope> 을 주석처리 해주면 해결된다.

주석처리 한 모습
에러가 사라진 화면

반응형
반응형

forEach를 사용할 때, for문처럼 특정한 범위만 지정해주려면 어떻게 해야할까?

간단하다. begin, end, step으로 범위를 지정해줄 수 있다.

 

// jstl forEach에서 특정 범위 제한 두기
	<c:forEach var="test" begin="0" end="9" step="2">
		<div></div>
	</c:forEach>

위 코드의 의미는 0부터 시작해서 9까지 2씩 올라가는 범위로 나타낸다는 의미이다.

반응형

+ Recent posts