티스토리 뷰

1️⃣ 숨어있는 숫자의 덧셈 (2)

 

문제 설명

문자열 my_string이 매개변수로 주어집니다. my_string은 소문자, 대문자, 자연수로만 구성되어있습니다. my_string안의 자연수들의 합을 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ my_string의 길이 ≤ 1,000
  • 1 ≤ my_string 안의 자연수 ≤ 1000
  • 연속된 수는 하나의 숫자로 간주합니다.
  • 000123과 같이 0이 선행하는 경우는 없습니다.
  • 문자열에 자연수가 없는 경우 0을 return 해주세요.

입출력 예

my_string result
"aAb1B2cC34oOp" 37
"1a2b3c4d123Z" 133

 

입출력 예 #1

  • "aAb1B2cC34oOp"안의 자연수는 1, 2, 34 입니다. 따라서 1 + 2 + 34 = 37 을 return합니다.

입출력 예 #2

  • "1a2b3c4d123Z"안의 자연수는 1, 2, 3, 4, 123 입니다. 따라서 1 + 2 + 3 + 4 + 123 = 133 을 return합니다.

 

💻 나의 풀이

class Solution {
    public int solution(String my_string) {
        int answer = 0;
        String[] s = my_string.split("[^0-9]+");
        
        for(int i=0; i<s.length; i++) {
            if(!s[i].isEmpty()) {
                answer += Integer.parseInt(s[i]);
            }
        }
        return answer;
    }
}

 

숫자만 골라내어 더해야하니까 일단 split() 메소드를 사용하여 분리했습니다.

이제 어떤 기준으로 분리할 것이냐?

[^0-9] 을 사용하여 숫자가 아닌 문자로 분리합니다.

[^0-9] 은 0에서 9사이의 숫자가 아닌 모든 문자를 나타내는 정규 표현식 입니다.

그리고나서 분리된 문자열 배열 s를 순회하면서 빈 문자열이 아닌 경우 즉, 숫자일 때만 정수로 변환하여 더해줍니다.

 


 

2️⃣ 안전지대

 

문제 설명

  • 다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.

    지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
    지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • board는 n * n 배열입니다.
  • 1 ≤ n ≤ 100
  • 지뢰는 1로 표시되어 있습니다.
  • board에는 지뢰가 있는 지역 1과 지뢰가 없는 지역 0만 존재합니다.

입출력 예

keyinput board result
["left", "right", "up", "right", "right"] [11, 11] [2, 1]
["down", "down", "down", "down", "down"] [7, 9] [0, -4]

 

입출력 예 설명 #1

  • [0, 0]에서 왼쪽으로 한 칸 오른쪽으로 한 칸 위로 한 칸 오른쪽으로 두 칸 이동한 좌표는 [2, 1]입니다.

입출력 예 설명 #2

  • [0, 0]에서 아래로 다섯 칸 이동한 좌표는 [0, -5]이지만 맵의 세로 크기가 9이므로 아래로는 네 칸을 넘어서 이동할 수 없습니다. 따라서 [0, -4]를 return합니다.

 

 

 

🔎 다른 사람의 풀이

class Solution {
    public int[] solution(String[] keyinput, int[] board) {
        int x = 0;
        int y = 0;
        int boardX = board[0] / 2;
        int boardY = board[1] / 2;
        
        for (int i = 0; i < keyinput.length; i++) {
            if (keyinput[i].equals("up")) {
                if (y < boardY) {
                    y += 1;
                }
            } else if (keyinput[i].equals("down")) {
                if (y > -boardY) {
                    y -= 1;
                }
            } else if (keyinput[i].equals("left")) {
                if (x > -boardX) {
                    x -= 1;
                }
            } else if (keyinput[i].equals("right")) {
                if (x < boardX) {
                    x += 1;
                }
            }
        }
        int[] answer = {x, y};
        return answer;
    }
}

 

  1. 초기에 현재 위치인 x와 y는 각각 0으로 초기화됩니다.
  2. 보드의 중앙 위치(boardX, boardY)를 계산합니다.
  3. 주어진 키 입력(keyinput) 배열을 반복하면서 각 키에 따라 x와 y를 이동시킵니다.
  4. "up" 입력일 때는 y가 boardY보다 작을 때까지 y를 1 증가시킵니다.
  5. "down" 입력일 때는 y가 -boardY보다 클 때까지 y를 1 감소시킵니다.
  6. "left" 입력일 때는 x가 -boardX보다 클 때까지 x를 1 감소시킵니다.
  7. "right" 입력일 때는 x가 boardX보다 작을 때까지 x를 1 증가시킵니다.
  8. 최종적으로 이동한 위치의 x와 y를 배열로 만들어 반환합니다.

 


 

3️⃣ 삼각형의 완성조건 (2)

 

문제 설명

선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.

  • 가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.

삼각형의 두 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 나머지 한 변이 될 수 있는 정수의 개수를 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • sides의 원소는 자연수입니다.
  • sides의 길이는 2입니다.
  • 1 ≤ sides의 원소 ≤ 1,000

입출력 예

sides result
[1, 2] 1
[3, 6] 5
[11, 7]
13

 

입출력 예 #1

  • 두 변이 1, 2 인 경우 삼각형을 완성시키려면 나머지 한 변이 2여야 합니다. 따라서 1을 return합니다.

입출력 예 #2

  • 가장 긴 변이 6인 경우
    • 될 수 있는 나머지 한 변은 4, 5, 6 로 3개입니다.
  • 나머지 한 변이 가장 긴 변인 경우
    • 될 수 있는 한 변은 7, 8 로 2개입니다.
  • 따라서 3 + 2 = 5를 return합니다.

입출력 예 #3

  • 가장 긴 변이 11인 경우
    • 될 수 있는 나머지 한 변은 5, 6, 7, 8, 9, 10, 11 로 7개입니다.
  • 나머지 한 변이 가장 긴 변인 경우
    • 될 수 있는 한 변은 12, 13, 14, 15, 16, 17 로 6개입니다.
  • 따라서 7 + 6 = 13을 return합니다.

 

💻 나의 풀이

class Solution {
    public int solution(int[] sides) {
        int answer = 0;
        int max = Math.max(sides[0], sides[1]);
        int min = Math.min(sides[0], sides[1]);
        
        // 가장 긴 변이 배열의 원소인 경우
        for(int i=max-min; i<max; i++) {
            answer++;
        }
        
        // 나머지 한 변이 가장 긴 변인 경우
        for(int i=max+min-1; i>max; i--) {
            answer++;
        }
        return answer;
    }
}

 

주의깊게 생각했던 조건 두 가지 입니다

1. 가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.

2. 가장 짧은 변의 길이보다 커야합니다.

 

그리고 두 가지 경우를 나눠서 생각했습니다.

1. 가장 긴 변이 배열의 원소인 경우 : 가장 긴 변 - 주어진 다른 한 변

2. 나머지 한 변이 가장 긴 변인 경우 : 배열의 두 개의 원소 중에 가장 큰 값보다 크면서 && 동시에 두 개의 원소의 합보다 작아야합니다.

 

math 클래스의 max와 min메소드를 이용하여 주어진 두 변의 길이 중에서 긴 쪽과 짧은 쪽을 구분해 max 변수, min 변수에 넣어줍니다.

그 다음 for문을 이용해 가장 긴 변이 배열의 원소인 경우 ( max가 가장 긴 변일 때 ) : max에서 min을 뺀 값부터 max값까지 순회하여 answer를 1씩 증가시켜 줍니다.

또 다른 for문을 이용해 나머지 한 변이 가장 긴 변일 때 : max와 min을 더하고 1을 뺀 값에서부터 max보다 큰 동안 i가 1씩 감소합니다. 마찬가지로 조건에 해당할 때 answer가 1씩 증가됩니다.

 

 


 

4️⃣ 외계어 사전

 

문제 설명

PROGRAMMERS-962 행성에 불시착한 우주비행사 머쓱이는 외계행성의 언어를 공부하려고 합니다. 알파벳이 담긴 배열 spell과 외계어 사전 dic이 매개변수로 주어집니다. spell에 담긴 알파벳을 한번씩만 모두 사용한 단어가 dic에 존재한다면 1, 존재하지 않는다면 2를 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • spell과 dic의 원소는 알파벳 소문자로만 이루어져있습니다.
  • 2 ≤ spell의 크기 ≤ 10
  • spell의 원소의 길이는 1입니다.
  • 1 ≤ dic의 크기 ≤ 10
  • 1 ≤ dic의 원소의 길이 ≤ 10
  • spell의 원소를 모두 사용해 단어를 만들어야 합니다.
  • spell의 원소를 모두 사용해 만들 수 있는 단어는 dic에 두 개 이상 존재하지 않습니다.
  • dic과 spell 모두 중복된 원소를 갖지 않습니다.

입출력 예

spell dic result
["p", "o", "s"] ["sod", "eocd", "qixm", "adio", "soo"] 2
["z", "d", "x"] ["def", "dww", "dzx", "loveaw"] 1
["s", "o", "m", "d"] ["moos", "dzx", "smm", "sunmmo", "som"] 2

 

입출력 예 #1

  • "p", "o", "s" 를 조합해 만들 수 있는 단어가 dic에 존재하지 않습니다. 따라서 2를 return합니다.

입출력 예 #2

  • "z", "d", "x" 를 조합해 만들 수 있는 단어 "dzx"가 dic에 존재합니다. 따라서 1을 return합니다.

입출력 예 #3

  • "s", "o", "m", "d" 를 조합해 만들 수 있는 단어가 dic에 존재하지 않습니다. 따라서 2을 return합니다.

유의사항

  • 입출력 예 #3 에서 "moos", "smm", "som"도 "s", "o", "m", "d" 를 조합해 만들 수 있지만 spell의 원소를 모두 사용해야 하기 때문에 정답이 아닙니다.

💻 나의 풀이

 

class Solution {
    public int solution(String[] spell, String[] dic) {
        int answer = 2;
        
        for(int i=0; i<dic.length; i++){
            boolean bl = true;
            for(int j=0; j<spell.length; j++){
                if(!dic[i].contains(spell[j])){
                    bl = false;
                    continue;
                }
            }
            if(bl){
                answer=1;
                break;
            }
        }
        return answer;
    }
}

 

일단 answer 값을 2로 초기화합니다.

for문을 사용해서 dic 배열의 길이 만큼 순회하고, boolean형 변수를 생성해서 true로 초기화합니다.

두번째 for문은 spell 배열의 길이 만큼 순회하고, if문을 사용해 만약 배열 dic의 i번째 원소가 배열 spell의 j번째 원소를 포함하지 않는다면 boolean을 false로 변경해줍니다.

만약 첫번째 for문의 if문에서 값이 true 라면, dic의 i번째 원소가 spell의 모든 원소를 포함하고 있다는 뜻이고, spell 원소를 모두 사용하여 만들수 있는 단어는 dic에 하나만 존재한다고 했으므로 break를 사용하여 for문을 빠져나옵니다.

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함