250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 백준
- 백준2251
- 알고리즘
- 주사위굴리기2
- 23288
- 백준13458
- 에라토스테네스의채
- 중복조합
- 코테
- N과M
- 백준15652
- D드라이브생성
- 코테준비
- BFS
- 중복순열
- 전화번호속의암호
- Bfs와DFS
- 알고리즘개념
- 완탐
- 자바
- 정보처리기사
- java
- 재귀함수
- 자바 코테
- 삼성역테
- 완전탐색
- 볼륨 만들기
- 파티션 크기 조정
- 순열
- 정올 1620
Archives
- Today
- Total
뚱땅뚱땅
[문제] 백준 1244번 스위치 켜고 끄기 본문
728x90
* 출처: www.acmicpc.net/problem/1244
내 생각
재귀함수를 복습하는 김에 재귀로 풀어봤다. 시간이 좀 걸렸던 이유는 문제를 잘 안 읽은 게 크다.
출력부분을 보면, 한줄에 20개의 스위치번호를 출력하도록 써있는데, 이걸 보지 못했다.
그리고 boy() 부분에서 ball += ball;을 해서 계속 틀렸었다.
문제 좀 더 주의깊게 좀 읽자!!
import java.io.*;
import java.util.StringTokenizer;
public class BJ_1244 {
static int sArr[] = new int[101]; // 스위치 배열
static int num; // 스위치 개수
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder("");
num = Integer.parseInt(in.readLine());
StringTokenizer st = new StringTokenizer(in.readLine(), " ");
for (int i = 1; i <= num; i++) {
sArr[i] = Integer.parseInt(st.nextToken());
}
// 학생 수
int student = Integer.parseInt(in.readLine());
for (int i = 0; i < student; i++) {
st = new StringTokenizer(in.readLine(), " ");
int gender = Integer.parseInt(st.nextToken()); // 1: 남자, 2: 여자
int ball = Integer.parseInt(st.nextToken()); // 받은 공 넘버
if (gender == 1) {
boy(ball, ball);
} else if (gender == 2) {
girl(ball, 0);
}
}
// 결과 출력
for (int i = 1; i <= num; i++) {
sb.append(sArr[i]).append(" ");
if(i%20 == 0) sb.append("\n");
}
System.out.print(sb);
}
static void boy(int ball,int d) {
//1. 반복문으로 풀기
// int d = ball;
// while(ball<=num) {
// sArr[ball] ^= 1;
// ball+= d;
// }
// 2. 재귀로 풀기
if(ball>num) return;
sArr[ball] ^= 1;
ball += d;
boy(ball,d);
}
//재귀
static void girl(int ball, int d) {
if (ball - d < 1 || ball + d > num) // 범위 넘어가면
return;
if (d == 0) {
sArr[ball] ^= 1;
} else {
if (sArr[ball - d] == sArr[ball + d]) {
sArr[ball - d] ^= 1;
sArr[ball + d] ^= 1;
} else {
return;
}
}
girl(ball, d + 1);
}
}
두번쨰 풀이: for문
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(in.readLine());
int[] state = new int[N+1];
StringTokenizer st = new StringTokenizer(in.readLine()," ");
for(int i=1;i<=N;i++) {
state[i] = Integer.parseInt(st.nextToken());
}
int student = Integer.parseInt(in.readLine());
for(int i=0;i<student;i++) {
st = new StringTokenizer(in.readLine()," ");
int gender = Integer.parseInt(st.nextToken());
int num = Integer.parseInt(st.nextToken());
if(gender == 1) {
for(int j=num; j<= N; j+= num) {
state[j] ^= 1;
}
}else if(gender == 2) {
state[num] ^= 1;
for(int j=1;j<N;j++) {
int left = num - j;
int right = num + j;
if(left>0 && right <=N) {
if(state[left] == state[right]) {
state[left] ^= 1;
state[right] ^=1;
}else
break;
}else
break;
}
}
}
for(int i=1;i<=N;i++) {
System.out.print(state[i]+ " ");
if(i!=0 && i%20 == 0) System.out.println();
}
System.out.println();
}
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[문제] 백준 2231번 분해합 (0) | 2021.02.03 |
---|---|
[문제] 백준 2798번 블랙잭 (0) | 2021.02.02 |
[문제] 백준 17478번 재귀함수가 뭔가요? (0) | 2021.02.01 |
[문제]백준 9020번 골드바흐의 추측 (0) | 2021.01.30 |
[문제] 백준 4948번 베트르랑 공준 - 소수 (0) | 2021.01.30 |
Comments