프로그래머스 직사각형 별찍기 , 핸드폰 번호 가리기(99클럽 코딩테스트 2일차 TIL)

KIMYEONGJUN·2024년 3월 28일
0
post-thumbnail

목적

오늘이 2일차이다. 시간이 정말 빠르게 가는것같다. 처음이라 사람들 어떻게 코딩하는지 궁금했었는데 다른사람들의 코딩을 보니깐 조금 많이 신기했다. 풀이방법도 전부다 달라서 어떤건 이해하기 어려웠던것같다. 나 역시 빠르게 코딩테스트에 적응했으면 좋겠다.

문제

처음에 이문제를 봤을때는 대학교때 별찍기 생각났었다. 백준에서 많이 풀어봤지만 프로그래머스 환경에서 코딩을 많이 해보지않아서 어렵게 느껴졌던건 사실이다. 문제를 조금 헷갈렸다. n이 가로 길이 m이 세로길이다.

5 3을 입력하면

*****
*****
*****

가로길이 세로길이 이렇게 입력을 받는다. 시간복잡도를 생각해봤다. 시간복잡도는 O(N^2)로 풀기로했다. 장점은 데이터 크기가 작을때는 효율적일 수 있지만 단점은 데이터가 커질 경우에는 수행 속도가 급격히 느려진다는 단점이 있다.

O(N^2) 가용범위는 3,000 ~ 5,000이다.

대학교때 이중 for문을해서 푼기억이나서 오늘도 이중 for문으로 풀어보기로했다.

// 두 개의 정수 n, m이 주어짐
// 별(*) 문자를 이용해 가로의 길이가 n 세로의 길이가 m인 직사각형 형태로 출력

import java.util.Scanner;

class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(); // 가로 길이
        int m = sc.nextInt(); // 세로 길이 

        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

무사히 통과를 했다.

문제

오늘 같이 문제를 풀면서 내가 생각을 못했던 방법으로 문제를 풀어서 나도 Java언어로 다시 풀어보기로했다.

// 전화번호가 문자열 phone_number로 주어졌을때
// 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴

class Solution {
    public String solution(String phone_number) {
        String answer = ""; // 리턴할 결과
        String p_num = phone_number; // 전화번호 문자열
        
        String star_region = "*".repeat(p_num.length() - 4); // 전화번호 길이 - 4 만큼 *문 추가
        String last_region = p_num.substring(p_num.length() -4); // 뒷 4자리 번호 추출
        
        answer = star_region + last_region; // * 문자 region + 뒷 4자리 region 합치기 
        System.out.println(answer); // 결과값이 출력
        
        return answer;
    }
}

시간의 복잡도를 생각해봤다. O(N)으로 가용범위는 1,000 ~ 2,000만이다.
O(N) 시간의 복잡도의 장점은
입렵데이터 크기 N에 따라 알고리즘 실행 시간이 선형적으로 증가하기 때문에 상대적으로 빠르다.
데이터 규모가 클때도 수행속도가 느려지지 않고 안정적이다.

단점으로는
데이터 크기가 매우 크면 연산 시간이 누적되어 오래 걸릴수 있다.
O(1), O(logN)과 같이 더울 효율적인 알고리즘이 존재한다.

테스트를 할때 통과를 했다.

마무리

오늘 푼 문제는 어렵지 않다고 생각했는데 막상 구현할려고하니깐 어떻게 구현해할지 감이 잘안왔다. 아무래도 코드를 작성하기전에 먼저 코드를 어떻게 작성할 것인지 그리고 시간의 복잡도는 어떤거를 사용한것인지를 먼저 생각해보고 코드를 짜야겠다는 생각이 들었다.

profile
Junior backend developer

0개의 댓글