프로그래머스 문제풀이/알고리즘 (JAVA)

[JAVA] 프로그래머스 알고리즘 문제풀이 - Level 0 (56~62번 문제풀이)

남건욱 2023. 9. 25. 23:47
반응형
56. 다항식 더하기

문제

class Solution {
    public String solution(String polynomial) {
        String answer = "";
        String[] result = polynomial.split(" ");    
        int x = 0;
        int n = 0;
    
        for(int i=0; i<result.length; i++){
            if(result[i].contains("x")){
                x += result[i].equals("x") ? 1 : Integer.parseInt(result[i].replace("x", ""));
            }else if(!result[i].equals("+")){
                n += Integer.parseInt(result[i]);
            }
        }
        
        if(x == 1 && n == 0){
            answer = "x";
        }else if(x == 1 && n != 0){
            answer = "x + " + n;
        }else if(x != 0 && n == 0){
            answer = x + "x";
        }else if(x != 0 && n != 0){
            answer = x + "x + " + n;
        }else if(x == 0 && n != 0){
            answer = Integer.toString(n);
        }
        
        return answer;
    }
}

<작성한 코드>

시간이 꽤 많이 걸렸던 문제다. 우선 공백을 기준으로 문자열들을 다시 정렬했다. 그 후에 반복문의 길이만큼 반복해 주고 만약 x를 포함하고 있다면 if문에 걸린다. 그냥 x만 있다면 x의 상수항을 저장해 둘 n에 1을 더해주고, x가 아니라면 x를 지우고 남은 x의 계수를 n에 더해줬다. else if에는 원소가 +와 일치하지 않을 때 상수항을 저장해 둘 n에 더해줬다. for문을 나와 if-else if가 많이 정렬되어 있다. 자꾸 특별한 케이스에서 오류가 나길래 경우의 수를 하나씩 찾아가며 수동으로 더해줬다. 이 문제 하나에만 30분을 사용했다...

 

 

 

57. 숨어있는 숫자의 덧셈(2)

문제

import java.util.*;

class Solution {
    public int solution(String my_string) {
        int answer = 0;
        int num = 0;
        
        
        for(int i=0; i<my_string.length(); i++){
            char a = my_string.charAt(i);
            
            if(Character.isDigit(a)){
                num = num * 10 + (a - '0'); 
            } else {
                answer += num;
                num = 0;
            }     
        }
        
        answer += num;
        
        return answer;
    }
}

<작성한 코드>

우선 현재 수를 저장할 num변수를 선언했다. 후에 배열의 길이만큼 반복시켜 주고 하나하나 원소를 a에 대입해 줬다. 만약 a가 숫자면 num = num * 10 + (a - '0')을 해줬다. num은 0이기 때문에 처음 들어오는 숫자는 0 + (a - '0')이 되어서 본래의 숫자만 더해질 것이다. 만약 숫자가 아니면 그동안 더했던 num을 정답(answer)에 더해주고 num을 0으로 다시 초기화해 준 뒤 끝냈다. 그리고 마지막 문자열에도 연속된 숫자가 있을 수 있기 때문에 마지막으로 한 번 더 answer += num을 해줬다.

 

 

 

58. 안전지대

문제

class Solution {
    public int solution(int[][] board) {
        int answer = 0;
        int[][] board2 = new int[board.length][board.length];
        
        for(int i=0; i<board.length; i++){
            for(int j=0; j<board.length; j++){
                if(board[i][j] == 1)  check(i,j,board2);
            }
        }
        

         for(int i=0; i<board2.length; i++){
            for(int j=0; j<board2.length; j++){
                if(board2[i][j] == 0)  answer++;
            }
        }
        
        return answer;
    }
    
    public void check(int x, int y, int[][] board2){
        int boomX;
        int boomY;
        int[] aroundX = {0, -1, -1, -1, 0, 0, 1, 1, 1};
        int[] aroundY = {0, -1, 0, 1, -1, 1, -1, 0, 1};
        
        for(int i=0; i<9; i++){
            boomX = x + aroundX[i];
            boomY = y + aroundY[i];
            if(boomX < board2.length && boomY < board2.length){
                if(boomX >= 0 && boomY >= 0) board2[boomX][boomY] = 1;
            }
                
        }
    }
}

<작성한 코드>

board2라는 배열을 생성해 줬다. 그리고 반복문으로 [i][j]를 전부 체크하도록 해줬다. check메서드에서는 aroundX는 현재 위치에서 x좌표의 변화, aroundY는 현재 위치에서 y좌표의 변화를 표시한다. 또한 9번을 반복하도록 했고 주변 좌표를 체크하도록 했다. boomX, boomY의 크기가 보드의 길이보다 크지 않고, boomX, boomY가 0 이상일 때 배열의 좌표에 1을 추가했다. 이렇게 만들어진 board2 배열을 반복문으로 실행시켜서 내부의 값이 0 일 때 answer++을 해줘서 답을 구했다.

레벨 0치고 많이 복잡한 것 같다. 이리해보고 저리 해보고 1시간을 넘게 고민했던 것 같다. 어렵다

 

 

 

59. 삼각형의 완성조건(2)

문제

import java.util.*;

class Solution {
    public int solution(int[] sides) {
        int answer = 0;
        Arrays.sort(sides);
        
        int min = sides[0];
        int max = sides[1];
    
        int low = max - min;
        int high = max + min;
        
        answer = high - low - 1;
        
        
        return answer;
    }
}

<작성한 코드>

두 길이가 담겨있는 sides를 오름차순으로 정렬시켰다. 그 후 작은 값, 큰 값으로 구분해 줬다. low는 최솟값, high는 최댓값을 저장할 변수로 생성해 주었고 answer에 high - low를 해준 뒤에 겹치는 값 1을 빼주고 반환했다.

 

 

 

60. 외계어 사전

문제

class Solution {
    public int solution(String[] spell, String[] dic) {
        int answer = 2;
        
        for(int i=0; i<dic.length; i++){
            int cnt = 0;
            for(int j=0; j<spell.length; j++){
                if(dic[i].contains(spell[j])) cnt++;
            }
            if(cnt == spell.length) answer = 1;
        }
        
        return answer;
    }
}

<작성한 코드>

answer의 기본값을 2로 설정했다.  그 후 사전의 길이만큼 반복하도록 설정해 주었고 spell안의 원소가 dic에 포함될 때마다 cnt를 1씩 증가시켜 줬다. 그 후 만약 spell안의 원소개수 전부가 더해졌다면 answer에 1을 넣어준다. 아니라면 그대로 2가 담겨있는 채로 반환될 것이다.

 

 

61. 저주의 숫자 3

문제

class Solution {
    public int solution(int n) {
        int answer = 0;
        
        for(int i=0; i<n; i++){
            answer ++;
            while(answer%3 == 0 || String.valueOf(answer).contains("3")) answer++;
        }
        
        return answer;
    }
}

<작성한 코드>

반복문으로 n번까지 반복해 줬다. for문 내부에서 answer가 3의 배수 거나 3을 포함하고 있으면 answer을 추가로 더해줬다. 처음에는 while을 안 쓰고 if로 해줬는데 정답이 아니었다. 잘 생각해 보니 두 가지 경우가 중첩돼서 생길 수도 있다는 걸 넘어갔다. 그래서 while으로 바꾸고 조건에 만족하지 않을 때까지 반복해 줬다.

 

 

 

62. 평행

문제

class Solution {
    public int solution(int[][] dots) {
        int x1 = dots[0][0];
        int y1 = dots[0][1];
        int x2 = dots[1][0];
        int y2 = dots[1][1];
        int x3 = dots[2][0];
        int y3 = dots[2][1];
        int x4 = dots[3][0];
        int y4 = dots[3][1];
        int answer = 0;
        
        double slope1 = (double) (y2 - y1) / (x2 - x1);
        double slope2 = (double) (y4 - y3) / (x4 - x3);
        if (slope1 == slope2) answer = 1;
        
        slope1 = (double) (y3 - y1) / (x3 - x1);
        slope2 = (double) (y2 - y4) / (x2 - x4);
        if (slope1 == slope2) answer = 1;
        
        slope1 = (double) (y4 - y1) / (x4 - x1);
        slope2 = (double) (y2 - y3) / (x2 - x3);
        if (slope1 == slope2) answer = 1;
        
        return answer;
    }
}

<작성한 코드>

총 4개의 좌표가 나온다. 그래서 미리 x1~x4, y1~y4에 값을 넣어줬다. 그 뒤 각각 나올 수 있는 경우의 수를 체크해 줬다. 만약 기울기가 같은 게 하나라도 있으면 answer에 1이 담겨서 반환될 거고 없으면 처음 초기화 상태 그대로 0이 들어갈 것이다.

반응형
프로필사진

남건욱's 공부기록