항해99 7기/TIL(Today I Learned)

항해99 7기 5일차 TIL[JAVA 프로그래머스 알고리즘]

고을마을 2022. 5. 13. 23:42

2022년 5월 11일 항해 5일차.

오늘부터 일주일간 알고리즘을 공부해보는 시간을 갖게 됐다.

 

새로운 분들을 만나 조를 이뤘고 

일주일간 자바 문법 공부를 비롯해서 프로그래머스 코딩테스트연습 문제 28+a개를 풀게 됐다. 

 

오늘은 자바 문법이 익숙치 않아서 자바 문법 공부에 집중했고 

알고리즘 문제는 조원들과 4개 풀어보게 됐다. 

 


1. 직사각형 별찍기

문제 설명 :

이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.
별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.

 

제한 조건 :

n과 m은 각각 1000 이하인 자연수입니다.

 

예시 :

[ 입력 ]

5 3

 

[ 출력]

*****

*****

*****

import java.util.Scanner;

class number1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();

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

알고리즘 풀이 :

1. 값을 입력받기 위해 스캐너 클래스를 선언해줬고 스캐너 객체를 생성해줬다.

2. 가로축 세로축 별의 반복이기 때문에 중첩 for문을 사용했다.

3. 맨위 for 문은 세로축을 담당하고, 그 아래 for 문은 가로축을 담당한다.

   가로축은 ln을 뺀 print("*")로 작성해서 줄 넘김을 하지 못하게 한다. 

 


2. 짝수와 홀수

문제 설명 :

정수 num이 짝수일 경우 Even을 반환하고 홀수인 경우 Odd를 반환하는 함수, solution을 완성해주세요.

 

제한 조건 : 

  • num은 int 범위의 정수입니다.
  • 0은 짝수입니다.

입출력 예 : 

num                                                                       return

3 Odd
4 Even

 

class number2 {
    public String solution(int num) {
        
   ※1차풀이
            if(num % 2 == 0){
                return ("Even");
            }else{
                return ("Odd");
            }
    
    ※2차풀이
        return num % 2 == 0 ? "Even" : "Odd";
    }

    public static void main(String[] args) {
        number2 n = new number2();
        String solution = n.solution(30);
        System.out.println(solution);

    }
}

알고리즘 풀이 :

<1차 풀이>

1. String으로 반환을 하기에 반환되는 객체 answer을 String으로 선언했다.

2. 숫자 num을 2로 나누었을 때 나머지가 1이면 홀수 0이면 짝수임을 if문으로 판별

     num % 2 == 0 일 때 

     num은 짝수이기에 answer에 Even을 저장

     num % 2 == 1 일 때

     num은 홀수이기에 answer에 Odd를 저장

3. return을 사용하여 위 if 문에서 나온 결과 answer을 반환

 

<2차 풀이>

1. 삼항연산자를 활용해서 <1차풀이>의 내용을 1줄로 간략화함.

 


3. 가운데 글자 가져오기

문제 설명 :

단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.

 

제한 사항 :

  • s는 길이가 1 이상, 100이하인 스트링입니다.

입출력 예 :

s return
"abcde" "c"
"qwer" "we"

 

class number3 {
    public String solution(String s) {
        String answer = "";

        if(s.length() % 2 ==0) {
            answer = s.substring(s.length()/2-1, s.length()/2+1);
        }else{
            answer = s.substring(s.length()/2, s.length()/2+1);
        }
        return answer;
    }

    public static void main(String[] args) {
        number3 n = new number3();
        String abcde = n.solution("abcde");
        System.out.println(abcde);
    }
}

알고리즘 풀이 :

1. answer 객체를 String으로 선언하고 초기화한다.

2. s 문자열의 길이가 홀수인지 짝수인지 if 함수로 판별한다. .substring을 사용해서 사이값을 확인한다.

    짝수일 경우

    .substring을 사용하여 s.length()/2 - 1에서 s.length()/2 + 1전까지의 문자열을 꺼내어 answer에 저장한다.

    홀수일 경우

    .substring을 사용하여 s.length()/2에서 s.length()/2 + 1전까지의 문자열을 꺼내어 answer에 저장한다.

3. return을 사용해서 결과값을 반환

 


4. 두 정수 사이의 합

문제 설명 : 

두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.
예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.

 

제한 조건 : 

  • a와 b가 같은 경우는 둘 중 아무 수나 리턴하세요.
  • a와 b는 -10,000,000 이상 10,000,000 이하인 정수입니다.
  • a와 b의 대소 관계는 정해져있지 않습니다.

입출력 예 :

 

a                                                  b                                                  return

3 5 12
3 3 3
5 3 12

 

public class number4 {
    long solution4(int a, int b) {
        long answer = 0;
        if (a <= b) {
            for (int i = a; i <= b; i++) {
                answer += i;
            }
        } else {
            for (int i = b; i <= a; i++) {
                answer += i;
            }
        }
        return answer;
    }

    public static void main(String[] args) {
        number4 n = new number4();
        long answer = n.solution4(3, 5);
        System.out.println(answer);
    }
}

알고리즘 풀이 :

1. Solution은 long을 반환하기 때문에 객체 answer를 long으로 선언한다.

2. if 문으로 a와 b의 크기를 비교

    a가 b보다 작거나 같을 때 for문을 사용한다.

    i를 a부터 b까지 숫자 1씩 증가시켜서 answer에 증가하는 i 값을 누적으로 더해준다.

    a가 b보다 클 때 for문을 사용한다.

    i를 b부터 a까지 숫자 1씩 증가시켜서 answer에 증가하는 i 값을 누적으로 더해준다.

3. answer를 반환한다.

 


자바 문법을 잘 숙지하지 못한 나로서는 알고리즘 문제가 너무 낯설었다.

조원 중 한 분이 if문과 for문을 통해서 문제를 풀면될 것 같다고 조언해줬고

자바 for문 if문 강의를 듣고 문제를 이해하고 풀 수 있었다.

조원과 자바의 정석 유튜브 강의, 구글 검색의 도움으로 문제를 해결할수 있었던 오늘!

 

특히 구글링의 위대함을 다시 느낄수 있었다.

내일이면 새로운 문제를 접하겠지만

오늘 풀었던 문제도 계속 반복해보면서 자바 문법의 원리를 익혀나갈 것을 다짐해본다.