본문 바로가기

코딩테스트 스터디

코딩테스트 연습 - k의 개수 (JAVA)

프로그래머스 코딩테스트 입문 0단계 문제입니다

https://school.programmers.co.kr/learn/courses/30/lessons/120887

📢 문제 설명

1부터 13까지의 수에서, 1은 1, 10, 11, 12, 13 이렇게 총 6번 등장합니다. 정수 i, j, k가 매개변수로 주어질 때, i부터 j까지 k가 몇 번 등장하는지 return 하도록 solution 함수를 완성해주세요.

 

⭕ 정답 코드

1. IntStream 사용

class Solution {
    public int solution(int i, int j, int k) {
        List list = IntStream.range(i, j+1) //i부터 j까지 있는 숫자 스트림 형성
                        .mapToObj(m -> m+"") //정수형 데이터들을 문자열로 변환
                        .collect(Collectors.toList()); //Stream to List

        String str = String.join("", list); //List to String

        return str.length() - str.replace(String.valueOf(k), "").length(); //(문자열 길이) - (특정 문자를 뺀 문자열 길이) = (특정 문자 개수)
    }
}
  • 자세한 설명은 주석 참고하세요
  • i부터 j까지 해당하는 숫자를 문자열로 만들고, length() 메서드로 k의 개수를 알아냈다

2. 다른 분의 풀이

class Solution {
    public int solution(int i, int j, int k) {
        String str = "";
        for(int a = i; a <= j; a++) {
            str += a+""; //반복문 돌리면서 문자열 추가
        }

        return str.length() - str.replace(k+"", "").length();
    }
}
  • 나는 IntStream.range()로 범위의 숫자들을 문자열로 만들었다면
  • 이 풀이에서는 반복문으로 문자열을 만들고 있다

📒 기억하고 갈 문법

String.join("연결 문자", 리스트) => 리스트를 문자열로 만들어준다

✅ 회고

지난주 일주일간 코테에 손을 대지 않았었다.. 오랜만에 푸니까 또 재밌다

Stream 안 쓰고도 짧은 코드를 고민해봐야겠다는 다짐을 또 다시 해본다..

i와 j이 100,000까지 갈 수 있는데 이 숫자로 for문을 돌려도 되는지 궁금하다

자료구조 시간복잡도를 더 공부해야겠지요..? 내일도 화이팅