문제


문제접근 방법
해당 문제는 1~N까지 연속적으로 번호가 붙어있는 스위치가 존재하고 스위치가 ON일 때는 1, OFF일 때는 0으로 표시한다.
이때 학생 몇 명을 뽑은 후 학생들에게 1~N 사이의 번호를 하나씩 나누어주며 학생의 성별에 따라 아래와 같이 스위치를 조작한다.
남학생의 경우 스위치 번호가 자기 받은 번호의 배수이면 스위치 상태 변환시켜 주고
여 자기 받은 번호와 같은 스위치 중심 좌우가 대칭이면서 가장 많은 스위치를 포함하는 구간을 찾아 해당 구간 스위치 상태 모두 바꿔주는 것이다. 모든 조작이 끝나고 스위치들의 마지막 상태를 출력하는 프로그램을 작성하는 문제이다.
문제 접근 방법은 먼저 아래와 같이 문제를 이해하면서 요약하고 중요 부분들을 체크했다.

위와 같이 문제를 요약하고 체크해야 하는 부분들을 나만의 방식으로 정리하고 보니 순수 구현을 문제 접근이 가능하다 판단해 아래와 같이 코드를 작성하였다.
< 초기 코드 >
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner s=new Scanner(System.in);
StringBuilder sb=new StringBuilder();
int n=s.nextInt(); // 스위치 개수
int switchStatus[]=new int[n+1]; // 스위치 상태 배열 _ ON(1)/OFF(0)
for(int i=1;i<=n;i++){
switchStatus[i]=s.nextInt();
}
int students=s.nextInt();// 학생 수
int gender=0; // 학생 성별 _ 남(1)/여(2
int num=0; // 받은 번호
for(int i=0;i<students;i++){
gender=s.nextInt();
num=s.nextInt();
if(gender==1){male(num,switchStatus);}
else{female(num,switchStatus);}
}
for(int i=1;i<=n;i++){
sb.append(switchStatus[i]).append(" ");
}
System.out.println(sb);
}
public static void male(int num,int switchStatus[]){
for(int i=num;i<switchStatus.length;i+=num){
swichNum(i,switchStatus);
}
}
public static void female(int num,int switchStatus[]){
int left=0;
int right=0;
int cnt=1;
swichNum(num,switchStatus);
while(true){
left=num-cnt;
right=num+cnt;
if(right<switchStatus.length&&left>0&&switchStatus[left]==switchStatus[right]){
swichNum(left,switchStatus);
swichNum(right,switchStatus);
cnt++;
}
else{break;}
}
}
public static void swichNum(int index,int switchStatus[]){
if(switchStatus[index]==0){switchStatus[index]=1;}
else{switchStatus[index]=0;}
}
}
초기 코드는 제출결과 출력 형식이 잘못되었습니다 라는 결과를 받았다. 문제 풀이에 앞서 요약하고 중요한 부분을 체크하고 풀이에 들어가서 실수가 없을 것이라 생각했는데 문제에서 놓친 부분이 존재했다.
스위치의 상태를 1번 스위치에서 시작하여 마지막 스위치까지 한 줄에 20개씩 출력한다. 예를 들어 21번 스위치가 있다면 이 스위치의 상태는 둘째 줄 맨 앞에 출력한다. 켜진 스위치는 1, 꺼진 스위치는 0으로 표시하고, 스위치 상태 사이에 빈칸을 하나씩 둔다.
바로 하단 출력을 설명하는 부분에서 위와 같은 설명 부분을 고려하지 못하고 출력을 작성했던 것이다.
이를 아래와 같이 수정해 코드를 완성하였다.
< 최종 코드 >
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner s=new Scanner(System.in);
StringBuilder sb=new StringBuilder();
int n=s.nextInt(); // 스위치 개수
int switchStatus[]=new int[n+1]; // 스위치 상태 배열 _ ON(1)/OFF(0)
for(int i=1;i<=n;i++){
switchStatus[i]=s.nextInt();
}
int students=s.nextInt();// 학생 수
int gender=0; // 학생 성별 _ 남(1)/여(2
int num=0; // 받은 번호
for(int i=0;i<students;i++){
gender=s.nextInt();
num=s.nextInt();
if(gender==1){male(num,switchStatus);}
else{female(num,switchStatus);}
}
for(int i=1;i<=n;i++){
sb.append(switchStatus[i]).append(" ");
if(i%20==0){
sb.append("\n");
}
}
System.out.println(sb);
}
public static void male(int num,int switchStatus[]){
for(int i=num;i<switchStatus.length;i+=num){
swichNum(i,switchStatus);
}
}
public static void female(int num,int switchStatus[]){
int left=0;
int right=0;
int cnt=1;
swichNum(num,switchStatus);
while(true){
left=num-cnt;
right=num+cnt;
if(right<switchStatus.length&&left>0&&switchStatus[left]==switchStatus[right]){
swichNum(left,switchStatus);
swichNum(right,switchStatus);
cnt++;
}
else{break;}
}
}
public static void swichNum(int index,int switchStatus[]){
if(switchStatus[index]==0){switchStatus[index]=1;}
else{switchStatus[index]=0;}
}
}
최종 코드의 코드 흐름을 간단하게 설명하자면 입력받아야 하는 값들을 입력받은 후 동작은 크게 3가지로 나누어진다.
- male
- female
- swichNum
먼저 male함수는 학생의 성별이 남자일 경우, 매개변수로 받은 num의 배수에 해당하는 스위치 번호의 상태를 변경해 주고
female 함수는 여학생의 번호 기준으로 대칭이면서 가장 많은 스위치를 포함하는 구간의 모든 스위치의 상태를 변경해 준다.
마지막으로 swichNum 함수는 swich의 상태가 0인지 1 인지에 따라 값을 변경해 주는 기능을 수행한다.
위와 같이 동작 후 StringBuilder을 활용하여 출력을 완료하였다.
마무리
처음 문제를 보고 구현문제라는 생각이 들어 조건을 꼼꼼히 보지 않으면 문제 풀이가 어려울 수도 있겠다 판단해
문제를 요약하고 들어갔고 난이도도 어렵지 않았지만 난이도를 모르고 접근한 결과 실제로도 어렵지 않게 문제를 해결하였다.
별다른 알고리즘 없이 구현으로 문제가 해결가능한 간단한 문제였다고 생각된다.
'문제풀이 > 구현' 카테고리의 다른 글
| [문제 풀이] 백준 17144번 미세먼지 안녕! JAVA (0) | 2025.08.03 |
|---|---|
| [문제 풀이] 백준 3190번 뱀 JAVA (0) | 2025.07.27 |
| [문제 풀이] 백준 20055번 컨베이어 벨트 위의 로봇 JAVA (0) | 2025.07.20 |
| [문제 풀이] 백준 14503번 로봇 청소기 JAVA (0) | 2025.07.19 |
| [문제 풀이] 백준 14890번 경사로 JAVA (0) | 2025.07.18 |