7월 21일 금요일 TIL 회고록
프로그래머스 코딩테스트, 백준 코딩테스트
프로그래머스 - 조건 문자열
문제 설명 및 제한사항, 입출력 예
풀이
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();
결과
백준은 브론즈 문제도 정말 어렵다. 열심히 해야겠다.
이제 그동안 못했던 개인 프로젝트 + 코딩테스트 위주로 공부해야겠다.