본문 바로가기
PS/코드트리

[코드트리 챌린지] 1주차 - Simulation (1)

by 행복한라이언 2023. 9. 7.
728x90
반응형

★ 핵심 : 방향 관련 Simulation

  1. 유형 : 방향 회전을 위한 dx, dy 정의 방법
  2. 현재 바라보는 방향(cur_dir) 변수 선언 & 동(0) 남(1) 서(2) 북(3) 로 설정하기
  3. 시계방향 90도 회전 cur_dir = (cur_dir + 1) % 4
  4. 반시계방향 90도 회전 cur_dir = (cur_dir -1 + 4) % 4
  5. 180도 회전 cur_dir = (cur_dir + 2) % 4 

1.  좌표

# 동(0)남(1)서(2)북(3)
dx = [1, 0, -1, 0]
dy = [0, -1, 0, 1]
# 현재 바라보는 상태 북쪽
cur_dir = 3
# 시계방향 90 회전
cur_dir = (cur_dir + 1) % 4
# 반시계방향 90 회전
cur_dir = (cur_dir - 1 + 4) % 4
# 방향으로 1칸 전진
nr = cr + dr[cur_dir]
nc = cc + dc[cur_dir]

    //초기값
    public static int x = 0, y = 0;
    public static int curDir = 3;

    //좌표계 - 동남서북
    public static int[] dx = new int[]{1, 0, -1, 0};
    public static int[] dy = new int[]{0, -1, 0, 1};
    // 반시계
    public static void moveLeft(char dir){
        curDir = (curDir -1 + 4) % 4;
    }
    //시계
    public static void moveRight(char dir){
        curDir = (curDir + 1) % 4;
    }
    //전진
    public static void moveFront(){
        x += dx[curDir];
        y += dy[curDir];
    }

2. 격자 

# 격자에서는 x, y 보다는 r, c가 이해하기 쉽다.
# 동쪽으로 이동! 열 증가 / 서쪽으로 이동! 열 감소
# 북쪽으로 이동! 행 감소 / 남쪽으로 이동! 행 증가

# 동(0)남(1)서(2)북(3)
drs = [0, 1, 0, -1]
dcs = [1, 0, -1, 0]

# 초기값
cr, cc = 0, 0
# 상하좌우 
for dr, dc  in zip(drs, dcs):
    print(dr, dc)
    nr = cr + dr
    nc = cc + dc
    
# 격자 내에 있는지 체크(n x n 배열)
def check(r, c):
	return 0 <= r < n and 0 <= c < n

◇ [기본문제] 1이 3개 이상 있는 위치

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

# 시간복잡도 O(100 * 100 * 4) = O(N^2)
# 브루트포스

n = int(input())
board = [list(map(int, input().split())) for _ in range(n)]
# 동(0)남(1)서(2)북(3)
drs = [0, 1, 0, -1]
dcs = [1, 0, -1, 0]

def in_range(r, c):
    return 0 <= r < n and 0 <= c < n


def check(cr, cc):
    cnt = 0
    for dr, dc in zip(drs, dcs):
        nr = cr + dr
        nc = cc + dc
        if in_range(nr, nc) and board[nr][nc] == 1:
            cnt += 1
    if cnt >= 3:
        return 1
    return 0


res = 0
for cr in range(n):
    for cc in range(n):
        res += check(cr, cc)

print(res)

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

public class Main {
    private static final int MAX_N = 100;
    private static final int DIR_NUM = 4;
    // 이동 - 동남서북
    private static int[] dr = new int[]{0, 1,  0, -1};
    private static int[] dc = new int[]{1, 0, -1,  0};
    // 2차원 배열 생성 및 배열의 크기
    private static int n;
    private static int[][] arr = new int[MAX_N][MAX_N];
    //in_range 체크
    private static boolean inRange(int r, int c){
        return (0 <= r && r < n) && (0 <= c && c < n);
    }
    //근접 1 체크
    private static int check(int cr, int cc){
        int cnt = 0;
        for(int i = 0; i < DIR_NUM; i++){
            int nr = cr + dr[i];
            int nc = cc + dc[i];
            if(inRange(nr, nc) && arr[nr][nc] == 1)
                cnt++;
        }
    if(cnt >= 3)
        return 1;
    return 0;
    }
    
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        n = Integer.parseInt(st.nextToken());
        for(int i = 0; i < n; i++){
            st = new StringTokenizer(br.readLine());
            for(int j =0; j < n; j++){
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        int ans = 0;
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                ans += check(i, j);
                }
            }
        System.out.print(ans);
    }
}

※ 실력진단


◎ 관련 문제

더보기

 

728x90
반응형