티스토리 뷰

1️⃣ 3진법 뒤집기

 

문제 설명

자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.

제한사항

  • n은 1 이상 100,000,000 이하인 자연수입니다.

입출력 예

n result
45 7
125 229

 

 

❌틀린코드

class Solution {
    public int solution(int n) {
        String str = "";

        // 10진법 -> 3진법
        while (n > 0) {
            str += n % 3;   // n을 3으로 나눈 나머지를 문자열 str에 추가
            n /= 3;  // n을 3으로 나눈 몫으로 갱신
        }
        
        str = new StringBuilder(str).reverse().toString();   // 앞뒤로 뒤집기
        
        return Integer.parseInt(str, 3);   // 문자열 str을 3진법으로 해석하여 10진수로 변환
    }
}

 

테스트 결과를 살펴보면 입력값이 그대로 나오고 있습니다.

원인은 str += n % 3;   n을 3으로 나눈 나머지를 str에 추가하고 있기 때문에 뒤집는 과정이 필요 없기 때문입니다.

reverse()를 빼주었더니 결과값이 제대로 나와서 그대로 제출할까 했는데..

그럼 저 코드 자체가 무의미하지 않나 싶어서 아예 빼주었습니다.

잘 통과가 됩니다.

 

 

💻 나의 풀이

class Solution {
    public int solution(int n) {
        String str = "";

        // 10진법 -> 3진법
        while (n > 0) {
            str += n % 3;   // n을 3으로 나눈 나머지를 문자열 str에 추가
            n /= 3;  // n을 3으로 나눈 몫으로 갱신
        }
        
        return Integer.parseInt(str, 3);   // 문자열 str을 3진법으로 해석하여 10진수로 변환
    }
}

 

이 문제를 계기로 알게된 것은

Integer.parseInt() 로 진수 변환이 된다는 것 입니다.

 

public static Integer valueOf(String s, int radix)
문자열 s가 radix에 넣은 값의 진법으로 바뀌게 됩니다.

 

 


 

2️⃣ 예산

 

문제 설명

S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다.

물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다.

부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 return 하도록 solution 함수를 완성해주세요.

제한사항

  • d는 부서별로 신청한 금액이 들어있는 배열이며, 길이(전체 부서의 개수)는 1 이상 100 이하입니다.
  • d의 각 원소는 부서별로 신청한 금액을 나타내며, 부서별 신청 금액은 1 이상 100,000 이하의 자연수입니다.
  • budget은 예산을 나타내며, 1 이상 10,000,000 이하의 자연수입니다.

 

입출력 예

d budget result
[1,3,2,5,4] 9 3
[2,2,3,3] 10 4

 

 

💻 나의 풀이

import java.util.Arrays;

class Solution {
    public int solution(int[] d, int budget) {
        int answer = 0;   // 지원해줄 수 있는 부서의 개수
        
        Arrays.sort(d);    // 금액이 적은 순으로 지원해주기 위해 정렬
        
        if(d[0] > budget) return 0;   // 금액이 예산보다 크다면 지원해줄 수 있는 부서의 개수는 0개
        
       // 금액이 예산보다 적다면 지원 가능
        for(int i=0; i<d.length; i++) {
            if(budget >= d[i]) {
                budget -= d[i];   // 예산에서 금액을 순서대로 빼주기
                answer++;   // 한 번 뺄 때 마다 개수는 증가
            }
        }
        
        return answer;
    }
}

 

포인트는

1. 예산보다 금액이 크다면 지원해줄 수 없다 => 0개

2. 예산이 금액보다 크다면 지원 가능

3. 최대한 많은 부서에게 지원하려면 금액을 적게 신청한 부서부터 먼저 지원해주어야 한다. => sort()로 오름차순 정렬 

 

 


 

3️⃣ 이상한 문자 만들기

 

문제 설명

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

제한사항

  • 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
  • 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.

입출력 예

s return
"try hello world" "TrY HeLIO WoRID"

입출력 예 설명

"try hello world"는 세 단어 "try", "hello", "world"로 구성되어 있습니다. 각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면 "TrY", "HeLlO", "WoRlD"입니다. 따라서 "TrY HeLlO WoRlD" 를 리턴합니다.

 

 

 

💻 나의 풀이

class Solution {
    public String solution(String s) {
        String answer = "";
        int cnt = 0;   // 현재 단어에서 몇 번째 문자인지 카운팅 
        
        for(int i=0; i<s.length(); i++) {    // 문자열 s를 돌면서
            char ch = s.charAt(i);   // 현재 인덱스의 문자를 변수 ch에 저장
            if(ch == ' ') {     // ch가 공백이라면
                answer += " ";   // answer에 공백을 추가해주고
                cnt = 0;   // cnt를 0으로 초기화 -> 공백을 기준으로 단어가 나뉨
                continue;
            }
            
            if((cnt%2) == 0) {   // 짝수라면
                answer += String.valueOf(Character.toUpperCase(ch));  // Char를 String으로 변경해주고 대문자로 변경
                cnt++;   // cnt +1
            } else {   // 홀수라면
                answer += String.valueOf(Character.toLowerCase(ch));  // Char를 String으로 변경해주고 소문자로 변경
                cnt++;   // cnt +1
            }
        }
        
        return answer;
    }
}

 

단어 안에서 홀수인지 짝수인지 판별해야 하기 때문에 현재 단어에서 몇 번째 문자인지를 나타내는 카운터 변수 cnt를 생성합니다.

문자열 s를 돌면서 현재 인덱스의 문자를 변수 ch에 저장합니다.

 

첫 번째 if문 : 만약 현재 문자가 공백이라면, 새로운 단어의 시작을 나타내므로 일단 answer에 공백을 추가하고, cnt를 0으로 초기화합니다.

 

두 번째 if문 : 이제 cnt를 이용해서 단어 안에서 글자가 짝수인지 홀수인지 알아볼 겁니다.

- cnt가 짝수인 경우 => String.valueOf() 를 사용해 Char을 String으로 바꿔주고 ( 결과값인 answer는 자료형이 String이기 때문 ), Character.toUpperCase() 를 사용해 대문자로 변경해줍니다. 그리고 다음 자리의 글자로 넘어가기 위해 cnt++ 을 해줍니다.

- cnt가 홀수인 경우 => String.valueOf() 를 사용해 Char을 String으로 바꿔주고 ( 결과값인 answer는 자료형이 String이기 때문 ), Character.toLowerCase() 를 사용해 대문자로 변경해줍니다. 그리고 다음 자리의 글자로 넘어가기 위해 cnt++ 을 해줍니다.

 

 

 

🔍 다른 사람의 풀이

class Solution {
  public String solution(String s) {

        String answer = "";
        int cnt = 0;
        String[] array = s.split("");

        for(String ss : array) {
            cnt = ss.contains(" ") ? 0 : cnt + 1;
            answer += cnt%2 == 0 ? ss.toLowerCase() : ss.toUpperCase(); 
        }
      return answer;
  }
}
  1. split 메서드 사용: 문자열을 각 문자 단위로 분리하기 위해 String 클래스의 split 메서드를 사용하여 String[] array에 저장합니다.
  2. for-each 루프: 각 문자열에 대해 for-each 루프를 사용하여 반복합니다.
  3. cnt 업데이트: 현재 문자열이 공백인지 확인하여 cnt를 업데이트합니다. 공백인 경우 cnt를 0으로 초기화하고, 그렇지 않은 경우에는 cnt를 1 증가시킵니다.
  4. 대소문자 변환: 삼항 연산자를 사용하여 cnt가 짝수일 때는 소문자로, 홀수일 때는 대문자로 변환하여 answer에 추가합니다.

 


 

 

4️⃣ 크기가 작은 부분문자열

 

문제 설명

숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.

예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.

제한사항

  • 1 ≤ p의 길이 ≤ 18
  • p의 길이 ≤ t의 길이 ≤ 10,000
  • t와 p는 숫자로만 이루어진 문자열이며, 0으로 시작하지 않습니다.

 

입출력 예

t p result
"3141592" "271" 2
"500220839878 " "7 " 8
"10203 " "15 " 3

입출력 예 #1
본문과 같습니다.

 

입출력 예 #2
p의 길이가 1이므로 t의 부분문자열은 "5", "0", 0", "2", "2", "0", "8", "3", "9", "8", "7", "8"이며 이중 7보다 작거나 같은 숫자는 "5", "0", "0", "2", "2", "0", "3", "7" 이렇게 8개가 있습니다.

 

입출력 예 #3
p의 길이가 2이므로 t의 부분문자열은 "10", "02", "20", "03"이며, 이중 15보다 작거나 같은 숫자는 "10", "02", "03" 이렇게 3개입니다. "02"와 "03"은 각각 2, 3에 해당한다는 점에 주의하세요

 

 

 

💻 나의 풀이

class Solution {
    public int solution(String t, String p) {
        int len = p.length();   // p의 길이가 몇인지 len에 담고
        long num = Long.parseLong(p);   // p를 long타입으로 변환하여 num에 저장
        int answer = 0;
        
        for(int i=0; i<t.length()-len+1; i++) {  // 문자열 t에서 길이가 len인 모든 부분 문자열을 확인하기 위한 루프
            long diff = Long.parseLong(t.substring(i, i+len));  // 현재 위치 i에서 길이가 len인 부분 문자열만큼 잘라서 숫자로 변환
            if(diff <= num) answer++;  // diff가 num보다 작거나 같으면 answer 증가
        }
        return answer;

    }
}

 

먼저 p의 길이를 알아야하기 때문에, length() 메소드를 사용해서 길이를 구해 len 변수에 담아줍니다.

문자열 t에서 len만큼 잘라서 long 타입으로 저장해줍니다. 처음엔 생각못하고 int로 저장했는데 오버플로우 되어 오류가 발생했습니다.

그 다음은 문자열 t에서 길이가 len인 모든 부분 문자열을 확인하기 위한 루프입니다. 범위가 t.length() - len + 1 인 것을 주의해야 합니다.

반복문을 돌면서 substring() 메소드를 사용해 현재 위치 i에서 길이가 len인 (i+len) 부분 문자열을 잘라서 추출하고, 이를 숫자로 변환해서 diff 변수에 저장합니다.

그리고 마지막으로 diff가 num보다 작거나 같으면, answer를 1 증가시킵니다.

 

아이디어는 쉽게 떠올랐는데 인덱스 범위나 long 타입 등 세밀하게 신경써야하는 것들이 있는 문제였습니다!

 

 


 

 

5️⃣ 삼총사

 

문제 설명

한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.

한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.

제한사항

  • 3 ≤ number의 길이 ≤ 13
  • -1,000 ≤ number의 각 원소 ≤ 1,000
  • 서로 다른 학생의 정수 번호가 같을 수 있습니다.

입출력 예

number result
[-2, 3, 0, 2, -5] 2
[-3, -2, -1, 0, 1, 2, 3]  5
[-1, 1, -1, 1] 0

입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • 학생들의 정수 번호 쌍 (-3, 0, 3), (-2, 0, 2), (-1, 0, 1), (-2, -1, 3), (-3, 1, 2) 이 삼총사가 될 수 있으므로, 5를 return 합니다.

입출력 예 #3

  • 삼총사가 될 수 있는 방법이 없습니다.

 

 

💻 나의 풀이

class Solution {
    public int solution(int[] number) {
        int answer = 0;
        
        for(int i=0; i<=number.length; i++) {   // 첫번째 번호
            for(int j=i+1; j<number.length; j++) {   // 두번째 번호
                for(int k=j+1; k<number.length; k++){   // 세번째 번호
                    if((number[i] + number[j] + number[k]) == 0) answer++;  // 합한 값이 0이면 answer 증가
                }
            }
        }
        
        return answer;
    }
}

 

삼중for문을 써야할거 같은데...이게 맞아...????? 하는 마음으로

for(int i=0; i<=number.length; i++) 만 써놓고 한참을 고뇌했는데 삼중for문 외에는 떠오르는 로직이 없었습니다...😂

너무 간단하지만 주의할 점이라고 한다면 i는 number의 첫 번째 수부터 / j는 i의 다음 수 부터 / k는 j의 다음수 부터 비교해주어야 합니다!

 

 

 

🔍 다른 사람의 풀이

 

다른 사람들은 어떻게 풀었을까?! 엄청 궁금했던 문제였습니다.

하지만 다들 대부분 삼중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
글 보관함