카테고리 없음

7월 21일 금요일 TIL 회고록

tft4rollz 2023. 7. 21. 20:18

프로그래머스 코딩테스트, 백준 코딩테스트


프로그래머스 - 조건 문자열

문제 설명 및 제한사항, 입출력 예

풀이

class Solution {
    public int solution(String ineq, String eq, int n, int m) {
        int answer = 0;
        String sSum = ineq + eq;
        
        if(sSum.equals("<=") && n <= m ) {
            answer += 1;
        } else if(sSum.equals(">=") && n >= m) {
            answer += 1;
        } else if(sSum.equals("<!") && n < m) {
            answer += 1;
        } else if(sSum.equals(">!") && n > m) {
            answer += 1;
        }
        return answer;
    }
}

문자열 ineq와 eq를 합친 값인 sSum을 만들었다.

그 후 if문와 문자열을 비교해주는 메서드 equals()를 사용해

eSum이 "<=" 이고 n이 m보다 작거나 같으면 answer에 1을 추가했다.

eSum이 ">=" 이고 n이 m보다 크거나 같으면 answer에 1을 추가했다.

eSum이 "<!" 이고 n이 m보다 작으면 answer에 1을 추가했다.

eSum이 ">!" 이고 n이 m보다 크면 answer에 1을 추가했다.

 

코드 실행 결과


백준 1058번 - 직사각형에서 탈출

문제, 입력, 출력, 제한, 예제 입력 1

풀이

이해하면 아주 쉬운 문제인데 이해하지 못하면 아주 어려운 문제인 것 같다.

나도 처음에 이해를 못해서 정말 어렵게 풀려고 했는데 이해하니 엄청 쉬운 문제였다..

 

파란색의 직사각형이 있고 그 안에 점 (x,y)가 있다. 이때 경계성과 가장 가까운 거리를 구하면 된다. 즉, 이 점에서 직각으로 이동했을 때

최소 거리를 구하기만 하면 된다는 것이다. 이 거리들은 그림에 나와있는 것처럼 w,h,h-y,w-x이다. 따라서 이 값들의 최솟값을 구하여 출력하기만 하면 되는 문제이다.

 

코드

import java.util.Scanner;

public class Main {

  public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);
    int x = sc.nextInt();
    int y = sc.nextInt();
    int w = sc.nextInt();
    int h = sc.nextInt();
    int answer = 0;

    int xMin = Math.min(x, w - x);
    int yMin = Math.min(y, h - y);
    answer = Math.min(xMin, yMin);
    System.out.println(answer);


  }
}

Math.min()을 사용해서 최솟값을 구했다.

먼저 스캐너를 사용해 x, y, w, h 의 값을 받은 뒤 Math.min을 사용해 x와 w-x의 최솟값을 정수형 변수 xMin에 넣어주었다.

마찬가지로 Math.min을 사용해 y와 h-y의 최솟닶을 정수형 변수 yMin에 넣어주었다.

x의 최솟값과 y의 최솟값을 구했으면 마지막으로 x,y중에 최솟값을 구해야하므로 Math.min을 사용해 최솟값을 answer에 넣어주었다.

 

결과


백준 2438번 - 별 찍기 1

문제, 입력, 출력, 예제 입력

 

풀이

 

먼저 전체 코드부터 보면..

import java.util.Scanner;

public class Main {

  public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();

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

for문을 두번 사용해 문제를 풀었다.

i = 0, j = 0        
i = 1, j = 0 i = 1, j = 1      
i = 2, j = 0 i = 2, j = 1 i = 2, j = 2    
i = 3, j = 0 i = 3, j = 1 i = 3, j = 2 i = 3, j = 3  
i = 4, j = 0 i = 4, j = 1 i = 4, j = 2 i = 4, j = 3 i = 4, j = 4

색칠 되어 있는 곳이 별이 출력되는 부분이다.

설명을 잘 하는편이 아니라.. 실행하면 저렇게 별이 출력된다.

for(int i=0 ; i < n ; i++) : i는 n까지 반복문을 실행한다.

for(int j = 0 ; j <= i; j++) j는 0부터 시작하나 j는 i보다 작거나 같다. 

그래서 처음에 시작되면 i는 0이고 j도 0이니 *이 하나 출력되고, i가 1이면 j는 0일때 한번 별이 추가되고, 1일때 한번 별이 추가되고.. 

이런식으로 작동이 된다.

내부 for문에 줄바꿈을 하지 않는 출력문인 System.out.print() 를 사용해 위에 표처럼 만들어주고, 줄바꿈을 해주는 출력문인 System.out.println()을 사용해 * 출력이 끝나면 줄바꿈을 해주었다.

 

결과


백준 2439번 - 별 찍기 2

문제, 입력, 출력, 예제 입력, 예제 출력

 

풀이

 

이거도 먼저 전체 코드를 보면..

import java.util.Scanner;

public class Main {

  public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();

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

    }
  }

 

먼저 N이라는 숫자가 주어진다. 1 행부터 n 행까지 출력을 하기 위한 가장 큰 틀의 반복문을 먼저 구상했다.

for (int i = 1; i <=n; i++)

그리고 출력을 보면 전 문제 (별 찍기 1)와는 다르게 공백이 1 행에 4개 출력, 2행에 3개 출력, 3행에 2개 출력, 4행에 1개 출력..

즉, n번째 행에는 N-n개의 공백이 출력되고, 별은 n번째 행에 n개가 출력되어야 한다.

i가 행을 의미하니 N-i의 값만큼 공백을 출력해주면 된다.

 

for (int i = 1; i <=n; i++) {
  for (int j = 1; j <= n-i; j++) {
     System.out.print(" ");
   }
}

즉, 공백 출력의 경우 내부 for문의 j는 n - i의 값만큼 반복해주면 된다.

그리고 각 행에 별도 출력해주어야한다. 별의 개수는 i의 값만큼 출력하니 for문을 외부 for문 아래에 하나 더 써주었다.

for (int z = 1 ; z <= i; z++) {
   System.out.print("*");
}

 

또, 한 행의 출력이 모두 끝나면 줄바꿈을 해주어야 하므로 내부 for문이 종료 될 때마다 줄바꿈을 해주었다.

System.out.println();

 

결과


백준은 브론즈 문제도 정말 어렵다. 열심히 해야겠다.

이제 그동안 못했던 개인 프로젝트 + 코딩테스트 위주로 공부해야겠다.