https://programmers.co.kr/learn/courses/30/lessons/12921?language=java

 

코딩테스트 연습 - 소수 찾기

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요. 소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.) 제한 조건 n은 2이상

programmers.co.kr

해결 방안

주어진 숫자 n의 1~n 까지의 소수 갯수를 찾는 문제이다.

에라토스테네스의 체를 사용하여 i 가 소수인지 확인하였다.

 

코드

class Solution {
    public int solution(int n) {
        int answer = 0;
        
        for(int i=2; i<=n; i++){
            if(i==2){
                answer++;
                continue;
            }
            
            // 소수 아님
            if(i%2==0) continue;
            
            // 소수 아님
            boolean flag = true;
            for(int j=3; j<=(int)(Math.sqrt(i)); j+=2){
                if(i%j==0) {
                    flag = false;
                    break;
                }
            }
            if(flag){
                answer++;
            }
                
        }
    
        return answer;
    }
}

https://programmers.co.kr/learn/courses/30/lessons/12906?language=java

 

코딩테스트 연습 - 같은 숫자는 싫어

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은

programmers.co.kr

해결 방안

standard라고 기준을 만들고 기준과 같으면 중복된 숫자이므로 넘어가고 다른 숫자가 나오면 list에 넣어준다.

그 후 list를 int 배열에 옮겨준다.

 

코드

import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
        int[] answer;
        List<Integer> list = new ArrayList<>();
        
        int standard = arr[0];
        list.add(arr[0]);
        for(int i=1; i<arr.length; i++){
            if(arr[i] == standard){
                continue;
            }
            else{
                standard = arr[i];
                list.add(arr[i]);
            }
        }
        
        answer = new int[list.size()];
        for(int i=0; i<list.size(); i++){
            answer[i] = list.get(i);
        }
        
        return answer;
    }
}

https://programmers.co.kr/learn/courses/30/lessons/12918?language=java

 

코딩테스트 연습 - 문자열 다루기 기본

문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 a234이면 False를 리턴하고 1234라면 True를 리턴하면 됩니다. 제한 사항 s는 길이 1 이��

programmers.co.kr

해결 방안

문자열 s의 길이가 4나 6이 아니면 false를 return 해준다.

Character의 isDigit() 함수를 사용하여 문자열 s의 각 자리의 char의 숫자여부를 확인해준다.
만약 false가 나오면 문자이므로 false를 returnn 해준다.

* Character.isDigit(char c) :  c가 숫자면 true를 return 해주는 함수

코드

class Solution {
    public boolean solution(String s) {
        boolean answer = true;
        
        if(s.length()!=4 && s.length()!=6){
            return false;
        }
        else{
            for(int i=0; i<s.length(); i++){
                // isDigit(): 숫자이면 true
                if(!Character.isDigit(s.charAt(i)))
                    return false;
            }
        }
        
        return answer;
    }
}

https://programmers.co.kr/learn/courses/30/lessons/12915?language=java

 

코딩테스트 연습 - 문자열 내 마음대로 정렬하기

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 [sun, bed, car]이고 n이 1이면 각 단어의 인덱스 1�

programmers.co.kr

해결 방안

Comparator를 활용하여 n번째 index 값을 strings[i] 앞에 붙여서 순서를 정렬하였습니다.

코드

import java.util.*;
// 문자열 내 마음대로 정렬하기
class Solution {
    // strings 길이 1~50
    // strings[i] 길이 1~100
    public String[] solution(String[] strings, int n) {
        String[] answer = new String[strings.length];
        
        Arrays.sort(strings, new Comparator<String>(){
            @Override
            public int compare(String s1, String s2){
                return ((s1.charAt(n)+"")+s1).compareTo(((s2.charAt(n)+"")+s2));
            }
        });
        
        for(int i=0; i<strings.length; i++){
            answer[i] = strings[i];
        }
        
        return answer;
    }
}

https://programmers.co.kr/learn/courses/30/lessons/12951#

 

코딩테스트 연습 - JadenCase 문자열 만들기

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요. 제한 조건

programmers.co.kr

해결 방안

s를 함부로 split 하게 되는 경우 주어진 s  중 3People__abc 와 같은 경우 두 번 띄어쓰기를 처리하는데 어려움을 겪었다. 따라서 StringBuilder를 이용하여 i일 때 i-1 인덱스가 " "인 경우 대문자로 변환해주었다.
이 때 StringBuilder의 setCharAt()을 이용하여 i번 째 char형을 쉽게 바꿀 수 있었으며 Character.toUpperCase()를 이용하여 해당 char를 대문자로 바꿀 수 있다.

* StringBuilder의 setCharAt(int i, char c) :  StringBuilder 변수의 i번째 index의 character를 c로 바꿔준다.

Character.toUpperCase(char c) : c를 대문자로
Character.toLowerCase(char c) : c를 소문자로  

코드

//JadenCase 문자열 만들기
class Solution {
    public String solution(String s) {
        String answer = "";
        
        s = s.toLowerCase();
        
        StringBuilder sb = new StringBuilder(s);
        for(int i=0; i<s.length(); i++){
            if(s.charAt(i) == ' '){
                continue;
            }
            
            if(i==0)
                sb.setCharAt(i, Character.toUpperCase(s.charAt(i)));
            else if(i>0){
                if(s.charAt(i-1) == ' ')
                    sb.setCharAt(i, Character.toUpperCase(s.charAt(i)));
            }
        }
        
        answer = new String(sb);
        
        return answer;
    }
}

https://programmers.co.kr/learn/courses/30/lessons/12899?language=java#

 

코딩테스트 연습 - 124 나라의 숫자

124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다. 124 나라에는 자연수만 존재합니다. 124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.

programmers.co.kr

해결 방안

3진법의 응용과정이다.

3으로 나눴을때 나머지가 0인 경우를 처리해주면된다. (4가 되고 n-=1 해주는)

코드

// 124 나라의 숫자
class Solution {
    public String solution(int n) {
        String answer = "";
        
        int rest = 0;
        while(n>0){
            rest = n%3;
            n /= 3;
            
            if(rest==0){
                rest = 4;
                n-=1;
            }
            answer = rest + answer;
        }
        return answer;
    }
}

https://www.acmicpc.net/problem/15686

 

15686번: 치킨 배달

크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸

www.acmicpc.net

문제

DFS + 구현 문제이다. 처음 시간 초과나서 방법을 좀 바꿔서 다시 풀었다.

 

해결 방안

처음에는 전체 집List, 전체 치킨집List와 visited 배열을 사용하여 전체 치킨집 중 M개를 DFS 와 백트래킹을 이용하여 구현하였다. 
하지만 거리를 구하는 과정에서 전체 집에서 전체 치킨집을 돌면서 M개에 포함되지 않는 경우도 조건을 통해 거르다 보니 시간 초과가 났다.

그래서 다음에는 visited 배열을 빼고 선택된 치킨집List를 만들어 M개 만큼 선택된 치킨집 List를 만들어서 거리를 구하였더니 맞출 수 있었다.

나머지 부분은 크게 어렵지 않은 부분이여서 생략한다.

 

코드 (시간 초과)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

// 치킨 배달
// NxN 도시
// 1x1 칸 (0:빈칸, 1:집, 2:치킨집)
// (r, c) r,c는 1부터 시작
// 치킨 거리 : 집과 가장 가까운 치킨집 사이의 거리
// 도시의 치킨 커리는 모든 집의 치킨 거리의 합
// 치킨집 갯수 M개

// M개 이외 치킨집 폐업, 도시의 치킨 거리가 가장 작게 될지 구하는 프로그램
public class Main {
	
	static int N; // 도시 크기 NxN(2~50)
	static int M; // 최대 치킨집 갯수(1~13)
	static int[][] map;

	static List<int[]> hList = new ArrayList<>(); // 전체 집 위치
	static List<int[]> cList = new ArrayList<>(); // 전체 치킨 집 위치
	static boolean[] visited;
	
	static int min = Integer.MAX_VALUE; // 가장 작은 도시의 치킨 거리
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str;
		str = br.readLine();
		
		N = Integer.parseInt(str.split(" ")[0]);
		M = Integer.parseInt(str.split(" ")[1]);
		
		map = new int[N+1][N+1];
		
		StringTokenizer st;
		for(int i=1; i<N+1; i++) {
			str = br.readLine();
			st = new StringTokenizer(str, " ");
			for(int j=1; j<N+1; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
				
				// 집 리스트
				if(map[i][j] == 1) {
					hList.add(new int[] {i, j});
				}
				// 치킨집 리스트
				else if(map[i][j] == 2) {
					cList.add(new int[] {i, j});
				}
			}
		}
		visited = new boolean[cList.size()];
		// ==== 입력 끝 =====
		
		dfs(0);
		
		System.out.println(min);

	}
	
	// 치킨집이 M만큼 있는 경우의 치킨 거리 탐색
	static void dfs(int depth) {
		// 치킨 집이 M만큼 있는 경우
		if(depth >= M) {
			int distanceSum = 0;
			
			int minDistance;
			int distance;
			// 각 집에서 M에 포함되는 치킨집들 중 가장 짧은 치킨 거리구하기
			for(int i=0; i<hList.size(); i++) {
				minDistance = Integer.MAX_VALUE;
				distance = 0;
				for(int j=0; j<cList.size(); j++) {
					// M에 포함된 치킨집
					if(visited[j]) {
						distance = Math.abs(hList.get(i)[0]-cList.get(j)[0]) + Math.abs(hList.get(i)[1]-cList.get(j)[1]);
						minDistance = Math.min(distance, minDistance);
					}
				}
				
				distanceSum += minDistance;
			}
			
			// 가장 작은 도시의 치킨 거리 구하기
			min = Math.min(min, distanceSum);
		}
		else {
			// M과 치킨집 갯수가 같으면 폐업되는 치킨 집 없음
			if(M == cList.size()) {
				for(int i=0; i<cList.size(); i++) {
					visited[i] = true;
				}
				dfs(M);
			}
			// list에서 치킨집 M만큼 고르기
			else {
				for(int i=0; i<cList.size(); i++) {
					if(!visited[i]) {
						visited[i] = true;
						dfs(depth+1);
						visited[i] = false;
					}
				}
			}
		}
	}

}

 

코드 (합격)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

// 치킨 배달
// NxN 도시
// 1x1 칸 (0:빈칸, 1:집, 2:치킨집)
// (r, c) r,c는 1부터 시작
// 치킨 거리 : 집과 가장 가까운 치킨집 사이의 거리
// 도시의 치킨 커리는 모든 집의 치킨 거리의 합
// 치킨집 갯수 M개

// M개 이외 치킨집 폐업, 도시의 치킨 거리가 가장 작게 될지 구하는 프로그램
public class Main {
	
	static int N; // 도시 크기 NxN(2~50)
	static int M; // 최대 치킨집 갯수(1~13)
	static int[][] map;

	static List<int[]> hList = new ArrayList<>(); // 전체 집 위치
	static List<int[]> cList = new ArrayList<>(); // 전체 치킨 집 위치
	static List<int[]> selected = new ArrayList<>(); // 선택된 치킨집
	
	static int min = Integer.MAX_VALUE; // 가장 작은 도시의 치킨 거리
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str;
		str = br.readLine();
		
		N = Integer.parseInt(str.split(" ")[0]);
		M = Integer.parseInt(str.split(" ")[1]);
	
		map = new int[N+1][N+1];
		
		StringTokenizer st;
		for(int i=1; i<N+1; i++) {
			str = br.readLine();
			st = new StringTokenizer(str, " ");
			for(int j=1; j<N+1; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
				
				// 집 리스트
				if(map[i][j] == 1) {
					hList.add(new int[] {i, j});
				}
				// 치킨집 리스트
				else if(map[i][j] == 2) {
					cList.add(new int[] {i, j});
				}
			}
		}
		// ==== 입력 끝 =====
		
		dfs(0,0);
		
		System.out.println(min);

	}
	
	// 치킨집이 M만큼 있는 경우의 치킨 거리 탐색
	static void dfs(int idx, int depth) {
		// 치킨 집을 M만큼 고른 경우
		if(depth >= M) {
			int distanceSum = 0;
			
			int minDistance;
			int distance;
			// 각 집에서 M에 포함되는 치킨집들 중 가장 짧은 치킨 거리구하기
			for(int i=0; i<hList.size(); i++) {
				minDistance = Integer.MAX_VALUE;
				distance = 0;
				for(int j=0; j<selected.size(); j++) {
					// M에 포함된 치킨집
					distance = Math.abs(hList.get(i)[0]-selected.get(j)[0]) + Math.abs(hList.get(i)[1]-selected.get(j)[1]);
					minDistance = Math.min(distance, minDistance);
					
				}
				distanceSum += minDistance;
			}
			
			// 가장 작은 도시의 치킨 거리 구하기
			min = Math.min(min, distanceSum);
		}
		else {
			
			// list에서 치킨집 M만큼 고르기
			for(int i=idx; i<cList.size(); i++) {
				selected.add(cList.get(i));
				dfs(i+1, depth+1);
				selected.remove(depth);
			}
			
		}
	}

}

+ Recent posts