[Boj16926] 배열 돌리기 1

2024. 11. 17. 23:58·알고리즘

배열의 회전을 구현하기만 하면 되는 시뮬레이션이다.

 

첫번째 시도 (실패)

import java.io.*;
import java.util.*; 

public class Main {
	
	static int N, M, R, map[][];
	static boolean[][] v; 

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
		StringTokenizer st = new StringTokenizer(br.readLine()); 
		
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		R = Integer.parseInt(st.nextToken());
		
		map = new int[N][M];
		
		for(int i=0; i<N; i++) {
			st = new StringTokenizer(br.readLine());
			
			for(int j=0; j<M; j++) {
				map[i][j] = Integer.parseInt(st.nextToken()); 
			}
		}
		
		for(int i=0; i<R; i++) {
			v = new boolean[N][M];
			rotate(); 
		}
		
		StringBuilder sb = new StringBuilder(); 
		
		for(int i=0; i<N; i++) {
			for(int j=0; j<M; j++) {
				sb.append(map[i][j]).append(" ");
			}
			sb.append("\n"); 
		}
		
		System.out.println(sb);
		

	}
	
	static int[] dr = {1, 0, -1, 0};
	static int[] dc = {0, 1, 0, -1};
	
	static void rotate() {
		for(int i=0; i<M/2; i++) {
			
			int d = 0; 
			int prev = map[i][i];
			
			int nr = i; 
			int nc = i; 
			
			while(!(nr == i && nc == i && v[i][i])) {
				nr += dr[d];
				nc += dc[d];
				
				if((nr < 0 || nc < 0 || nr >= N || nc >= M) ||  v[nr][nc]) {
					nr -= dr[d];
					nc -= dc[d];
					d = (d+1) % 4;
					continue; 
				}
				
				int temp = map[nr][nc];
				map[nr][nc] = prev;
				prev = temp; 
				v[nr][nc] = true;
				
			}
		}
	}

}

 

🔥 회전할 때 테두리의 회전이 끝났으면 안쪽으로 들어가는 로직을 반복문을 통해 M/2번 실행되게 된다. 하지만 이 로직은 N > M 일 경우에만 유효한 코드이다. 

따라서 반복문의 조건을 M/2가 아닌 Math.min(N, M)/2 로 수정했다. 

 

두 번째 시도 (성공) 

import java.io.*;
import java.util.*; 

public class Main {
	
	static int N, M, R, map[][];
	static boolean[][] v; 

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
		StringTokenizer st = new StringTokenizer(br.readLine()); 
		
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		R = Integer.parseInt(st.nextToken());
		
		map = new int[N][M];
		
		for(int i=0; i<N; i++) {
			st = new StringTokenizer(br.readLine());
			
			for(int j=0; j<M; j++) {
				map[i][j] = Integer.parseInt(st.nextToken()); 
			}
		}
		
		for(int i=0; i<R; i++) {
			v = new boolean[N][M];
			rotate(); 
		}
		
		StringBuilder sb = new StringBuilder(); 
		
		for(int i=0; i<N; i++) {
			for(int j=0; j<M; j++) {
				sb.append(map[i][j]).append(" ");
			}
			sb.append("\n"); 
		}
		
		System.out.println(sb);
		

	}
	
	static int[] dr = {1, 0, -1, 0};
	static int[] dc = {0, 1, 0, -1};
	
	static void rotate() {
		for(int i=0; i<Math.min(N, M); i++) {
			
			int d = 0; 
			int prev = map[i][i];
			
			int nr = i; 
			int nc = i; 
			
			while(!(nr == i && nc == i && v[i][i])) {
				nr += dr[d];
				nc += dc[d];
				
				if((nr < 0 || nc < 0 || nr >= N || nc >= M) ||  v[nr][nc]) {
					nr -= dr[d];
					nc -= dc[d];
					d = (d+1) % 4;
					continue; 
				}
				
				int temp = map[nr][nc];
				map[nr][nc] = prev;
				prev = temp; 
				v[nr][nc] = true;
				
			}
		}
	}

}

 

저작자표시 비영리 변경금지

'알고리즘' 카테고리의 다른 글

[알고리즘 이론] 벨만-포드 알고리즘  (0) 2025.04.30
[Boj2240] 자두나무  (1) 2024.11.20
[BOJ1068] 트리  (1) 2024.11.16
[코드트리 조별과제] 부분 수열의 합이 K (누적합)  (1) 2024.08.20
[코드트리 조별과제] 두 수의 합 (HashMap)  (0) 2024.08.18
'알고리즘' 카테고리의 다른 글
  • [알고리즘 이론] 벨만-포드 알고리즘
  • [Boj2240] 자두나무
  • [BOJ1068] 트리
  • [코드트리 조별과제] 부분 수열의 합이 K (누적합)
l'avenirJun
l'avenirJun
  • l'avenirJun
    오늘도 꾸준히 개발
    l'avenirJun
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 📚 개발자의 서재 N
        • 객체지향의 사실과 오해
        • Good Code, Bad Code
        • 도메인 주도 개발 시작하기 N
      • 🔧 트러블 슈팅
      • Java
      • Spring
      • 운영체제
        • 공룡책 학습
      • 알고리즘
      • GIT
      • 면접 지식
      • Spring 단기심화 2기
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    객체지향의 사실과 오해
    객체
    코드트리
    specification
    타입
    도메인 주도 개발 시작하기
    책임
    인터페이스
    책임-주도 설계
    매핑 구현
    캡슐화
    오블완
    메시지
    good code bad code
    티스토리챌린지
    리포지터리
    애그리거트 루트
    코딩트리조별과제
    도메인 모델
    애그리거트
    유스케이스
    역할
    협력
    DIP
    모듈화
    가독성
    코딩테스트
    표현 영역
    코드 계약
    추상화
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
l'avenirJun
[Boj16926] 배열 돌리기 1
상단으로

티스토리툴바