회원가입
로그인
Toggle navigation
문제
문제
전체 문제
문제 출처
단계별로 풀어보기
알고리즘 분류
추가된 문제
문제 순위
문제
푼 사람이 한 명인 문제
아무도 못 푼 문제
최근 제출된 문제
최근 풀린 문제
랜덤
출처
ICPC
Olympiad
한국정보올림피아드
한국정보올림피아드시․도지역본선
전국 대학생 프로그래밍 대회 동아리 연합
대학교 대회
카카오 코드 페스티벌
Coder's High
ICPC
Regionals
World Finals
Korea Regional
Africa and the Middle East Regionals
Europe Regionals
Latin America Regionals
North America Regionals
South Pacific Regionals
문제집
대회
채점 현황
랭킹
게시판
그룹
더 보기
재채점 기록
블로그
강의
실험실
도움말
BOJ Stack
BOJ Book
전체
공지
자유
질문
오타/오역/요청
게시판 공지
홍보
업데이트
solved.ac
글쓰기
질문 도움말
자주묻는 질문
테케는 다 맞는데 틀렸다고 뜹니다아아앜!!!!!!!!!!!!!!!!!
17822번 - 원판 돌리기
y_y22
3년 전
0
ㅠㅠ 테케는 맞는데 틀렸다고 뜨시는 분 많길래 있는거 다 해본거 같은데 해결 못하겠어요.. 도와주세요..ㅠ
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; public class 원판_돌리기_17822 { static int N,M,T,result; static int[][] arr; static int[] dr = {0,0,-1,1}; static int[] dc = {1,-1,0,0}; static class Node{ int r,c,v; public Node(int r, int c,int v) { this.r = r; this.c = c; this.v = v; } } public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); M = Integer.parseInt(st.nextToken()); T = Integer.parseInt(st.nextToken()); arr = new int[N+1][M+1]; // N번째 원판에 M개의 정수 for(int i=1; i<=N; i++) { st = new StringTokenizer(br.readLine()); for(int j=1; j<=M; j++) { arr[i][j] = Integer.parseInt(st.nextToken()); } } for(int i=0; i<T; i++) { st = new StringTokenizer(br.readLine()); int x = Integer.parseInt(st.nextToken()); int d = Integer.parseInt(st.nextToken()); int k = Integer.parseInt(st.nextToken()); rotate(x,d,k); // 만약 지운 수가 하나도 없다면 2번 실행 // 평균을 구하고 평균보다 큰수는 1을 더하고 작은 수는 1을 빼준다. if(!remove()) { double avg = sum(); replace(avg); } System.out.println(); print(); } for(int i=1; i<=N; i++) { for(int j=1; j<=M; j++) { if(arr[i][j]!=0) { result += arr[i][j]; } } } System.out.println((int)result); } private static void replace(double avg) { for(int i=1; i<=N; i++) { for(int j=1; j<=M; j++) { if((double)arr[i][j]>avg && arr[i][j]!=0) { arr[i][j]-=1; }else if((double)arr[i][j]<avg && arr[i][j]!=0) { arr[i][j]+=1; } } } } private static double sum() { int sum=0; int count =0; for(int i=1; i<=N; i++) { for(int j=1; j<=M; j++) { if(arr[i][j]!=0) { sum += arr[i][j]; count++; } } } return (double) sum/count; } // 인접한 숫자를 지우려면 // N*M 배열에서 상하좌우로 인접한 숫자를 제거하면 된다. // 1 1 2 3 // 2 5 2 4 // 3 1 3 5 // 2 2 1 3 // // x x x 3 // 2 5 x 4 // 3 1 3 5 // x x 1 3 -> 예제 입력 1 그림 참고! static boolean remove() { Queue<Node> queue = new LinkedList<Node>(); for(int i=1; i<=N; i++) { for(int j=1; j<=M; j++) { if(arr[i][j]!=0) { queue.offer(new Node(i,j,arr[i][j])); } } } // 원판에서 숫자가 지워졌는지 아닌지 판별하는 변수 boolean isRemove = false; while(!queue.isEmpty()) { Node node = queue.poll(); boolean flag = false; // 사방탐색을 하여 같은 숫자가 있는지 없는지 판별 for(int d=0; d<4; d++) { int nr = dr[d] + node.r; int nc = dc[d] + node.c; if(nr>0 && nc>0 && nr<=N && nc<=M && arr[nr][nc]!=0) { if(node.v==arr[nr][nc]) { arr[nr][nc] = 0; flag = true; } } // arr[n][1] 과 arr[n][m]이 같은 경우도 고려해주어야 한다. else { switch(d) { case 0: if(node.v==arr[nr][1] && node.c!=1) { arr[nr][1] = 0; flag = true; } break; case 1: if(node.v==arr[nr][M] && node.c!=M) { arr[nr][M] = 0; flag = true; } break; } } } if(flag) { arr[node.r][node.c] = 0; isRemove = true; } } return isRemove; } static void rotate(int x, int d, int k) { for(int i=x; i<=N; i+=x) { if(d==0) { // k칸 만큼 돌리기! 시계 방향! for(int j=0; j<k; j++) { int tmp = arr[i][M]; for(int m=M; m>1; m--) { arr[i][m] = arr[i][m-1]; } arr[i][1] = tmp; } }else if(d==1){ // k칸 만큼 돌리기! 반시계 방향! for(int j=0; j<k; j++) { int tmp = arr[i][1]; for(int m=1; m<M; m++) { arr[i][m] = arr[i][m+1]; } arr[i][M] = tmp; } } } } static void print() { for(int i=1; i<=N; i++) { for(int j=1; j<=M; j++) { System.out.print(arr[i][j] + " "); } System.out.println(); } } }
댓글을 작성하려면
로그인
해야 합니다.
y_y22 3년 전
ㅠㅠ 테케는 맞는데 틀렸다고 뜨시는 분 많길래 있는거 다 해본거 같은데 해결 못하겠어요.. 도와주세요..ㅠ