프로그래머스 - 2

·2024년 12월 7일
0

코테

목록 보기
9/11

문제 6 - 카드 뭉치

class Solution {
    public String solution(String[] cards1, String[] cards2, String[] goal) {
        
        int c1 = 0;
        int c2 = 0;
        
         for(int i = 0; i < goal.length; i++) {
             if(c1 < cards1.length && cards1[c1].equals(goal[i])) {
                 c1++;
             } else if (c2 < cards2.length && cards2[c2].equals(goal[i])) {
                 c2++;
             } else {
                 return "No";
             }
         }
        
        return "Yes";
        
    }
}

인덱스를 따로 둬서 순서대로 되어있는지 체크하면 끝


문제 7 - 둘만의 암호
1. 빠르게 조회하기 위해 list에 넣어 포함되어 있는지 안 되어있는지 확인
2. 속도를 위해 StringBuilder 사용해서 append 실행

import java.util.*;

class Solution {
	
    public String solution(String s, String skip, int index) {
        
        // 1. 쉬운 탐색을 위해 list로 변환
        List<Character> skipList = new ArrayList<>();
        
        for(int i = 0; i < skip.length(); i++) {
            skipList.add(skip.charAt(i));
        }
                 
         StringBuilder result = new StringBuilder();
                         
        // 2. 순회하며 확인
        for(char c : s.toCharArray()) {
            char cCount = c;
            
            for(int i = 1; i <= index; i++) {
                cCount++;
                
                if(cCount > 'z') {
                    cCount = 'a';
                }
                
                if(skipList.contains(cCount)) {
                    i--; // cCount의 횟수만 증가시키고 반복은 한번 더 실행
                }
            }
            
            result.append(cCount);
        }
        	
    	return result.toString();
    }
}

문제 8 - 크기가 작은 부분 문자열

🔎 접근법
1. 문자열을 숫자로 바꿔야 함
2. 슬라이딩 사용

class Solution {
    public int solution(String t, String p) {
        
        int start = 0;
        int end = p.length();
        int count = 0;
        
        while(start + p.length() <= t.length()) {
            long num = Long.parseLong(t.substring(start,end));
            if (num <= Long.parseLong(p)) count++;
            start++;
            end++;
        }
        
        return count;
    }
}

long이랑 int 땜에 런타임 에러 발생할 수도 있구나


문제 9 - 가장 가까운 같은 글자

🔎 접근법
1. map으로 인덱스 저장해서 갱신

import java.util.*;

class Solution {
    public int[] solution(String s) {
        

        int[] result = new int[s.length()];
        Map<Character, Integer> map = new HashMap<>();
        
        for(int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            
            if(map.containsKey(c)) {
                result[i] = i - map.get(c);
            } else {
                result[i] = -1;
            }
            
            map.put(c, i);
            
        }
        
        
        return result;
    }
}

문제 10 - 부족한 금액 계산
Ezzzzzzzzzzz

class Solution {
    public long solution(int price, int money, int count) {
        
        long sum = 0;
        
        for(int i = 1; i <= count; i++) {
            sum += price * i;
        }
        
        long answer = sum - money;
        return answer >= 0 ? answer : 0;
    }
}

문제 11 - 문자열 나누기

class Solution {
    public int solution(String s) {
        
        int sameCount = 0;
        int difCount = 0;
        int count = 0;
        int index = 0;
        
        for(int i = 0; i < s.length(); i++) {
            
            if(s.charAt(index) == s.charAt(i)) sameCount++;   
            else difCount++;
            
            if (sameCount == difCount) {
                count++;
                index = i + 1;
                sameCount = 0;
                difCount = 0;
            }
        }
        
        if(sameCount > 0 || difCount > 0) {
            count++;
        }
        
        return count;
    }
}

변수가 좀 많긴한데 먼가 뿌듯한 코드 ^ㅁ^


문제 12 - 명예의 전당 (1)

우선순위 큐 쓰면 될 것 같습니더

import java.util.*;

class Solution {
    public int[] solution(int k, int[] score) {
        int[] answer = new int[score.length];
        
        PriorityQueue<Integer> que = new PriorityQueue<>((o1, o2) -> {
            return o1 > o2 ? 1 : -1;
        });
        
        for(int i = 0; i < score.length; i++) {
            que.add(score[i]); 
            
            if(que.size() > k) {
                que.poll();
            }
            
            answer[i] = que.peek();
        }
        
        
        return answer;
    }
}

간단히 정리

약수를 우째 구하지 --> 제곱근 사용 !!! Math.sqrt() ==> double형 리턴

class Solution {
    public int solution (int number, int limit, int power) {
        
        // 1 -> 1* 1
        // 2 -> 1 * 2 
        // 3 -> 1 * 3
        // 4 -> 1 * 4 | 2 * 2
        
       
        int sum = 0;
        for(int i = 1; i <= number; i++) {
            
            int count = 0;
            
            for(int j = 1; j <= (int)Math.sqrt(i); j++) {
                if(i % j == 0) count += 2;
                if(j * j == i) count -= 1;
            }
            
            sum += count > limit ? power : count;
        }
        
        return sum;
    }
}

<중요>
-> 나머지가 0인 건 count + 2
-> 자기 자신 곱한 건 -1

profile
~*

0개의 댓글