posted by 코딩 공부중 2022. 4. 19. 15:12
  • 단어 변환
문제 설명

두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다.

1. 한 번에 한 개의 알파벳만 바꿀 수 있습니다.
2. words에 있는 단어로만 변환할 수 있습니다.

예를 들어 begin이 "hit", target가 "cog", words가 ["hot","dot","dog","lot","log","cog"]라면 "hit" -> "hot" -> "dot" -> "dog" -> "cog"와 같이 4단계를 거쳐 변환할 수 있습니다.

두 개의 단어 begin, target과 단어의 집합 words가 매개변수로 주어질 때, 최소 몇 단계의 과정을 거쳐 begin을 target으로 변환할 수 있는지 return 하도록 solution 함수를 작성해주세요.

제한사항
  • 각 단어는 알파벳 소문자로만 이루어져 있습니다.
  • 각 단어의 길이는 3 이상 10 이하이며 모든 단어의 길이는 같습니다.
  • words에는 3개 이상 50개 이하의 단어가 있으며 중복되는 단어는 없습니다.
  • begin과 target은 같지 않습니다.
  • 변환할 수 없는 경우에는 0를 return 합니다.
입출력 예begintargetwordsreturn
"hit" "cog" ["hot", "dot", "dog", "lot", "log", "cog"] 4
"hit" "cog" ["hot", "dot", "dog", "lot", "log"] 0
입출력 예 설명

예제 #1
문제에 나온 예와 같습니다.

예제 #2
target인 "cog"는 words 안에 없기 때문에 변환할 수 없습니다.

import java.util.*;

class Solution {
   static HashMap<String,Boolean>check;
    
    private int bfs(String begin, String target, String[] words){
        Queue<String> queue = new LinkedList<>();   //큐 선언
        queue.add(begin);   //큐에 첫 문자열 담기
        check.put(begin,true); //첫 문자열 방문 처리
        int answer=0;
        while(!queue.isEmpty()){
            String s = queue.poll();
            ArrayList<String> checkStr = findStr(s,words);
            
            System.out.println("Hello Java s "+s);
            System.out.println("Hello Java checkStr "+checkStr);
            //찾을 수 있는 단어 중 타겟에서 한단어 차이나는게 존재하면 바로 해당 단어로 변환해주기
            int value = 0;
            String tagetTmp = "";
            for(int i=0; i<checkStr.size(); i++){
                if(!check.get(checkStr.get(i))){    //방문하지 않은 단어일때
                    value = findTarget(checkStr.get(i),target);
                }
                if(value==1){
                    tagetTmp = checkStr.get(i);
                }
            }
            System.out.println("Hello Java tagetTmp "+tagetTmp);
            System.out.println("Hello Java value "+value);
            for(int i=0; i<checkStr.size(); i++){
                if(!check.get(checkStr.get(i))){    //방문하지 않은 단어일 
                    check.put(checkStr.get(i),true);    //우선 방문체크
                    if(value==0){
                        queue.add(checkStr.get(i));
                    } else if(value==1) {
                        //바로 이동할 수 있는 경우
                        queue.poll();
                        queue.add(tagetTmp);
                    }
                }
            }
            System.out.println("Hello Java answer "+queue.toString());
            answer++;
            for (String q:queue) {
                if (q.equals(target)) return answer;
            }
        }
        return 0;
    }
    private int findTarget(String str, String target){
        int val = 0;
        for(int i=0; i<str.length(); i++){
            if(str.charAt(i)!=target.charAt(i)){      //같지 않을 경우
                val++;
            }
        }
        if(val==1){
            return 1;
        }
        return 0;
    }
    
    private ArrayList<String> findStr(String str, String[] words){
        ArrayList<String> list = new ArrayList<>();
        String[] tmp = str.split(""); //비교대상 문자열
          
        for(String word : words){
            String[] wordTmp = word.split("");    //비교할 문자열
            int val = 0;
            
            for(int i=0; i<wordTmp.length; i++){
                if(!wordTmp[i].equals(tmp[i])){      //같지 않을 경우
                    val++;
                }
            }
            if(val==1){
                if(!check.get(word)){    //방문하지 않은 단어일 경우
                    list.add(word); //하나만 같을 경우 변경 가능
                }
            }
        }
        return list;
    }
    
    public int solution(String begin, String target, String[] words) {
        int answer = 0;
        check=new HashMap<String,Boolean>();
        for(String tmp : words){
            //System.out.println("Hello Java answer "+tmp);
            check.put(tmp,false);
        }
        answer = bfs(begin,target,words);
        
        return answer;
    }
}

bfs/dfs를 활용해서 푸는 문제

테스트케이스 1번이 통과가 안되는데 문제는 정답으로 처리되는 문제가 발생해서

여기저기 뜯어고쳐봄 테스트케이스는 전부 통과하고 정답처리까지 받았으나

다른 케이스를 추가했더니 또 안되는 상황이 발생함

문제가 이상한건지 확인 필요..

 

 

posted by 코딩 공부중 2022. 3. 30. 17:33

문제 설명

명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다.

아래 표는 4가지 명함의 가로 길이와 세로 길이를 나타냅니다.

명함 번호가로 길이세로 길이
1 60 50
2 30 70
3 60 30
4 80 40

가장 긴 가로 길이와 세로 길이가 각각 80, 70이기 때문에 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다. 하지만 2번 명함을 가로로 눕혀 수납한다면 80(가로) x 50(세로) 크기의 지갑으로 모든 명함들을 수납할 수 있습니다. 이때의 지갑 크기는 4000(=80 x 50)입니다.

모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열 sizes가 매개변수로 주어집니다. 모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 지갑의 크기를 return 하도록 solution 함수를 완성해주세요.


제한사항
  • sizes의 길이는 1 이상 10,000 이하입니다.
    • sizes의 원소는 [w, h] 형식입니다.
    • w는 명함의 가로 길이를 나타냅니다.
    • h는 명함의 세로 길이를 나타냅니다.
    • w와 h는 1 이상 1,000 이하인 자연수입니다.

입출력 예sizesresult
[[60, 50], [30, 70], [60, 30], [80, 40]] 4000
[[10, 7], [12, 3], [8, 15], [14, 7], [5, 15]] 120
[[14, 4], [19, 6], [6, 16], [18, 7], [7, 11]] 133

입출력 예 설명

입출력 예 #1
문제 예시와 같습니다.

입출력 예 #2
명함들을 적절히 회전시켜 겹쳤을 때, 3번째 명함(가로: 8, 세로: 15)이 다른 모든 명함보다 크기가 큽니다. 따라서 지갑의 크기는 3번째 명함의 크기와 같으며, 120(=8 x 15)을 return 합니다.

입출력 예 #3
명함들을 적절히 회전시켜 겹쳤을 때, 모든 명함을 포함하는 가장 작은 지갑의 크기는 133(=19 x 7)입니다.

 

import java.util.*;

class Solution {
    public int solution(int[][] sizes) {
        int answer = 0;
        //1.가로에 제일 큰값
        //2.세로에 제일 작은 값 모아두기
        ArrayList<Integer> left = new ArrayList<>();
        ArrayList<Integer> right = new ArrayList<>();
        
        for(int i=0; i<sizes.length; i++){
            if(sizes[i][0]>=sizes[i][1]){
                left.add(sizes[i][0]);
                right.add(sizes[i][1]);
            } else{
                left.add(sizes[i][1]);
                right.add(sizes[i][0]);
            }
        }
        System.out.println("Hello Java "+left);
        System.out.println("Hello right "+right);
        //각 리스트 최대값 곱하기
        int max1 = Collections.max(left);
        int max2 = Collections.max(right);
        
        
        return max1*max2;
    }
}

핵심은 최대값 최소값을 이용하는 것

math를 쓴 경우가 많은데 나는 collections을 사용함

posted by 코딩 공부중 2022. 3. 30. 17:31

문제 설명

가로 길이가 Wcm, 세로 길이가 Hcm인 직사각형 종이가 있습니다. 종이에는 가로, 세로 방향과 평행하게 격자 형태로 선이 그어져 있으며, 모든 격자칸은 1cm x 1cm 크기입니다. 이 종이를 격자 선을 따라 1cm × 1cm의 정사각형으로 잘라 사용할 예정이었는데, 누군가가 이 종이를 대각선 꼭지점 2개를 잇는 방향으로 잘라 놓았습니다. 그러므로 현재 직사각형 종이는 크기가 같은 직각삼각형 2개로 나누어진 상태입니다. 새로운 종이를 구할 수 없는 상태이기 때문에, 이 종이에서 원래 종이의 가로, 세로 방향과 평행하게 1cm × 1cm로 잘라 사용할 수 있는 만큼만 사용하기로 하였습니다.
가로의 길이 W와 세로의 길이 H가 주어질 때, 사용할 수 있는 정사각형의 개수를 구하는 solution 함수를 완성해 주세요.

제한사항
  • W, H : 1억 이하의 자연수

입출력 예

WHresult
8 12 80
입출력 예 설명

입출력 예 #1
가로가 8, 세로가 12인 직사각형을 대각선 방향으로 자르면 총 16개 정사각형을 사용할 수 없게 됩니다. 원래 직사각형에서는 96개의 정사각형을 만들 수 있었으므로, 96 - 16 = 80 을 반환합니다.

class Solution {
    int gcd(int num1, int num2){
        if(num2 == 0) return num1;
        else return gcd(num2, num1 % num2);
    }
    
    
    public long solution(int w, int h) {
        long answer = 1;
        int gcd = gcd(w,h);
        answer = (long)((long)w*(long)h) - ((((long)w/gcd + (long)h/gcd) -1) * gcd);
        return answer;
    }
}

공식 찾는게 정말 힘들었다

그리고 정답 보낼 때 자료형 long으로 맞춰줘야만 케이스 통과 가능

posted by 코딩 공부중 2022. 3. 30. 17:30

문제 설명

 

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.

다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

  • 1478 → "one4seveneight"
  • 234567 → "23four5six7"
  • 10203 → "1zerotwozero3"

이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.

숫자영단어
0 zero
1 one
2 two
3 three
4 four
5 five
6 six
7 seven
8 eight
9 nine

제한사항
  • 1 ≤ s의 길이 ≤ 50
  • s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

입출력 예sresult
"one4seveneight" 1478
"23four5six7" 234567
"2three45sixseven" 234567
"123" 123

입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • 문제 예시와 같습니다.

입출력 예 #3

  • "three"는 3, "six"는 6, "seven"은 7에 대응되기 때문에 정답은 입출력 예 #2와 같은 234567이 됩니다.
  • 입출력 예 #2와 #3과 같이 같은 정답을 가리키는 문자열이 여러 가지가 나올 수 있습니다.

입출력 예 #4

  • s에는 영단어로 바뀐 부분이 없습니다.

제한시간 안내
  • 정확성 테스트 : 10초
import java.util.*;
import java.util.regex.Pattern;

class Solution {
    int checkString(String data){
        int result = 10;
        if(data.matches(".*zero.*")){
            result = 0;
            return result;
        } else if(data.matches(".*one.*")){
            result= 1;
            return result;
        } else if(data.matches(".*two.*")){
            result =2;
            return result;
        } else if(data.matches(".*three.*")){
            result =3;
            return result;
        } else if(data.matches(".*four.*")){
            result =4;
            return result;
        } else if(data.matches(".*five.*")){
            result =5;
            return result;
        } else if(data.matches(".*six.*")){
            result =6;
            return result;
        } else if(data.matches(".*seven.*")){
            result =7;
            return result;
        } else if(data.matches(".*eight.*")){
            result =8;
            return result;
        } else if(data.matches(".*nine.*")){
            result =9;
            return result;
        } else {
            return result;
        }
    }
    
    public int solution(String s) {
        String answer = "";
        // String[] result = s.split("[0-9]");
        Queue<String> queue = new LinkedList<>();
        
        for(int i=0; i<s.length(); i++){
            
            queue.add(s.substring(i,i+1));
        }
        String patternNum = "^[0-9]*$"; //숫자만
        String pattern = "^[a-zA-Z]*$";
        String tmp = "";
        while(!queue.isEmpty()){
            boolean regex = Pattern.matches(patternNum, queue.peek()); //숫자인지 비교
            if(regex){
                answer += Integer.parseInt(queue.poll());
            } else {
                boolean regex2 = Pattern.matches(pattern, queue.peek()); //숫자인지 비교
                if(regex2){
                    tmp +=queue.poll();
                }
                System.out.println("Hello tmp "+tmp);
                int data = checkString(tmp);
                if(data != 10){
                   answer += Integer.toString(data);
                    tmp = "";
                }
            }

        }
        
        return Integer.parseInt(answer);
    }
}

패턴 체크만 하면 되는 간단한 문제

posted by 코딩 공부중 2022. 3. 29. 17:49
문제 설명

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로 가입하는 유저들이 카카오 아이디 규칙에 맞지 않는 아이디를 입력했을 때, 입력된 아이디와 유사하면서 규칙에 맞는 아이디를 추천해주는 프로그램을 개발하는 것입니다.
다음은 카카오 아이디의 규칙입니다.

  • 아이디의 길이는 3자 이상 15자 이하여야 합니다.
  • 아이디는 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 문자만 사용할 수 있습니다.
  • 단, 마침표(.)는 처음과 끝에 사용할 수 없으며 또한 연속으로 사용할 수 없습니다.

"네오"는 다음과 같이 7단계의 순차적인 처리 과정을 통해 신규 유저가 입력한 아이디가 카카오 아이디 규칙에 맞는 지 검사하고 규칙에 맞지 않은 경우 규칙에 맞는 새로운 아이디를 추천해 주려고 합니다.
신규 유저가 입력한 아이디가 new_id 라고 한다면,

1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
     만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.

예를 들어, new_id 값이 "...!@BaT#*..y.abcdefghijklm" 라면, 위 7단계를 거치고 나면 new_id는 아래와 같이 변경됩니다.

1단계 대문자 'B'와 'T'가 소문자 'b'와 't'로 바뀌었습니다.
"...!@BaT#*..y.abcdefghijklm"  "...!@bat#*..y.abcdefghijklm"

2단계 '!', '@', '#', '*' 문자가 제거되었습니다.
"...!@bat#*..y.abcdefghijklm"  "...bat..y.abcdefghijklm"

3단계 '...'와 '..' 가 '.'로 바뀌었습니다.
"...bat..y.abcdefghijklm"  ".bat.y.abcdefghijklm"

4단계 아이디의 처음에 위치한 '.'가 제거되었습니다.
".bat.y.abcdefghijklm"  "bat.y.abcdefghijklm"

5단계 아이디가 빈 문자열이 아니므로 변화가 없습니다.
"bat.y.abcdefghijklm"  "bat.y.abcdefghijklm"

6단계 아이디의 길이가 16자 이상이므로, 처음 15자를 제외한 나머지 문자들이 제거되었습니다.
"bat.y.abcdefghijklm"  "bat.y.abcdefghi"

7단계 아이디의 길이가 2자 이하가 아니므로 변화가 없습니다.
"bat.y.abcdefghi"  "bat.y.abcdefghi"

따라서 신규 유저가 입력한 new_id가 "...!@BaT#*..y.abcdefghijklm"일 때, 네오의 프로그램이 추천하는 새로운 아이디는 "bat.y.abcdefghi" 입니다.


[문제]

신규 유저가 입력한 아이디를 나타내는 new_id가 매개변수로 주어질 때, "네오"가 설계한 7단계의 처리 과정을 거친 후의 추천 아이디를 return 하도록 solution 함수를 완성해 주세요.

[제한사항]

new_id는 길이 1 이상 1,000 이하인 문자열입니다.
new_id는 알파벳 대문자, 알파벳 소문자, 숫자, 특수문자로 구성되어 있습니다.
new_id에 나타날 수 있는 특수문자는 -_.~!@#$%^&*()=+[{]}:?,<>/ 로 한정됩니다.


[입출력 예]nonew_idresult
예1 "...!@BaT#*..y.abcdefghijklm" "bat.y.abcdefghi"
예2 "z-+.^." "z--"
예3 "=.=" "aaa"
예4 "123_.def" "123_.def"
예5 "abcdefghijklmn.p" "abcdefghijklmn"
입출력 예에 대한 설명

입출력 예 #1
문제의 예시와 같습니다.

입출력 예 #2
7단계를 거치는 동안 new_id가 변화하는 과정은 아래와 같습니다.

1단계 변화 없습니다.
2단계 "z-+.^."  "z-.."
3단계 "z-.."  "z-."
4단계 "z-."  "z-"
5단계 변화 없습니다.
6단계 변화 없습니다.
7단계 "z-"  "z--"

입출력 예 #3
7단계를 거치는 동안 new_id가 변화하는 과정은 아래와 같습니다.

1단계 변화 없습니다.
2단계 "=.="  "."
3단계 변화 없습니다.
4단계 "."  "" (new_id가 빈 문자열이 되었습니다.)
5단계 ""  "a"
6단계 변화 없습니다.
7단계 "a"  "aaa"

입출력 예 #4
1단계에서 7단계까지 거치는 동안 new_id("123_.def")는 변하지 않습니다. 즉, new_id가 처음부터 카카오의 아이디 규칙에 맞습니다.

입출력 예 #5
1단계 변화 없습니다.
2단계 변화 없습니다.
3단계 변화 없습니다.
4단계 변화 없습니다.
5단계 변화 없습니다.
6단계 "abcdefghijklmn.p"  "abcdefghijklmn."  "abcdefghijklmn"
7단계 변화 없습니다.

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.*;
 
class Solution {
    public String solution(String new_id) {
        String answer = "";
        new_id = new_id.toLowerCase();   //1단계
        new_id = new_id.replaceAll("[^a-z\\d\\-_.]*""");  //2단계
        new_id = new_id.replaceAll("\\.{2,}"".");//3단계
        new_id = new_id.replaceAll("^[.]|[.]$""");    //4단계
        if(new_id.length() ==0){
            new_id = "a";   //5단계
        } 
        if(new_id.length()>=16){
            new_id= new_id.substring(0,15); //6단계
            if(new_id.charAt(14)=='.'){
                new_id = new_id.replaceAll("^|[.]$""");    //끝에 마침표 제거
            }
        }else if(new_id.length()<=2){
            while(new_id.length()<3){
                String lastString = new_id.substring(new_id.length()-1,new_id.length());
                new_id +=lastString;
            }
        }
        answer = new_id;
        return answer;
    }
}
cs

정규표현식만 알면 간단하게 해결할 수 있음

posted by 코딩 공부중 2022. 3. 29. 09:18

문제 설명

양의 정수 n이 주어집니다. 이 숫자를 k진수로 바꿨을 때, 변환된 수 안에 아래 조건에 맞는 소수(Prime number)가 몇 개인지 알아보려 합니다.

  • 0P0처럼 소수 양쪽에 0이 있는 경우
  • P0처럼 소수 오른쪽에만 0이 있고 왼쪽에는 아무것도 없는 경우
  • 0P처럼 소수 왼쪽에만 0이 있고 오른쪽에는 아무것도 없는 경우
  • P처럼 소수 양쪽에 아무것도 없는 경우
  • 단, P는 각 자릿수에 0을 포함하지 않는 소수입니다.
    • 예를 들어, 101은 P가 될 수 없습니다.

예를 들어, 437674을 3진수로 바꾸면 211020101011입니다. 여기서 찾을 수 있는 조건에 맞는 소수는 왼쪽부터 순서대로 211, 2, 11이 있으며, 총 3개입니다. (211, 2, 11을 k진법으로 보았을 때가 아닌, 10진법으로 보았을 때 소수여야 한다는 점에 주의합니다.) 211은 P0 형태에서 찾을 수 있으며, 2는 0P0에서, 11은 0P에서 찾을 수 있습니다.

정수 n과 k가 매개변수로 주어집니다. n을 k진수로 바꿨을 때, 변환된 수 안에서 찾을 수 있는 위 조건에 맞는 소수의 개수를 return 하도록 solution 함수를 완성해 주세요.


제한사항

  • 1 ≤ n ≤ 1,000,000
  • 3 ≤ k ≤ 10

입출력 예

nkresult

437674 3 3
110011 10 2

입출력 예 설명

입출력 예 #1

문제 예시와 같습니다.

입출력 예 #2

110011을 10진수로 바꾸면 110011입니다. 여기서 찾을 수 있는 조건에 맞는 소수는 11, 11 2개입니다. 이와 같이, 중복되는 소수를 발견하더라도 모두 따로 세어야 합니다.


제한시간 안내

  • 정확성 테스트 : 10초
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.util.*;
 
class Solution {
    static int result = 0;
    boolean find(long n) {   //소수 찾기
        for (int i = 2; i<=(int)Math.sqrt(n); i++) {
            if(n % i == 0){
                return false;
            }
        }
        return true;
    }
    void check(String tmp){
        
        if(!tmp.contains("0"&& !tmp.equals("1")){
            //0이 없는 경우 소수인지 확인
           if(find(Long.parseLong(tmp))){
                result++;
                return;
           }
        }
        String[] strArr = tmp.split("0");
        if(strArr.length<=0){
            return;
        }
        for(int i=0; i<strArr.length; i++){
            if(!strArr[i].equals("")){
                if(!strArr[i].equals("1")){
                    if(find(Long.parseLong(strArr[i]))){
                        result++;
                    }
                }
            }
        }
        
    }
    public int solution(int n, int k) {
        int answer = -1;
        String tmp = Integer.toString(n,k); //k진법으로 변환
        check(tmp);
        answer = result;
        return answer;
    }
}
cs

테스트에서 자꾸 런타임에러가 나 확인해보니 소수를 판별할 때 int 대신 long을 사용해야 한다고 한다.

https://www.delftstack.com/ko/howto/java/long-vs-int-java/

posted by 코딩 공부중 2022. 3. 28. 16:17

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.제한 조건

  • s는 길이 1 이상 200 이하인 문자열입니다.
  • s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
    • 숫자는 단어의 첫 문자로만 나옵니다.
    • 숫자로만 이루어진 단어는 없습니다.
    • 공백문자가 연속해서 나올 수 있습니다.

입출력 예

sreturn

"3people unFollowed me" "3people Unfollowed Me"
"for the last week" "For The Last Week"

※ 공지 - 2022년 1월 14일 제한 조건과 테스트 케이스가 추가되었습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.util.*;
 
class Solution {
    
    
    public String solution(String s) {
        String answer = "";
        Queue<String> queue = new LinkedList<>();
        for(int i=0; i<s.length(); i++){
            queue.add(s.substring(i,i+1));
        }
       // answer += queue.poll();
        
       // System.out.println("Hello queue "+queue);
        
        while(!queue.isEmpty()){
            if(queue.peek().equals(" ")){  //공백일 경우
                answer += queue.poll(); //우선 넣어주고
                if(!queue.isEmpty()){
                    if(!queue.peek().equals(" ")){  //다음이 공백이 아니면
                        answer +=queue.poll().toUpperCase();
                    } else {    //또 공백이면
                        continue;
                    }
                } else {
                    break;
                }
                
            }else {
               if(answer.length() <1){
                   answer+= queue.poll().toUpperCase();      //대문자로
               } else {
                   answer+= queue.poll().toLowerCase();      //소문자로
               }
               
            }
        }
        
        return answer;
    }
}
cs

공백체크가 중요, 그중에서도 문장의 맨 끝에 공백이 오는 경우를 체크해야 함

이 부분 때문에 계속 런타임에러가 발생해서 해결하는데 시간이 걸림

posted by 코딩 공부중 2022. 3. 28. 15:05

문제 설명

0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.

  1. x의 모든 0을 제거합니다.
  2. x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.

예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.

0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.


제한사항
  • s의 길이는 1 이상 150,000 이하입니다.
  • s에는 '1'이 최소 하나 이상 포함되어 있습니다.

입출력 예sresult
"110010101001" [3,8]
"01110" [3,3]
"1111111" [4,1]

입출력 예 설명

입출력 예 #1

  • "110010101001"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차이진 변환 이전제거할 0의 개수0 제거 후 길이이진 변환 결과
1 "110010101001" 6 6 "110"
2 "110" 1 2 "10"
3 "10" 1 1 "1"
  • 3번의 이진 변환을 하는 동안 8개의 0을 제거했으므로, [3,8]을 return 해야 합니다.

입출력 예 #2

  • "01110"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차이진 변환 이전제거할 0의 개수0 제거 후 길이이진 변환 결과
1 "01110" 2 3 "11"
2 "11" 0 2 "10"
3 "10" 1 1 "1"
  • 3번의 이진 변환을 하는 동안 3개의 0을 제거했으므로, [3,3]을 return 해야 합니다.

입출력 예 #3

  • "1111111"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차이진 변환 이전제거할 0의 개수0 제거 후 길이이진 변환 결과
1 "1111111" 0 7 "111"
2 "111" 0 3 "11"
3 "11" 0 2 "10"
4 "10" 1 1 "1"
  • 4번의 이진 변환을 하는 동안 1개의 0을 제거했으므로, [4,1]을 return 해야 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.util.*;
 
class Solution {
    static int count = 0;
    static int remove = 0;
    String makeBinary(int num) {
        String binaryString = Integer.toBinaryString(num);
        return binaryString;
    }
    
    void makeResult(String s){
        if(s.equals("1")){
            //1이 되면 종료
            return;
        }
        count++;
        for(int i=0; i<s.length(); i++){
            if(s.charAt(i)=='0'){
                //0이면
                remove++;
            }
        }
        s = s.replaceAll("0","");
        int num = s.length();
        
        makeResult(makeBinary(num));
    }
    
    public int[] solution(String s) {
        int[] answer = new int[2];
        makeResult(s);
        
        answer[0= count;
        answer[1= remove;
        
        return answer;
    }
}
cs

십진수를 이진수로 변환하는 법만 알면 간단하게 해결

posted by 코딩 공부중 2022. 3. 28. 09:21

로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1

순위당첨 내용

1 6개 번호가 모두 일치
2 5개 번호가 일치
3 4개 번호가 일치
4 3개 번호가 일치
5 2개 번호가 일치
6(낙첨) 그 외

로또를 구매한 민우는 당첨 번호 발표일을 학수고대하고 있었습니다. 하지만, 민우의 동생이 로또에 낙서를 하여, 일부 번호를 알아볼 수 없게 되었습니다. 당첨 번호 발표 후, 민우는 자신이 구매했던 로또로 당첨이 가능했던 최고 순위와 최저 순위를 알아보고 싶어 졌습니다.
알아볼 수 없는 번호를 0으로 표기하기로 하고, 민우가 구매한 로또 번호 6개가 44, 1, 0, 0, 31 25라고 가정해보겠습니다. 당첨 번호 6개가 31, 10, 45, 1, 6, 19라면, 당첨 가능한 최고 순위와 최저 순위의 한 예는 아래와 같습니다.

당첨 번호3110451619결과

최고 순위 번호 31 0→10 44 1 0→6 25 4개 번호 일치, 3등
최저 순위 번호 31 0→11 44 1 0→7 25 2개 번호 일치, 5등
  • 순서와 상관없이, 구매한 로또에 당첨 번호와 일치하는 번호가 있으면 맞힌 걸로 인정됩니다.
  • 알아볼 수 없는 두 개의 번호를 각각 10, 6이라고 가정하면 3등에 당첨될 수 있습니다.
    • 3등을 만드는 다른 방법들도 존재합니다. 하지만, 2등 이상으로 만드는 것은 불가능합니다.
  • 알아볼 수 없는 두 개의 번호를 각각 11, 7이라고 가정하면 5등에 당첨될 수 있습니다.
    • 5등을 만드는 다른 방법들도 존재합니다. 하지만, 6등(낙첨)으로 만드는 것은 불가능합니다.

민우가 구매한 로또 번호를 담은 배열 lottos, 당첨 번호를 담은 배열 win_nums가 매개변수로 주어집니다. 이때, 당첨 가능한 최고 순위와 최저 순위를 차례대로 배열에 담아서 return 하도록 solution 함수를 완성해주세요.

제한사항

  • lottos는 길이 6인 정수 배열입니다.
  • lottos의 모든 원소는 0 이상 45 이하인 정수입니다.
    • 0은 알아볼 수 없는 숫자를 의미합니다.
    • 0을 제외한 다른 숫자들은 lottos에 2개 이상 담겨있지 않습니다.
    • lottos의 원소들은 정렬되어 있지 않을 수도 있습니다.
  • win_nums은 길이 6인 정수 배열입니다.
  • win_nums의 모든 원소는 1 이상 45 이하인 정수입니다.
    • win_nums에는 같은 숫자가 2개 이상 담겨있지 않습니다.
    • win_nums의 원소들은 정렬되어 있지 않을 수도 있습니다.

입출력 예

lottoswin_numsresult

[44, 1, 0, 0, 31, 25] [31, 10, 45, 1, 6, 19] [3, 5]
[0, 0, 0, 0, 0, 0] [38, 19, 20, 40, 15, 25] [1, 6]
[45, 4, 35, 20, 3, 9] [20, 9, 3, 45, 4, 35] [1, 1]

입출력 예 설명

입출력 예 #1
문제 예시와 같습니다.

입출력 예 #2
알아볼 수 없는 번호들이 아래와 같았다면, 1등과 6등에 당첨될 수 있습니다.

당첨 번호381920401525결과

최고 순위 번호 0→38 0→19 0→20 0→40 0→15 0→25 6개 번호 일치, 1등
최저 순위 번호 0→21 0→22 0→23 0→24 0→26 0→27 0개 번호 일치, 6등

입출력 예 #3
민우가 구매한 로또의 번호와 당첨 번호가 모두 일치하므로, 최고 순위와 최저 순위는 모두 1등입니다.


  1. 실제로 사용되는 로또 순위의 결정 방식과는 약간 다르지만, 이 문제에서는 지문에 명시된 대로 로또 순위를 결정하도록 합니다.  

 

import java.util.*;

class Solution {
    int makeAnswer(int num){
        if(num==6){
            return 1;
        }else if(num==5){
            return 2;
        }else if(num==4){
            return 3;
        }else if(num==3){
            return 4;
        }else if(num==2){
            return 5;
        }
        
        return 6;
    }
 
    public int[] solution(int[] lottos, int[] win_nums) {
        int[] answer = new int[2]; style="padding:0 6px; white-space:pre; line-height:130%">        int max = 0;
        int min = 0;
        
        List<Integer> list = new ArrayList<>();
        
        for(int i=0; i<lottos.length; i++){
            list.add(lottos[i]);
        }
        
        for(int i=0; i<win_nums.length; i++){
            if(list.contains(win_nums[i])){    //로또번호에 당첨번호가 존재하는 경우
                max++;
                min++;
            } 
        }
        for(int i=0; i<list.size(); i++){
            if(list.get(i) == 0){
                max++;
            }
        }
        
        
        answer[0= makeAnswer(max);
        answer[1= makeAnswer(min);
        
        
        return answer;
    }

 

}

 

 

 

효율성체크가 없는 간단한 문제

posted by 코딩 공부중 2022. 3. 18. 16:46
  • 피보나치 수
문제 설명

피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다.

예를들어

  • F(2) = F(0) + F(1) = 0 + 1 = 1
  • F(3) = F(1) + F(2) = 1 + 1 = 2
  • F(4) = F(2) + F(3) = 1 + 2 = 3
  • F(5) = F(3) + F(4) = 2 + 3 = 5

와 같이 이어집니다.

2 이상의 n이 입력되었을 때, n번째 피보나치 수를 1234567으로 나눈 나머지를 리턴하는 함수, solution을 완성해 주세요.

제한 사항
  • n은 2 이상 100,000 이하인 자연수입니다.
입출력 예nreturn
3 2
5 5
입출력 예 설명

피보나치수는 0번째부터 0, 1, 1, 2, 3, 5, ... 와 같이 이어집니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
   
    int fibo(int n,int[] memo){
        memo[0= 0
        memo[1= 1;
        
         for(int i=2; i<=n; i++){
            memo[i] = (memo[i-1+ memo[i-2]) % 1234567;
        }
        
        return memo[n];
        
    }
    
    public int solution(int n) {
        int[] memo = new int[n+1];
        int answer = 0;
        answer = fibo(n,memo);
        return answer;
    }
}
cs

재귀가 아닌 dp로 해결함