13458번: 시험 감독

첫째 줄에 시험장의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 각 시험장에 있는 응시자의 수 Ai (1 ≤ Ai ≤ 1,000,000)가 주어진다. 셋째 줄에는 B와 C가 주어진다. (1 ≤ B, C ≤ 1,000,000)

www.acmicpc.net

 

<내 코드>

 

N = int(input())
nums = list(map(int, input().split()))
B, C = map(int, input().split())
result = 0

nums = [nums[i]-B for i in range(N)]
result += N

for n in nums:
    if n > 0:
        result += (n // C)
        if n % C != 0:
            result += 1


print(result)
반응형

 

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어

www.acmicpc.net

 

<내 코드>

 

import collections

# 북, 동, 남, 서
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]


def change(d):
    if d == 0:  # 북 -> 서
        return 3
    elif d == 1:  # 동 -> 북
        return 0
    elif d == 2:  # 남 -> 동
        return 1
    elif d == 3:  # 서 -> 동
        return 2


def search(x, y, d):
    cnt = 1
    q = collections.deque([[x, y, d]])
    route[x][y] = 2

    while q:
        x, y, d = q.popleft()
        nd = d

        for i in range(4):
            # 왼쪽 영역 탐색
            nd = change(nd)
            nx = x + dx[nd]
            ny = y + dy[nd]

            # a
            if 0 <= nx < N and 0 <= ny < M and route[nx][ny] == 0:
                cnt += 1
                route[nx][ny] = 2
                q.append([nx, ny, nd])
                break
            # c
            elif i == 3:

                if d == 0:
                    x += 1
                elif d == 1:
                    y -= 1
                elif d == 2:
                    x -= 1
                elif d == 3:
                    y += 1
                q.append([x, y, d])
                # d
                if route[x][y] == 1:
                    return cnt


N, M = map(int, input().split())
r, c, d = map(int, input().split())

route = [list(map(int, input().split())) for _ in range(N)]
print(search(r, c, d))

 

  • 방향을 북, 동, 남, 서 방향으로 바꿔줘야 한다

  • 벽인지, 빈칸인지를 잘 구별해주어야 한다

  • 후진을 할 방향을 잘 선택해주면 된다

 

 

반응형

 

 

14502번: 연구소

인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크�

www.acmicpc.net

 

 

<내 코드>

 

import copy

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

answer = 0

def bfs():
    global answer
    v = copy.deepcopy(virus)  # 원본 유지한채 복사(바이러스 좌표값)
    tmp = [[0]*M for _ in range(N)]
    # 지도 복사
    for i in range(N):
        for j in range(M):
            tmp[i][j] = maps[i][j]

    # 4방향 탐색 후 바이러스 감염
    while len(v) != 0:
        vir = v.pop()
        vir_x = vir[0]
        vir_y = vir[1]

        for k in range(4):
            nx = vir_x + dx[k]
            ny = vir_y + dy[k]
            if 0 <= nx < N and 0 <= ny < M:
                if tmp[nx][ny] == 0:
                    tmp[nx][ny] = 2
                    v.append([nx, ny])
    # 0(안전구역) 갯수 파악
    result = 0
    for i in tmp:
        for j in i:
            if j == 0:
                result += 1

    answer = max(result, answer)

# 벽 3개를 세우는 모든 경우의 수
def wall(cnt):
    if cnt == 3:
        bfs()
        return

    for i in range(N):
        for j in range(M):
            if maps[i][j] == 0:
                maps[i][j] = 1
                wall(cnt+1)
                maps[i][j] = 0
                
N, M = map(int, input().split())
maps = [list(map(int, input().split())) for _ in range(N)]

virus = []

# 바이러스 좌표값 저장
for i in range(N):
    for j in range(M):
        if maps[i][j] == 2:
            virus.append([i, j])
wall(0)
print(answer)

 

벽 3개를 세우는 방법을 알지 못해 다른 사람들의 코드를 참고했다. 여기서 입력의 크기가 크지 않기 때문에 브루트포스를 사용해 벽3개를 세우는 경우의 수를 다 구했다. 모든 경우의 수를 구하는 코드를 이해하는데 쉽지 않았다..

앞으로 자주 사용될 것 같다.

반응형

 

 

14499번: 주사위 굴리기

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지도

www.acmicpc.net

 

<내 코드>

 

N, M, x, y, K = map(int, input().split())
maps = [list(map(int, input().split())) for _ in range(N)]
op = list(map(int, input().split()))
dice = [0]*7

# 항상 주사위 6번면이 위에 오도록 설정
def move(op):
    if op == 1:
        dice[1], dice[3], dice[4], dice[6] = dice[3], dice[6], dice[1], dice[4]
    elif op == 2:
        dice[1], dice[3], dice[4], dice[6] = dice[4], dice[1], dice[6], dice[3]
    elif op == 3:
        dice[1], dice[2], dice[5], dice[6] = dice[2], dice[6], dice[1], dice[5]
    elif op == 4:
        dice[1], dice[2], dice[5], dice[6] = dice[5], dice[1], dice[6], dice[2]

# 명령에 따라 지도에서 주사위 이동
def direction(op):
    if op == 1:
        return (0, 1)
    elif op == 2:
        return (0, -1)
    elif op == 3:
        return (-1, 0)
    elif op == 4:
        return (1, 0)


for i in op:
    row, col = direction(i)

    if 0 <= x+row < N and 0 <= y+col < M:
        x += row
        y += col
        move(i)
		# 해당 지도 좌표의 값이 0인지 판단
        if maps[x][y] != 0:
            # 바닥면이 지도의 값이 된다
            dice[1] = maps[x][y]
            maps[x][y] = 0
        else:
            # 지도의 값이 주사위 바닥면 값이 된다
            maps[x][y] = dice[1]
        print(dice[6])

 

특별한 알고리즘이 필요없는 문제다. 구현, 시뮬레이션 문제인데 이런 유형을 많이 풀어보지 않아 쉽지 않았다.

주사위 6번 면이 항상 위로 오도록 규칙을 정해 문제를 그대로 구현하면 되는 문제였다.

반응형

+ Recent posts