[Cos Pro] 3_5_Happy Birthday (java) 문자열

2020-04-30

3_5_Happy Birthday (Cos Pro> 문자열)

풀이

package String;

public class cospro_3_5_happybirthday {

   static public String solution(String phrases, int second) {
        String answer = "";
        String display = "";
        display = "______________" + phrases;
        
        for(int i = 0; i < second; ++i) {
        	System.out.println(display +  " "+Character.toString(display.charAt(0)));
        	
        	//display 맨앞거를 뒤에 붙이고
        	display = display + Character.toString(display.charAt(0));

        	//맨앞을 제거한다
        	display = display.substring(1);
        }
        
        //앞에서부터 14개만
        answer = display.substring(0,14);
        return answer;
    }
	
	public static void main(String[] args) {
		String s = "happy-birthday";
		System.out.println(solution(s, 20));
		
	}
}

후기 (–)

뒤에 무엇인가가 생기고 앞에 무엇인가를 떼면 되었던 간단하지만 생각못했던 문제!

  1. display의 개수는 14개로 고정되어있고, 뒤에 붙는 문자열도 정해져있다.
  2. 그렇다면 display에 문자열을 붙힌 후,
  3. 초가 지날 때마다 display(0)을 맨뒤에 붙이고, display(0)번째를 제거해준다
  4. 그리고 난 후, 앞에서부터 14개만을 출력한다
Read More

[Cos Pro] 3_4_겹치는 문자열 합치기 (java) 문자열

2020-04-30

3_4_겹치는 문자열 합치기 (Cos Pro> 문자열)

풀이

package String;

public class cospro_3_4_겹치는문자열합치기 {
	public static void main(String[] args) {
		String s1 = "ababc";
		String s2 = "abcdab";
		
		int len=0;
		
		if(s1.length()>s2.length())
			len=s2.length();
		else
			len= s1.length();
			
		String a1 = "";
		String a2 = "";
		
		int num = 1;
		for(int i=0; i<len; i++,num++) {
			if(s1.substring(s1.length()-num,s1.length()).equals(s2.substring(0, num)))
				a1 = s1.substring(0,s1.length()-i-1) + s2;
		}
		
		num= 1;
		for(int i=0; i<len; i++,num++) {
			if(s2.substring(s2.length()-num,s2.length()).equals(s1.substring(0, num)))
				a2 = s2.substring(0,s2.length()-i-1) + s1;
		}
		
		System.out.println("1" + a1);
		System.out.println("2" + a2);
 	}
}

후기 (–)

겹치는 부분만큼의 idx를 찾아내고!

  1. s1의 뒤와 s2의 앞부터 비교한다면
    • s1의 substring(0,겹치기직전까지) + s2의 전체를 다 더해준다
    • s1과 s2중 어떤게 더 작은지도 찾아놔야 outOfIndex 안걸린다
  2. s2의 뒤와 s1의 앞부터 비교한다면
    • 위와 똑같이 해주면 된다
Read More

[Cos Pro] 3_7_숫자 분리하기 (java) Math

2020-04-29

3_7_숫자 분리하기 (Cos Pro> Math)

풀이

package Math;

public class cospro_3_7_숫자분리하기 {

	public static void main(String[] args) {
		int a = 123456789;
		
		int divisor = 1;
		while(a/divisor !=0) { //a%divisor면 들어가지도 않고 끝남
			int f = a/divisor;
			int b = a%divisor;
			
			divisor *= 10;
			
			System.out.println(f + "  " + b);
		}
	}
}

후기 (–)

간단한 것도 복잡하게 생각하게 되니까…

리프레시 필수!

  1. 12345라는 숫자를 12345 / 1, 2345 / 12, 345 / 123, 45 … 이런 식으로 분리하고싶다면
  2. divisor를 1로 초기화한 후, 앞은 a/divisor 뒤는 a%divosor로 진행!
Read More

[프로그래머스] 입국심사 (java) 이분탐색

2020-04-29

입국심사 (프로그래머스> 이분 탐색)

문제 링크

문제설명

n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다.

처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한 명만 심사를 할 수 있습니다. 가장 앞에 서 있는 사람은 비어 있는 심사대로 가서 심사를 받을 수 있습니다. 하지만 더 빨리 끝나는 심사대가 있으면 기다렸다가 그곳으로 가서 심사를 받을 수도 있습니다.

모든 사람이 심사를 받는데 걸리는 시간을 최소로 하고 싶습니다.

입국심사를 기다리는 사람 수 n, 각 심사관이 한 명을 심사하는데 걸리는 시간이 담긴 배열 times가 매개변수로 주어질 때, 모든 사람이 심사를 받는데 걸리는 시간의 최솟값을 return 하도록 solution 함수를 작성해주세요.

제한사항
  • 입국심사를 기다리는 사람은 1명 이상 1,000,000,000명 이하입니다.
  • 각 심사관이 한 명을 심사하는데 걸리는 시간은 1분 이상 1,000,000,000분 이하입니다.
  • 심사관은 1명 이상 100,000명 이하입니다.
입출력 예
n times return
6 [7, 10] 28
입출력 예 설명

가장 첫 두 사람은 바로 심사를 받으러 갑니다.

7분이 되었을 때, 첫 번째 심사대가 비고 3번째 사람이 심사를 받습니다.

10분이 되었을 때, 두 번째 심사대가 비고 4번째 사람이 심사를 받습니다.

14분이 되었을 때, 첫 번째 심사대가 비고 5번째 사람이 심사를 받습니다.

20분이 되었을 때, 두 번째 심사대가 비지만 6번째 사람이 그곳에서 심사를 받지 않고 1분을 더 기다린 후에 첫 번째 심사대에서 심사를 받으면 28분에 모든 사람의 심사가 끝납니다.


풀이

package 이분탐색;

import java.util.*;

public class prog_3_입국심사 {

	static public long solution(int n, int[] times) {
        long answer = Long.MAX_VALUE;
        
        long left = 0;
        long right = 0;
        long mid;
        
        for (int time : times) {
            if (time > right) {
                right = time;
            }//right에 max값 담는다
        }

        right *= n; //최대 오래걸리는 사람이 다 계산할 경우
        
        while(left<=right) {
        	mid = (left+right)/2;
        	
        	long temp = 0;
        	for(int time:times) {
        		temp += mid/time;
        	}
        	if(temp <n)
        		left = mid+1;
        	else {
                //답이 될 수 있는 것은 이곳에!!
        		if(mid<answer)//mid가 더 작으면 answer에 넣는다
        			answer = mid;
        		
        		right = mid-1;
        	}	
        }
        return answer;
    }
	
	
	public static void main(String[] args) {
		int t[] = {7,10};
		
		System.out.println(solution(6,t));
	}
}

후기 (1h)

역시… 이분탐색은…

  1. 최대로 오래걸리는 시간을 right에
  2. 최소시간인 0을 left에 두고
  3. left가 right와 같아지거나, 커지는 상황에서 멈춘다
  4. right와 left의 /2를 mid로 두고
  5. mid로 계산해본 값이 n보다 작다면 -> left를 증가 시킨다
  6. mid가 n보다 크다면 -> 아직 더 낮춰야하므로 right를 감소시킨다
    • 이 때! mid보다 answer가 크다면 answer = mid;
Read More

[프로그래머스] 가장 먼 노드 (java) Bfs

2020-04-29

가장 먼 노드 (프로그래머스 > Dfs_Bfs)

문제 링크

문제설명

n개의 노드가 있는 그래프가 있습니다. 각 노드는 1부터 n까지 번호가 적혀있습니다. 1번 노드에서 가장 멀리 떨어진 노드의 갯수를 구하려고 합니다. 가장 멀리 떨어진 노드란 최단경로로 이동했을 때 간선의 개수가 가장 많은 노드들을 의미합니다.

노드의 개수 n, 간선에 대한 정보가 담긴 2차원 배열 vertex가 매개변수로 주어질 때, 1번 노드로부터 가장 멀리 떨어진 노드가 몇 개인지를 return 하도록 solution 함수를 작성해주세요.

제한사항
  • 노드의 개수 n은 2 이상 20,000 이하입니다.
  • 간선은 양방향이며 총 1개 이상 50,000개 이하의 간선이 있습니다.
  • vertex 배열 각 행 [a, b]는 a번 노드와 b번 노드 사이에 간선이 있다는 의미입니다.
입출력 예
n vertex return
6 [[3, 6], [4, 3], [3, 2], [1, 3], [1, 2], [2, 4], [5, 2]] 3
입출력 예 설명

예제의 그래프를 표현하면 아래 그림과 같고, 1번 노드에서 가장 멀리 떨어진 노드는 4,5,6번 노드입니다.

image.png


풀이

package Dfs_Bfs;

//15min
import java.util.*;
public class prog_re_가장먼노드 {

    static public int solution(int n, int[][] edge) {
        int answer = 0;
        
        //1에서 n까지 가는 최소 경로들을 다 저장해놓는 배열
        int root[] = new int[n+1];
        
        Queue<Integer> qu = new LinkedList<>();
        
        qu.add(1);
        root[1] = 1;
        
        int max = 0;
        
        while(!qu.isEmpty()) {
        	int now = qu.poll();
        	
        	for(int i=0; i<edge.length; i++) {
        		if(now==edge[i][0] && root[edge[i][1]] ==0) {
        			root[edge[i][1]] += root[now]+1;
        			qu.add(edge[i][1]);
        			max = Math.max(max, root[edge[i][1]]);
        		}
        		
        		if(now==edge[i][1] && root[edge[i][0]] ==0) {
        			root[edge[i][0]] += root[now]+1;
        			qu.add(edge[i][0]);
        			max = Math.max(max, root[edge[i][0]]);
        		}
        	}
        	
        }     
        
        for(int i : root) {
        	if(max == i)
        		answer++;
        }
        
        return answer;
    }	
}

후기 (15min)

전에 풀 때는 마찬가지로 한시간 걸렸던 문제! 심지어 시간초과도 걸렸었던 아주아주 총체적 난국의 문제였는…데!

그래도 그 사이에 좀 익혀놨다고 쉽게 풀 수 있었다!

  • 1에서 n까지 가는 길의 최소 경로는 BFS를 이용해 갈 수 있는 곳들을 다 찾아서 qu에 넣고
  • root 배열에는 1에서 n으로 갈 수 있을 때, 숫자를 넣어주고 다신 안들어가게 하면
  • visited와 같은 효과를 낼 수 있다!
Read More