[프로그래머스] 기초 문제 풀이 (두 수의 합, 특정 문자열로 끝나는 가장 긴 부분 문자열 찾기, ad 제거하기, 접미사인지 확인하기, 공백으로 구분하기 1, X 사이의 개수)

2024. 11. 18. 00:10·알고리즘

두 수의 합

사용 언어 : Java
레벨 : 0
📎https://school.programmers.co.kr/learn/courses/30/lessons/181846
 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 설명

0 이상의 두 정수가 문자열 a, b로 주어질 때, a + b의 값을 문자열로 return 하는 solution 함수를 작성해 주세요.

 

제한사항

  • 1 ≤ a의 길이 ≤ 100,000
  • 1 ≤ b의 길이 ≤ 100,000
  • a와 b는 숫자로만 이루어져 있습니다.
  • a와 b는 정수 0이 아니라면 0으로 시작하지 않습니다.

 

입출력 예

 

 

✏️ 풀이

 

우선 엄청 큰 숫자까지 들어올 수 있기 때문에 처음부터 int와 long이 안될 것 같긴 했지만 BigInteger를 많이 사용해 본 적이 없어서 일단 int랑 long으로 시도를 해봤었다. 그런데 역시나 런타임 에러였고.. float나 double로 하니 표현식이 달라서 원하는 답으로 나오질 않았었다. 결국 BigInteger 사용..!

 

간단하게 풀 수 있긴 하지만 알아보니 속도가 느리다는 것 같아서 한번 새로운 방법으로 풀어보기 시작했다.

직접 하나하나 계산하는 풀이로 풀어보자면

 

1. 뒷자리부터 계산하기 위해 각 숫자의 idx 변수를 생성한다. (i, j)

2. 자리올림이 발생했을 때 그만큼 윗자리에서 더해주기 위한 변수를 생성한다. (carry)

3. 뒤에서부터 계산했을 때 더 이상 두 숫자 모두 계산할 숫자가 없고, 자리올림이 발생하지 않을 때까지 각 자릿수를 계산한다.

4. 위 과정에서 자리올림이 발생했을 경우 계산할 때 carry를 같이 더해준다.

5. 10으로 나눈 나머지를 StringBuilder에 추가해주고 carry에는 10으로 나눠서 자리올림 카운트를 해준다.

6. for문이 끝나면 StringBuilder를 뒷자리부터 담았기 때문에 reverse() 를 이용해 뒤집어 준다.

import java.math.BigInteger;
class Solution {
    public String solution(String a, String b) {
       // 방법1
       BigInteger numA = new BigInteger(a);
       BigInteger numB = new BigInteger(b);
       String answer = (numA.add(numB)).toString();

	// 방법2
       StringBuilder sb = new StringBuilder();
        int carry = 0;
        int i = a.length() - 1, j = b.length() - 1;

        while (i >= 0 || j >= 0 || carry > 0) {
            int sum = carry;
            if(i >= 0) sum += a.charAt(i--) - '0';
            if(j >= 0) sum += b.charAt(j--) - '0';
            sb.append(sum % 10);
            carry = sum / 10;
        }
        
        return sb.reverse().toString();
    }
}

 

특정 문자열로 끝나는 가장 긴 부분 문자열 찾기 

사용 언어 : Java
레벨 : 0
📎https://school.programmers.co.kr/learn/courses/30/lessons/181872
 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 설명

문자열 myString과 pat가 주어집니다. myString의 부분 문자열중 pat로 끝나는 가장 긴 부분 문자열을 찾아서 return 하는 solution 함수를 완성해 주세요.

 

제한사항

  • 5 ≤ myString ≤ 20
  • 1 ≤ pat ≤ 5
  • pat은 반드시 myString의 부분 문자열로 주어집니다.
  • myString과 pat에 등장하는 알파벳은 대문자와 소문자를 구분합니다.

.

 

입출력 예

 

✏️ 풀이

나는 분명 내 기억상 String 메서드 중에 해당 문자열이 있는지 체크하는 메서드가 있었던 것 같은데.. 라고 그걸 생각도 안나는데 계속 쓰려고 하나보니 시간이 조금 오래걸렸다. ㅠㅠ 안찾고 풀고 싶어서 좀 고민하다 결국 못알아내고 문제를 풀어봤다. << 찾아보니 그 메서드는 그냥 lastIndexOf() 였음 찾는 문자열 index 알아내는 메소드..

 

여튼 myString을 뒤에서 pat의 길이만큼 탐색하면서 pat과 같은 글자가 됐을 때 그 index를 저장하고 0부터 해당 부분까지 출력하도록 풀었다. 근데 다른사람 풀이 보니까 내가 원하던 lastIndexOf() 사용한 풀이가 있어서 그 방법으로도 다시 풀어봤다.

class Solution {
    public String solution(String myString, String pat) {
        int i = myString.length() - 1;
        String check = "";

        StringBuilder sb = new StringBuilder();
        while (true) {
            check = myString.substring(i - pat.length() + 1, i + 1);
            System.out.println(check);

            if(check.equals(pat)) {
                return myString.substring(0, i + 1);
            }
            i--;
        }
        
        // 다른 방법
        int idx = myString.lastIndexOf(pat);
        answer = myString.substring(0, idx) + pat;
        System.out.println(answer);

    }
}

 

ad 제거하기 

사용 언어 : Java
레벨 : 0
📎https://school.programmers.co.kr/learn/courses/30/lessons/181870
 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 설명

문자열 배열 strArr가 주어집니다. 배열 내의 문자열 중 "ad"라는 부분 문자열을 포함하고 있는 모든 문자열을 제거하고 남은 문자열을 순서를 유지하여 배열로 return 하는 solution 함수를 완성해 주세요.

 

제한사항

  • 1 ≤ strArr의 길이 ≤ 1,000
    • 1 ≤ strArr의 원소의 길이 ≤ 20
    • strArr의 원소는 알파벳 소문자로 이루어진 문자열입니다.

 

입출력 예

✏️ 풀이

import java.util.ArrayList;
class Solution {
    public String[] solution(String[] strArr) {
        ArrayList<String> arr = new ArrayList<String>();
        
        for(int i = 0; i < strArr.length; i++) {
            if(strArr[i].indexOf("ad") == -1) {
                arr.add(strArr[i]);
            }
        }
        
        String[] answer = arr.toArray(new String[arr.size()]);
        
        // stream 사용법
        System.out.println(Arrays.toString(Arrays.stream(strArr).filter(s -> !s.contains("ad")).toArray(String[]::new)));
        
        return answer;
    }
}

 

접미사인지 확인하기 

사용 언어 : Java
레벨 : 0
📎https://school.programmers.co.kr/learn/courses/30/lessons/181908
 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 설명

어떤 문자열에 대해서 접미사는 특정 인덱스부터 시작하는 문자열을 의미합니다. 예를 들어, "banana"의 모든 접미사는 "banana", "anana", "nana", "ana", "na", "a"입니다. 문자열 my_string과 is_suffix가 주어질 때, is_suffix가 my_string의 접미사라면 1을, 아니면 0을 return 하는 solution 함수를 작성해 주세요.

 

제한사항

  • 1 ≤ my_string의 길이 ≤ 100
  • 1 ≤ is_suffix의 길이 ≤ 100
  • my_string과 is_suffix는 영소문자로만 이루어져 있습니다.

 

입출력 예

✏️ 풀이

class Solution {
    public int solution(String my_string, String is_suffix) {
        if(my_string.length() < is_suffix.length()) return 0;
        return my_string.substring(my_string.length() - is_suffix.length()).equals(is_suffix) ? 1 : 0;
    }
}

 

 

공백으로 구분하기 1

사용 언어 : Java
레벨 : 0
📎https://school.programmers.co.kr/learn/courses/30/lessons/181869
 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 설명

단어가 공백 한 개로 구분되어 있는 문자열 my_string이 매개변수로 주어질 때, my_string에 나온 단어를 앞에서부터 순서대로 담은 문자열 배열을 return 하는 solution 함수를 작성해 주세요.

 

제한사항

  • my_string은 영소문자와 공백으로만 이루어져 있습니다.
  • 1 ≤ my_string의 길이 ≤ 1,000
  • my_string의 맨 앞과 맨 뒤에 글자는 공백이 아닙니다.

 

입출력 예

✏️ 풀이

class Solution {
    public String[] solution(String my_string) {
        return my_string.split(" ");
    }
}

 

X 사이의 개수 

사용 언어 : Java
레벨 : 0
📎https://school.programmers.co.kr/learn/courses/30/lessons/181867
 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 설명

문자열 myString이 주어집니다. myString을 문자 "x"를 기준으로 나눴을 때 나눠진 문자열 각각의 길이를 순서대로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.

 

제한사항

  • 1 ≤ myString의 길이 ≤ 100,000
    • myString은 알파벳 소문자로 이루어진 문자열입니다.

 

입출력 예

✏️ 풀이

끝에 x가 올 것을 생각해 myString.length로 길이를 정해주면 예외적인 상황까지 처리할 수 있다.

class Solution {
    public int[] solution(String myString) {
        String[] strArr = myString.split("x", myString.length());
        int[] answer = new int[strArr.length];
        for(int i = 0; i < strArr.length; i++) {
            answer[i] = strArr[i].length();
        }
        
        return answer;
    }
}

 

'알고리즘' 카테고리의 다른 글

[백준/Java] #11659 구간 합 구하기 4, #11660 구간 합 구하기 5  (0) 2024.11.25
[프로그래머스] 기초 문제 풀이 (0 떼기, 치킨 쿠폰, 간단한 식 계산하기, 세 개의 구분자, 배열의 원소만큼 추가하기, 무작위로 K개의 수 뽑기)  (0) 2024.11.19
[프로그래머스/Java] 코딩 기초 트레이닝 복습  (0) 2024.09.12
[백준/Java] #14503 로봇 청소기  (0) 2023.06.20
[백준/Java] #16985 Maaaaaaaze  (0) 2023.06.20
'알고리즘' 카테고리의 다른 글
  • [백준/Java] #11659 구간 합 구하기 4, #11660 구간 합 구하기 5
  • [프로그래머스] 기초 문제 풀이 (0 떼기, 치킨 쿠폰, 간단한 식 계산하기, 세 개의 구분자, 배열의 원소만큼 추가하기, 무작위로 K개의 수 뽑기)
  • [프로그래머스/Java] 코딩 기초 트레이닝 복습
  • [백준/Java] #14503 로봇 청소기
하늘☁️
하늘☁️
개발일지, 학습, 스터디 기록 남기는 블로그 ☁️
  • 하늘☁️
    구름일지
    하늘☁️
  • 전체
    오늘
    어제
    • 분류 전체보기 (51)
      • Java (3)
      • SQL (5)
      • 알고리즘 (31)
      • TIL (4)
      • CS (6)
      • 일상 (2)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    회고
    충돌위험 찾기
    알고리즘
    java
    백준
    코딩테스트입문
    비순차적명령어처리기법
    제로베이스백엔드스쿨
    프로그래머스
    제로베이스백엔드스쿨초단기취업반
    명령어파이프라인
    상속
    cpu의작동원리
    pccp 기출문제 3번
    boj12891
    mysql
    제로베이스부트캠프
    스터디기록
    boj1377
    dna 비밀번호
    코딩테스트연습
    컴퓨터구조
    정적블록
    db
    학습일지
    CS
    TIL
    boj10986
    코딩테스트
    boj5427
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
하늘☁️
[프로그래머스] 기초 문제 풀이 (두 수의 합, 특정 문자열로 끝나는 가장 긴 부분 문자열 찾기, ad 제거하기, 접미사인지 확인하기, 공백으로 구분하기 1, X 사이의 개수)
상단으로

티스토리툴바