1100
하얀 칸
- 체스판은 8×8크기이고, 검정 칸과 하얀 칸이 번갈아가면서 색칠되어 있다. 가장 왼쪽 위칸 (0,0)은 하얀색이다. 체스판의 상태가 주어졌을 때, 하얀 칸 위에 말이 몇 개 있는지 출력하는 프로그램을 작성하시오.
- 8줄 문자열로 주어지고, '.'은 빈칸, 'F'는 말이 있는 칸이다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] arr = new String[8];
for (int i = 0; i < 8; i++) {
arr[i] = sc.next();
}
int cnt = 0;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (arr[i].charAt(j) == 'F' && (i + j) % 2 == 0) {
cnt++;
}
}
}
System.out.println(cnt);
sc.close();
}
}
- ㅇㅇ
1110
더하기 사이클
- 0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다.
- ex) 26시작. 2+6=8, 다음 수는 68. 6+8=14, 다음 수는 84. 8+4=12, 다음 수는 42. 4+2=6, 다음 수는 26. 4번만에 돌아왔다. 따라서 사이클 길이는 4.
- ex) 0시작. 0+0=0, 다음 수는 0. 1번만에 돌아왔다. 사이클 길이는 1.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 입력
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.close();
int res = 0; // 반복 횟수 저장할 변수
final int origin = n; // 원래 값 저장
do {
res++;
n = n % 10 * 10 + (n % 10 + n / 10) % 10; // 결과 수의 십의 자리: 원래 일의 자리. 일의자리: 더한 수의 일의자리
} while (n != origin); // 같아질 때가지 계속
System.out.println(res);
}
}
- 한글 설명이 기괴해서 그렇지... 이해하면 풀 수 있다.
1159
농구 경기
- 첫 줄에 선수 수 N이 입력되고, (1<=N<=150)
- 다음 N개 줄에는 각 선수 이름이 입력됨. (이름<=30글자)
- 선수 이름 첫 글자가 같은 선수 5명 이상이면 출전 가능.
- 출전 가능한 첫 글자 모두를 사전순으로 출력 / 아무도 없을 시 PREDAJA 출력.
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class bj1159_0126 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
char[] name = new char[N];
for (int i = 0; i < N; i++) {
name[i] = sc.next().charAt(0); // 입력과 동시 첫 글자만 차곡차곡 저장
}
sc.close();
int[] cnt = new int[N]; // 각 인덱스에 해당 알파벳이 몇 개 있는지 저장할 배열
boolean flag = false; // 아무도 없으면 그대로 false, PREDAJA 출력할 목적
ArrayList<Character> cl = new ArrayList<>(); // 가변길이 배열, 답 되는 알파벳 모두 넣어줄 것
for (int i = 0; i < N; i++) {
cnt[i]++; // 하나니까 세주고
if (cnt[i] == 0) // 만약 뒤에서 스킵하라고 한 놈이면 건너뛰기
continue;
for (int j = i + 1; j < N; j++) {
if (name[i] == name[j]) {
cnt[i]++; // 한칸 뒤부터 끝까지, 같은 놈 나올 때마다 +1하고,
cnt[j] = -1; // 대신 그 같은 대상은 -1 저장해서 나중에 자기 차례 땐 건너뛰게
}
}
if (cnt[i] > 4) {
cl.add(name[i]); // 5명 이상이면 출전 가능, 가변길이 배열에 하나씩 넣어주기
flag = true; // 한명이 이미 출전 가능이니까, PREDAJA 출력하지말자
}
}
if (flag == false)
System.out.println("PREDAJA"); // 아무도 출전 못하니까 항복
else {
Collections.sort(cl); // 사전순으로 자동정렬
for (int i = 0; i < cl.size(); i++)
System.out.print(cl.get(i));
}
}
}
- 가변 길이 배열을 처음 문제에 써봤다.
- 그냥 그거 실습 한 의의가 있는 문제
- 근데 자꾸... 숫자 세는 문제에서 항상 같은 크기의 배열을 하나 더 만들고, 각 인덱스에 대응하는 수 개수를 인덱스에 저장하는 형식으로 문제를 풀어왔는데,
- 이 방법이 그닥 좋은 방법 같지는 않다. 다른 방법을 알고싶다.
'PS - BOJ' 카테고리의 다른 글
1193 - 분수찾기, 1225 - 이상한 곱셈, 1233 - 주사위 (0) | 2022.01.28 |
---|---|
1157 - 단어 공부 (0) | 2022.01.27 |
1026, 1037, 1085 - 보물, 약수, 직사각형에서 탈출 (0) | 2022.01.26 |
1003 - 피보나치 함수 (0) | 2022.01.25 |
1094, 1015, 1057 - 막대기, 수열 정렬, 토너먼트 (0) | 2022.01.25 |