잡다한 배똥월드

728x90

 

 

 

 

 

 

 

 

 

 

일요일에 풀었는데 문제는 전혀 기억나지 않음... 미리미리 적어놓을껄...

1번부터 3번까지는 확실하게 제출했는데, 4번 문제는 테스트케이스도 몇 개 실패했다고 떴었음

진짜 한 10분만 더 있었어도 풀 수 있었을 것 같은데 아쉬움만 가득해서

아 분명 떨어졌다.. 라고 생각하고 있었는데 다행히 합격!

이제 15일에 2차 준비하러 프로그래머스 과제관 뿌시러 갑니다...

 

 

 

 

 

728x90
728x90

 

코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr

 

 

 

 

 

import java.util.*;

class Solution {
    public String[] solution(String[] record) {
        ArrayList<String> answer = new ArrayList<>();
        
        String[][] list = new String[record.length][2];
        HashMap<String, String> name = new HashMap<>();
        
        for (int i = 0; i < record.length; i++) {
            String[] re = record[i].split(" ");
            
            list[i][0] = re[0];
            list[i][1] = re[1];
            
            if (re[0].equals("Enter") || re[0].equals("Change")) {
                name.put(re[1], re[2]);
            } 
        }
        
        for (int i = 0; i < list.length; i++) {
            if (list[i][0].equals("Enter")) {
                answer.add(name.get(list[i][1]) + "님이 들어왔습니다.");
            } else if (list[i][0].equals("Leave")){
                answer.add(name.get(list[i][1]) + "님이 나갔습니다.");
            }
        }
        
        return answer.toArray(new String[answer.size()]);
    }
}

 

테스트 1 통과 (2.19ms, 73.3MB)
테스트 2 통과 (2.23ms, 75.2MB)
테스트 3 통과 (2.12ms, 76.2MB)
테스트 4 통과 (2.33ms, 76.4MB)
테스트 5 통과 (6.94ms, 75.8MB)
테스트 6 통과 (6.18ms, 88.1MB)
테스트 7 통과 (6.91ms, 77MB)
테스트 8 통과 (5.06ms, 81MB)
테스트 9 통과 (6.84ms, 82.6MB)
테스트 10 통과 (6.35ms, 79.8MB)
테스트 11 통과 (5.49ms, 90.7MB)
테스트 12 통과 (6.56ms, 78.2MB)
테스트 13 통과 (7.23ms, 78MB)
테스트 14 통과 (7.46ms, 86.1MB)
테스트 15 통과 (3.43ms, 86.7MB)
테스트 16 통과 (2.63ms, 79MB)
테스트 17 통과 (3.82ms, 82.9MB)
테스트 18 통과 (3.45ms, 81MB)
테스트 19 통과 (7.14ms, 85.4MB)
테스트 20 통과 (7.64ms, 85.2MB)
테스트 21 통과 (6.84ms, 78.4MB)
테스트 22 통과 (8.49ms, 74.9MB)
테스트 23 통과 (5.17ms, 79.8MB)
테스트 24 통과 (8.81ms, 87.9MB)
테스트 25 통과 (125.01ms, 169MB)
테스트 26 통과 (117.24ms, 160MB)
테스트 27 통과 (113.14ms, 162MB)
테스트 28 통과 (122.73ms, 178MB)
테스트 29 통과 (93.02ms, 175MB)
테스트 30 통과 (81.91ms, 168MB)
테스트 31 통과 (82.04ms, 162MB)
테스트 32 통과 (71.11ms, 164MB)

 

 

 

 

 

유저 ID는 그대로인데 이름은 변경할 수 있다.

그래서 for문으로 record를 순회할건데, 이 때 record[i]의 내용이 Enter이나 Change이면 이름을 변경될 수 있다.

그래서 유저ID에 맞게 이름을 넣기 위해서 해시맵을 사용하였고,

Enter이나 Change면 이름이 같든 다르든 그냥 변경하도록 했다.

 

 

 

 

 

그리고 나서 할 것이 들어왔다 나갔다 하는 문구를 적을 차례인데,

Enter면 들어왔다고, Leave면 나갔다고 문구를 적고 Change는 그냥 넘어가는 식으로 작성하였다.

 

 

 

 

더보기

처음 작성한 코드 : 

 

import java.util.*;

class Solution {
    public String[] solution(String[] record) {
        
        HashMap<String, String> name = new HashMap<>();
        ArrayList<String> data = new ArrayList<>();
        
        for (int i = 0; i < record.length; i++){
            String[] temp = record[i].split(" ");
            
            if (temp[0].equals("Leave")){
                data.add(record[i]);
                continue;
            }
            
            if (temp[0].equals("Enter")){
                data.add(record[i]);
                name.put(temp[1], temp[2]);
                continue;
            }
            
            if (temp[0].equals("Change")){
                name.put(temp[1], temp[2]);
            }
        }
        
        String[] answer = new String[data.size()];
        
        for (int i = 0; i < data.size(); i++){
            String[] temp = data.get(i).split(" ");
            
            String st = name.get(temp[1]);
            
            StringBuilder sb = new StringBuilder(st);
            
            if (temp[0].equals("Enter")){
                sb.append("님이 들어왔습니다.");
            } else if (temp[0].equals("Leave")){
                sb.append("님이 나갔습니다.");
            }
            
            answer[i] = sb.toString();
        }
        
        return answer;
    }
}

 

 

 

 

 

 

 

728x90
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

코딩테스트 연습 - 문자열 압축

데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문

programmers.co.kr

 

 

 

 

 

import java.util.*;

class Solution {
    int answer = 0;
    public int solution(String s) {
        answer = s.length();
        for (int i = 1; i < s.length(); i++) {
            func(s, i);
        }
        
        return answer;
    }
    
    public void func(String s, int cut) {
        int position = 0;
        ArrayList<String> arr = new ArrayList<>();        
        
        // if (s.length() % cut != 0) return;
        
        while (position < s.length()) {
            int temp = (position+cut <= s.length()) ? position+cut : s.length();
            arr.add(s.substring(position, temp));
            position += cut;
        }
        
        String word = arr.get(0);
        StringBuilder sb = new StringBuilder();
        int number = 1;
        
        for (int i = 1; i < arr.size(); i++) {
            String temp = arr.get(i);
            
            if (temp.equals(word)) {
                number++;
            } else {
                if (number != 1) sb.append(number);
                
                sb.append(word);
                
                number = 1;
                word = temp;
            }
        }
        
        if (number != 1) sb.append(number);
        sb.append(word);
        
        // System.out.println(sb.toString() + ", " + sb.length());
        answer = Math.min(answer, sb.length());
        
    }
}

 

테스트 1 통과 (0.10ms, 75MB)
테스트 2 통과 (1.04ms, 77.9MB)
테스트 3 통과 (0.73ms, 68.8MB)
테스트 4 통과 (0.15ms, 69MB)
테스트 5 통과 (0.03ms, 78.2MB)
테스트 6 통과 (0.20ms, 86.9MB)
테스트 7 통과 (1.01ms, 71.6MB)
테스트 8 통과 (1.11ms, 73.6MB)
테스트 9 통과 (2.04ms, 79.1MB)
테스트 10 통과 (7.07ms, 74.7MB)
테스트 11 통과 (0.41ms, 70.3MB)
테스트 12 통과 (0.26ms, 71.1MB)
테스트 13 통과 (0.46ms, 70.9MB)
테스트 14 통과 (1.55ms, 76MB)
테스트 15 통과 (0.28ms, 69.4MB)
테스트 16 통과 (0.07ms, 80.1MB)
테스트 17 통과 (2.26ms, 78.5MB)
테스트 18 통과 (2.26ms, 75.8MB)
테스트 19 통과 (2.18ms, 75.2MB)
테스트 20 통과 (5.41ms, 79.5MB)
테스트 21 통과 (6.29ms, 86.8MB)
테스트 22 통과 (6.04ms, 74.2MB)
테스트 23 통과 (4.74ms, 83.3MB)
테스트 24 통과 (5.05ms, 84.8MB)
테스트 25 통과 (5.94ms, 81.5MB)
테스트 26 통과 (6.17ms, 85.6MB)
테스트 27 통과 (6.64ms, 81.5MB)
테스트 28 통과 (0.07ms, 75.2MB)

 

 

 

 

 

글자 자르는 것은 1글자부터 주어진 글자 s의 길이까지 1글자씩 늘려가면서 자르도록 for문으로 func함수를 호출.

 

 

그래서 substring()으로 글자를 잘라서 ArrayList에 넣고

앞에서부터 글자가 같은지 아닌지를 구분하고 같으면

만약에 글자가 같으면 같은 글자 개수 세는 것 (변수명 : number)에 +1,

다르면 StringBuilder에 number이랑 글자 추가 후 초기화.

 

 

 

 

그리고 for문이 끝나면 StringBuilder 길이랑 answer 길이 비교해서 작은 것 리턴으로 끝..

 

 

 

 

 

 

 

 

뭔가 예전엔 엄청 복잡하게 한 것 같은데.. 이번엔 비교적 쉽게 푼 것 같다.

 

더보기

예전에 풀었던 코드

 

class Solution {
    public int solution(String s) {
        int answer = Integer.MAX_VALUE;
        
        for (int i = 1; i <= s.length() / 2; i++){
            int num = 1;
            
            int a = 0;
            if (s.length() % i != 0) a = 1;
            
            String[] data = new String[(s.length() / i) + a];
            
            for (int j = 0; j < data.length; j++){
                int start = j * i;
                int end = (j + 1) * i;
                
                if (end > s.length()) end = s.length();
                data[j] = s.substring(start, end);
            }
        
            int size = 0;
            for (int j = 0; j < data.length - 1; j++){
                String first = data[j];
                String second = data[j + 1];
                
                if (first.equals(second)){
                    num++;
                } else {
                    if (num == 1){
                        size += first.length();
                    } else {
                        size += first.length() + Integer.toString(num).length();
                    }
                    
                    num = 1;
                }
            }
            
            if (num == 1){
                size += data[data.length - 1].length();
            } else {
                size += data[data.length - 1].length() + Integer.toString(num).length();
            }            
            answer = Math.min(answer, size);
        }
        
        if (s.length() == 1){
            answer = 1;
        }
        
        return answer;
    }
}

 

728x90
728x90

 

 

 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

 

 

 

 

N×N 크기의 격자판이 있다. 각각의 격자는 비어 있거나(‘.’), 막혀 있다(‘#’). 이때, 막혀 있는 칸들이 하나의 정사각형을 이루는지를 판단하는 프로그램을 작성하라.

[입력]
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스의 첫 번째 줄에는 격자판의 크기 N (1≤N≤20 이 주어진다. 다음 N개의 줄은 격자판의 배치를 나타내며, 각 줄에는 ‘.’ 또는 ‘#’로만 이루어진 길이가 N인 문자열이 주어진다. 모든 격자판에는 최소 1개 이상의 ‘#’ 칸이 있음이 보장된다.

[출력]
각 테스트 케이스마다 격자판의 막혀 있는 칸들이 하나의 정사각형을 이루면 ‘yes’를, 그렇지 않다면 ‘no’를 출력한다.

 

 

 

 

 

 

 

작성 코드

import java.util.*;
import java.io.*;

class Solution {
	public static void main(String args[]) throws Exception {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
		int T = Integer.parseInt(br.readLine());
        
		for(int test_case = 1; test_case <= T; test_case++) {
			int n = Integer.parseInt(br.readLine());
            
            String[][] map = new String[n][n];
            int firstR = -1;
            int firstC = -1;
            int count = 0;
            String answer = "yes";
            
            for (int i = 0; i < n; i++) {
            	String s = br.readLine();
                String[] arr = s.split("");
                
                map[i] = Arrays.copyOf(arr, arr.length);
                count += s.replace(".", "").length();
                
                if (firstR == -1 && firstC == -1 && s.indexOf("#") != -1) {
                	firstR = i;
                    firstC = s.indexOf("#");
                }
            }
            
            int size = 0;
            
            for (int i = 1; i <= n; i++) {
            	if (i * i == count) {
                    size = i;
                    break;
                }
            }
            
            if (size == 0 || firstR + size > n || firstC + size > n) {
                System.out.printf("#%d %s%n", test_case, "no");
                continue;
            }
            
            loop:
            for (int i = firstR; i < firstR + size; i++) {
                for (int j = firstC; j < firstC + size; j++) {
                    if (!map[i][j].equals("#")) {
                        answer = "no";
                        break loop;
                    }
                }
            }
            
            System.out.printf("#%d %s%n", test_case, answer);
		}
	}
}

 

 

 

 

어차피 #들이 다 붙어있어야 하기 때문에 처음 시작하는 행, 열 좌표를 구했고,

아래의 경우를 예를 들면 가로 세로 길이를 구할 땐 2로 나올 것이다.

근데 첫 시작 지점이 (0, 2)이기 때문에 범위 오류가 나기 때문에

만약에 첫 시작 지점에서 가로 세로로 갈 수 없으면 그냥 no 리턴.

 

 

 

 

 

 

 

모양에 대해서는 여러 경우의 수가 있기 때문에

다양한 모양을 생각해서 코드를 짜야만 했다.

 

 

 

 

 

 

 

 

풀고 난 지금에서야 코드를 보면 간단하다고 생각이 들지만

경우의 수를 생각하는 게 조금 어려웠다....

 

거즘 4번만에 통과한...

 

 

 

 

 

728x90
728x90

문제

정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다.

  • 1+1+1+1
  • 1+1+2
  • 1+2+1
  • 2+1+1
  • 2+2
  • 1+3
  • 3+1

정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 11보다 작다.

 

출력

각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.

 

 

 

import java.io.*;
import java.util.*;

public class Main {
	
	static int answer;
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int n = Integer.parseInt(br.readLine());
		
		for (int i = 0; i < n; i++) {
			int num = Integer.parseInt(br.readLine());
			answer = 0;
			
			func(num, 0);
			
			bw.write(answer + "\n");
		}
		
		bw.flush();
		bw.close();
		
	}
	
	public static void func(int num, int now) {
		if (num == now) {
			answer++;
			
			return;
		}
		
		if (num < now) return;
		
		int[] list = {1, 2, 3};
		
		for (int i = 0; i < list.length; i++) {
			func(num, now + list[i]);
		}
	}
}

 

 

 

1, 2, 3이 들어있는 배열 만들고, for문으로 돌리면서 함수를 호출하는데,

만약에 num보다 숫자가 커지면 그냥 리턴하고, 같으면 answer + 1, 작으면 다시 for문 돌리는 식으로 짬.

 

 

 

728x90

+ Recent posts