해리의 데브로그

Udemy Laravel 01 - Get Started

|

1. Get Started

1.1 XAMPP 설치

XAMPP 설치 & XAMPP Control Panel 실행.

  • Apache - Config - Apach (httpd.config) 설정으로 들어가 Post 넘버 변경(Listen 3000 & ServerName localhost:3000)
  • 마찬가지로 Apach (httpd-ssl.config) 설정으로 들어가 변경(Listen 1443, <VirtualHost _default_:1443>, ServerName www.example.com:1443)
  • Config로 들어가 service settings에 Port 넘버 최종 변경(3000, 1443)

Apache 뿐만 아니라 MySQL 등에서 포트넘버 충돌로 에러가 발생한다면 Unique한 포트넘버로 수정하도록 하자.

http://localhost:3000/ 으로 접속하여 XAMPP 확인

1.2 composer

policy(Dependency) maanger for PHP. 패키지간의 의존성을 관리도구이다. 필요한 확장 기능을 쉽게 설치해주는 기능도 제공하지만, 프로젝트에서 필요한 확장 기능을 통합해서 관리해주는 도구(npm, pip 같은 친구)

Download로 들어가 composer를 설치해주도록 하자. 설치 이후, cmd에서 composer을 입력하면 composer에 대한 설명을 볼 수 있음.

1.3 Laravel Project 생성

  • /c/xampp/htdocs 으로 이동
  • composer create-project laravel/laravel 프로젝트명 라라벨버젼
  • 에러 발생시 composer install --no-scripts > composer install

브라우저에서 url 주소의 끝에 .dev로 입력했을 경우 에러가 발생하다면 .test로 변경해서 입력할 것

1.4 Virtual Hosts

<http://localhost:3000/cms/> 으로 입력하면 라라벨 기본 프로젝트를 확인할 수 있음. 편의성을 위해 url주소를 변경할 수 있음. modifier이나 virtual host를 아파치 서버에 설치해야함.

  • C:\xampp\apache\conf\extra\httpd-vhosts.conf 실행. 아래와 같이 virtual Host를 설정할 수 있음.
<VirtualHost *:3000>
	DocumentRoot "C:/xampp/htdocs"
	ServerName localhost
</VirtualHost>

<VirtualHost *:3000>
	DocumentRoot "C:/xampp/htdocs/cms"
	ServerName cms.test
</VirtualHost>
  • C:\Windows\System32\drivers\etc\hosts을 관리자 권한으로 실행후 아래 코드 삽입
127.0.0.1       localhost
127.0.0.1       cms.test
  • <http://cms.test:3000/> 으로 접속 가능

(삼성 SW 기출) 백준 16234 - 인구 이동

|

문제

  • [삼성 SW 역량 테스트 기출 문제] 백준 16234 - 인구 이동
  • 문제링크

나의 코드

  • 하루(반복문 전체 탐색)를 기준으로 인구이동 횟수를 계산해야 하는데, 연합이 발생할 때마다 인구이동 횟수를 카운팅하는 방식으로 코드를 처음 짰었다.
  • 이 방법으로 나머지 샘플 TC는 괜찮았는데, 4번째 TC 결과값이 3이 아닌 4가 계속 나와 디버깅을 하다보니 생각보다 많은 시간이 허비되었다. 결국은 코드를 다 엎고 다시 작성하였음.
  • union_lst에는 각 연합에 대한 배열(union_sub_lst)들을 저장시켰으며, union_sub_lst에는 연합에 소속되는 좌표값을 저장시켰음.
  • MyMap 내 정보 업데이트는 전체 탐색이 끝난 후에 일괄적으로 진행하였음.
  • 연합이 발생하지 않을 경우 visited 배열내 값을 -1으로 저장시켜으며, visited 배열이 전부 -1인 경우에 while 문 break 조건을 걸었음.
  • while문이 한번 돌 때마다 cnt값을 1씩 증가시켰다!
#종료 조건
def Check():
    global N
    for y in range(N):
        for x in range(N):
            # visited 배열에 -1이 아닌 값이 있는경우는 False 반환
            if visited[y][x] != -1: return False
    #visited 배열이 전부 -1인경우, True 반환
    return True

def IsSafe(y,x):
    return 0<=y<N and 0<=x<N


def BFS(init_y, init_x):
    global L, R

    Q = []
    #연합을 넣을 배열 선언
    union_sub_lst = []
    visited[init_y][init_x] = 1
    Q.append([init_y, init_x])
    union_sub_lst.append([init_y, init_x])

    while Q:
        y, x = Q.pop(0)
        for dir in range(4):
            n_y = y + dy[dir]
            n_x = x + dx[dir]
            #맵을 벗어나지않고, 연합 조건을 만족시키며, 방문하지 않은 칸인 경우
            if IsSafe(n_y, n_x) and L <= abs(MyMap[y][x] - MyMap[n_y][n_x]) <= R and visited[n_y][n_x] <= 0:
                visited[n_y][n_x] = 1
                Q.append([n_y, n_x]) #Queue에 append
                union_sub_lst.append([n_y, n_x]) #연합 배열에 추가

    # 연합 배열의 길이가 1 => 어디로도 이동하지 못한 경우
    if len(union_sub_lst) == 1:
        visited[init_y][init_x] = -1 #visited를 -1으로 선언
        return
    #그렇지 않은 경우는 전체 연합 배열에 현재의 연합배열을 append
    union_lst.append(union_sub_lst)


N, L, R = map(int, input().split())
MyMap = [list(map(int, input().split())) for _ in range(N)]

#상, 하, 좌, 우
dy = [-1, 1, 0, 0]
dx = [0, 0, -1, 1]


cnt = 0
while True:
    visited = [[0] * N for _ in range(N)]
    #연합 "들(복수형)" 을 넣을 배열 선언
    union_lst = []
    for y in range(N):
        for x in range(N):
            if visited[y][x] <= 0:
                BFS(y, x)

    #완탐이 끝난 이후, MyMap 값 업데이트. union_lst 내에는 각 하위 연합에 대한 배열이 존재함
    if union_lst:
        #하위 연합 배열에 대한 반복문
        for i in range(len(union_lst)):
            #하위 연합 길이
            MyLen = len(union_lst[i])
            #하위 연합의 총 합 계산
            MySum = 0
            for j in union_lst[i]:
                MySum += MyMap[j[0]][j[1]]
                visited[j[0]][j[1]] = 1

            #하위 연합별 평균값을 구한 후, MyMap내 값 업데이트
            avg = int(MySum // MyLen)
            for j in union_lst[i]:
                MyMap[j[0]][j[1]] = avg

    #반복문 종료 조건. visited 배열이 전부 -1 인 경우(더이상 연합 생성 불가) while문 종료
    if Check():
        break
    cnt += 1

print(cnt)

(삼성 SW 기출) 백준 3190 - 뱀

|

문제

  • [삼성 SW 역량 테스트 기출 문제] 백준 3190 - 뱀
  • 문제링크

나의 코드

  • 기본적으로 델타 배열을 사용하되, 방향 전환이 요구 될 때, 변경되는 방향의 인덱스 값을 direction 배열에 저장시켜서 사용하였음 (왼쪽, 오른쪽 방향 순서로 배열에 저장)
  • 시간 별 방향 전환 정보는 Time_Table을 최대 크기로 선언하여 시간을 인덱스로 기준삼아 방향 전환 정보를 갖고 옴.
  • 뱀의 크기 및 이동 유무는 snack 배열을 토대로 pop 과 append를 적절히 사용하여 구현하였음.
# 종료 조건
def Check(y,x):
    # 맵 밖을 벗어나거나, 자기자신의 몸과 부딪히는 경우
    if y < 0  or y >= N or x < 0 or x >= N or MyMap[y][x] == 1:
        return True
    return False

N = int(input())
K = int(input())
MyMap = [[0]*N for _ in range(N)]

for i in range(K):
    y,x = map(int, input().split())
    MyMap[y-1][x-1] = 2
MyMap[0][0] = 1

L = int(input())
Time_Table = [-1] * 10000
for _ in range(L):
    idx, turn = input().split()
    idx = int(idx)
    if turn == 'L': turn = 0
    else: turn = 1
    Time_Table[idx] = turn

# 상 하 좌 우
dy = [-1, 1, 0, 0]
dx = [0, 0, -1, 1]

# 상 -> L:좌 / D: 우
# 하 -> L:우 / D: 좌
# 좌 -> L:하 / D: 상
# 우 -> L:상 / D: 하
direction = [[2, 3], [3, 2], [1, 0], [0, 1]]

current_dir_idx, time, y, x = 3, 0, 0, 0
snack = [[0,0]]
# 꼬리~머리 순서

while True:

    time += 1
    n_y = y + dy[current_dir_idx]
    n_x = x + dx[current_dir_idx]

    # 종료 조건 검증
    if Check(n_y, n_x):
        break

    # 사과가 있는 경우 => 꼬리 위치 불변 & 사과 좌표 값을 뱀으로 변경(좌표 추가)
    if MyMap[n_y][n_x] == 2:
        MyMap[n_y][n_x] = 1
        snack.append([n_y, n_x])

    # 사과가 없는 경우 => 꼬리 좌표 제거 & 이동한 좌표 추가
    elif MyMap[n_y][n_x] == 0:
        MyMap[n_y][n_x] = 1
        snack.append([n_y, n_x])
        delete_y, delete_x = snack.pop(0)
        MyMap[delete_y][delete_x] = 0
    # 시간 증가, 기준 좌표값 업데이트

    y, x = n_y, n_x

    # 시간이 끝난 후, 방향 전환 검증 & 방향 전환
    if Time_Table[time] != -1:
        current_dir_idx = direction[current_dir_idx][Time_Table[time]]

print(time)

(SW 문제해결 응용 구현 - 그래프) SWEA 5248 - 그룹 나누기

|

문제

  • SWEA 5248 - [파이썬 S/W 문제해결 구현 6일차] 그래프의 기본과 탐색 - 그룹 나누기
  • 문제링크
  • 문제의 저작권은 SW Expert Academy에 있습니다.

나의 코드

def Find_Set(x):
    if x == Parent[x]:
        return x
    else:
        return Find_Set(Parent[x])

def Union(x,y):
    Parent[Find_Set(y)] = Find_Set(x)

TC = int(input())
for tc in range(1, TC+1):
    N, M = map(int, input().split())
    Parent = [0]*(N+1)

    for i in range(1, N+1):
        Parent[i] = i

    Init_Data = list(map(int, input().split()))
    for i in range(M):
        start = Init_Data[2*i]
        end = Init_Data[2*i+1]
        Union(start, end)

    # print(Parent)

    result = []
    for i in range(len(Parent)):
        result.append(Find_Set(i))

    print('#%d %d'%(tc, len(set(result))-1))

(SW 문제해결 응용 구현 - 그래프) SWEA 5247 - 연산

|

문제

  • SWEA 5247 - [파이썬 S/W 문제해결 구현 6일차] 그래프의 기본과 탐색 - 연산
  • 문제링크
  • 문제의 저작권은 SW Expert Academy에 있습니다.

나의 코드

from collections import deque

def BFS():
    global start_num, end_num, result, tc
    while Q:
        num, cnt = Q.popleft()
        if num == end_num:
            result = cnt
            return

        for i in range(4):
            num2 = 0
            if i == 0:
                num2 = num + 1
                if 0 < num2 <= 1000000 and num_lst[num2] != tc:
                    Q.append((num2, cnt+1))
                    num_lst[num2] = tc

            elif i == 1:
                num2 = num - 1
                if 0 < num2 <= 1000000 and num_lst[num2] != tc:
                    Q.append((num2, cnt+1))
                    num_lst[num2] = tc

            elif i == 2:
                num2 = num*2
                if 0 < num2 <= 1000000 and num_lst[num2] != tc:
                    Q.append((num2, cnt+1))
                    num_lst[num2] = tc

            elif i == 3:
                num2 = num - 10
                if 0 < num2 <= 1000000 and num_lst[num2] != tc:
                    Q.append((num2, cnt+1))
                    num_lst[num2] = tc

TC = int(input())
num_lst = [0] * 1000001
for tc in range(1, TC+1):
    start_num, end_num = map(int, input().split())
    Q = deque()
    Q.append((start_num, 0))
    num_lst[start_num] = tc
    result = 0
    BFS()
    print('#%d %d'%(tc, result))