티스토리 뷰

IT/Lv2

프로그래머스 문제풀이 Level 2

Stv 2023. 1. 2. 22:40

목차


    1. 마법의 엘리베이터

    👉 소스코드

    public int solution(int storey) {
            int answer = 0;
            int nextCnt = 0;
            int flag = 0;
            if(storey <= 5) return storey;
    		while(storey != 0) {
    			if(storey % 10 == 5) {
    				answer += 5;
    				// 그다음 자리수가 5보다 큰지 확인
    				int tmp = storey;
    				tmp /= 10;
    				if(tmp % 10 >= 5 && tmp > 50) {
    					nextCnt = 1;
    				}
    			}
    			if(storey % 10 < 5) {
    				answer += storey % 10;
    			}
    			if(storey % 10 > 5) {
    				answer += 10 - (storey % 10);
    				flag = 1;
    			}
    			storey /= 10;
    			// 5일때 다음 자리수 값
    			if(nextCnt == 1) {
    				storey += 1;
    				nextCnt = 0;
    			}
    			// 5보다 큰수일때 그 다음 자리수 
    			if(flag == 1) {
    				storey += 1;
    				flag = 0;
    			}
    		}
            return answer;
        }

    2. 테이블 해시 함수

    👉 소스코드

    public int solution(int[][] data, int col, int row_begin, int row_end) {
    		int answer = 0;
    		// col번째 값을 기준으로 오름차순 정렬 -> 값이 같으면 0번째 값을 기준으로 내림차순 정렬
    		for (int i = 0; i < data.length; i++) {
    			for (int j = i + 1; j < data.length; j++) {
    				if (data[i][col - 1] == data[j][col - 1]) {
    					if (data[i][0] < data[j][0]) {
    						int[] tmp = data[j];
    						data[j] = data[i];
    						data[i] = tmp;
    					}
    				}else if(data[i][col - 1] > data[j][col - 1]) {
    					int[] tmp = data[i];
    					data[i] = data[j];
    					data[j] = tmp;
    				}
    			}
    			
    		}
    		// row_begin, row_end값 합		
    		for(int i = row_begin - 1 ; i < row_end; i++) {
    			int sum = 0;
                for(int column : data[i]) sum += (column % (i + 1));
                answer ^= sum;			
    		}	
    		return answer;
    	}

    3. 롤케이크 자르기

    👉 소스코드

     

    public int solution(int[] topping) {
            int answer = 0;
            HashSet<Integer> left = new HashSet<Integer>();
            HashMap<Integer, Integer> right = new HashMap<Integer, Integer>();
    
            left.add(topping[0]);
            for(int i = 1; i < topping.length; i++) {
                right.put(topping[i], right.getOrDefault(topping[i], 0) + 1);
            }
    
            for(int i = 1; i < topping.length; i++) {
                left.add(topping[i]);
                right.put(topping[i], right.get(topping[i]) - 1);
                if(right.get(topping[i]) == 0) {
                    right.remove(topping[i]);
                }
    
                if(left.size() == right.size()) answer++;
            }
    
    
            return answer;
        }

    - HashMap에 각 숫자들의 개수를 mapping 한 뒤, Set에 담아가면서 사이즈가 같은지 확인하는 아이디어 이 마저도 처음에 풀지 못하여 다른 사람의 풀이를 보고 이해한 후 풀이를 진행하였다.

    4. 혼자 놀기의 달인

    👉 소스코드

    public int solution(int[] cards) {
            List<Integer> list = new ArrayList<>();
            for (int i = 0; i < cards.length; i++) {
                int cnt = 0;
                int k = i;
                while (true) {
                    if (cards[k] != -1) {
                    	int tmp = cards[k] - 1; 
                        cards[k] = -1;
                        k = tmp; 
                        cnt++;
                    } else {
                    	list.add(cnt);
                        break;
                    }
                }
            }
            list.sort(Collections.reverseOrder());
            return list.get(0) * list.get(1);
        }

    - 방문한 자리는 -1로 바꿔주고 그 다음 방문할 인덱스가 -1이라면 그룹 상자가 다 만들어졌다고 판단.

    만들어진 그룹 상자의 length는 count변수로 체크하고 list에 add

    5. k진수에서 소수 개수 구하기

    👉 소스코드

    public int solution(int n, int k) {
            int answer = 0;
            String str = Integer.toString(n, k);        
            str = str.replaceAll("101 | 0", " ").replaceAll("0", " ").replaceAll("\\s+", " ").trim();
    
            String[] array = str.split(" ");
            for(int i=0;i<array.length;i++){
                BigInteger b1 = new BigInteger(array[i]);
                if(b1.isProbablePrime(10)) ++answer;          
            }
    
            return answer;
        }

    6. 모음사전

    👉 소스코드

    public int solution(String word) {
        int answer = 0;
        int[] cha = {781, 156, 31, 6, 1};
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        map.put("A", 0);
        map.put("E", 1);
        map.put("I", 2);
        map.put("O", 3);
        map.put("U", 4);
    
        String[] wordArr = word.split("");
        answer += wordArr.length;
    
        for(int i = 0; i < wordArr.length; i++) {
            answer += cha[i] * map.get(wordArr[i]);
        }
    
        return answer;
    }

     

    - 각 자리에 필요한 수를 파악하는 것이 순서였습니다. 각 자리에 필요한 수는 전번 자리수 * 5 + 1 공식이 성립됩니다.

    6. 무인도 여행

    👉 소스코드

    import java.util.*;
    class Solution {
        static int num = 0;
        static boolean[][] visited;
        static int[] moveX = {0, 0, -1, 1};
        static int[] moveY = {-1, 1, 0, 0};
        static char[][] ch;
        static ArrayList<Integer> list = new ArrayList<Integer>();
        
        public int[] solution(String[] maps) {
            
            ch = new char[maps.length][maps[0].length()];
            visited = new boolean[maps.length][maps[0].length()];
            for(int i = 0; i < ch.length; i++) {
                ch[i] = maps[i].toCharArray();
            }
            
    
            for(int i = 0; i < ch.length; i++) {
                for(int j = 0; j < ch[i].length; j++) {          
                    if(ch[i][j] != 'X') {
                        num = 0;
                        if(!visited[i][j]) {
                            num = Character.getNumericValue(ch[i][j]);
                            bfs(i, j, num);    
                        }
                        if(num != 0) {
                            list.add(num);
                                                    
                        }
                    }
                }
            }
            
            int[] answer = new int[list.size()];
           
            if(list.isEmpty()) {
                answer = new int[1];
                answer[0] = -1;
            }else {
                Collections.sort(list);
                for(int i = 0; i < list.size(); i++) {
                    answer[i] = list.get(i);
                }
            }
    
            return answer;
        }
        
        public static void bfs(int x, int y, int cnt) {
            
            Queue<int[]> q = new LinkedList<int[]>();
            q.offer(new int[]{x, y});
            visited[x][y] = true;
            
            while(!q.isEmpty()) {
                
                int curX = q.peek()[0];
                int curY = q.peek()[1];
                q.poll();
                
                for(int i = 0; i < 4; i++) {
                    
                    int nextX = curX + moveX[i];
                    int nextY = curY + moveY[i];
                    
                    if(nextX < 0 || nextY < 0 || nextX >= ch.length || nextY >= ch[0].length || visited[nextX][nextY]) continue;
                    
                    if(ch[nextX][nextY] != 'X') {
                        q.offer(new int[] {nextX, nextY});
                        visited[nextX][nextY] = true;
                        cnt += Character.getNumericValue(ch[nextX][nextY]);
                    }
                }
                num = cnt;
            }
        }
    }

    - bfs를 활용한 풀이