현재 kendoGrid를 통해서 reorder 기능을 사용하고 있습니다. 테이블을 reorderable 하게 변경하여 열의 순서를 변경할 수 있습니다. 하지만 순서를 변경한 다음 조회 버튼을 클릭하면 값들은 월래 순서를 찾아가지만 위 속성의 이름을 가르키는 곳은 그대로 있는 문제가 발생합니다. 해당 문제를 해결하기 위해서 empty 기능을 사용했습니다.

 

empty 기능을 해당 테이블을 clear 해주는 기능이 있습니다.

 

kendoGrid에 empty 기능을 사용하기 전 상태입니다. 조회 버튼을 클릭하면 아래 컬럼들은 변경되지만 이름은 변경되지 않는 문제가 있습니다.

kendoGrid에 empty를 사용한 후입니다. 조회 버튼을 클릭하면 컬럼의 순서를 변경하였어도 다시 월래대로 돌아오는 것을 확인할 수 있습니다.

 

empty는 아래와 같은 방식으로 사용할 수 있습니다.

$("#GridMain").empty();

 

n, m, k = map(int, input().split())
nums = list(map(int, input().split()))
result = 0
nums.sort(reverse = True)

for i in range(2,m+2):
    if (k+1)%i != 0 :
        result += nums[0]
    else :
        result += nums[1]

print(result)

위와 같은 방식으로 문제를 해결하였다. 

range의 시작값과 끝 값을 각각 2를 더해준 이유는 0,1은 값이 나누어 떨어져서 시작부터 작은값을 넣고 시작해서 값에 오차가 발생해버린다. 이제 정답을 보겠다.

n, m, k = map(int, input().split())
data = list(map(int, input().split()))

data.sort()
first = data[n - 1]
second = data[n - 2]

result = 0

while True:
    for i in range(k):
        if m == 0:
            break;
        result += first
        m -= 1
    if m == 0:
        break
    result += second
    m -= 1

위와같이 효율적으로 처리하는 것이 정답이다.

k번 for문을 통해 최고의 값만 더하고 한번은 2번째 값을 더하는 것이 핵심 원리이다.

kendogrid batch의 값을 true로 설정하면 update나 create 함수가 변화한 행의 개수만 큼 실행되던 것이 한번만 실행되고 받는 데이터는 배열 형식으로 받는 것을 확인하였다.

 

그래서 data에 접근할 때 for문을 돌리도록 변경하였다.

                create: function (e) {

                    var GridKey = "GridMain";
                    var RowStatus = "INSERT";

                    companyid = "<%=Session["LOGINCOMPANYID"]%>";
                    divisionid = "<%=Session["LOGINDIVISIONID"]%>";
                    createuserid = "<%=Session["LOGINUSERID"]%>";
                    modifyuserid = "<%=Session["LOGINUSERID"]%>";

                    for (let i = 0; i < e.data.models.length; i++) {
                        let item = e.data.models[i];
                        Main_param += "{ RowStatus: '" + RowStatus + "'";
                        Main_param += ", GROUPID: '" + item.GROUPID + "'";
                        Main_param += ", GROUPNAME: '" + item.GROUPNAME + "'";
                        Main_param += ", AUTHSEQUENCE: '" + item.AUTHSEQUENCE + "'";
                        Main_param += ", REMARK: '" + item.REMARK + "'";
                        Main_param += ", COMPANYID: '" + companyid + "'";
                        Main_param += ", DIVISIONID: '" + divisionid + "'";
                        Main_param += ", ISVALID: '" + item.ISVALID + "'";
                        Main_param += ", ISUSE: '" + item.ISUSE + "'";
                        Main_param += ", CREATEUSERID: '" + createuserid + "'";
                        Main_param += ", CREATETIME: 'CREATETIME'";
                        Main_param += ", MODIFYUSERID: '" + modifyuserid + "'";
                        Main_param += ", MODIFYTIME: 'MODIFYTIME'";
                        Main_param += ", LASTHISTORYKEY: 'LASTHISTORYKEY'";
                        Main_param += "},";
                    }    
                    e.success();
                }

'Today I Learned' 카테고리의 다른 글

kendogrid 한번에 update, create 하기  (0) 2021.12.16
KendoGrid empty  (0) 2021.12.15
음료수 얼려먹기 나의 답안  (0) 2021.12.09
kendogrid-isNew()  (0) 2021.12.09
이것이 코딩테스트이다 - 게임 개발  (0) 2021.12.08

해당 내용은 스프링 부트와 AWS로 혼자 구현하는 웹서비스 책 내용을 복습한 내용입니다.

 

API를 만들기 위해 총 3개의 클래스가 필요합니다.

* Request 데이터를 받을 Dto

* API 요청을 받을 Controller

* 트랜잭션, 도메인 기능 간의 순서를 보장하는 Service

tip ) service는 비지니스 로직을 처리하지 않습니다. 그 역할은 Domain이 실행합니다.

 

* Web Layer

  * 흔히 사용하는 컨트롤러(@Controller)와 JSP/Freemaker 등의 뷰 템플릿 영역입니다.

  * 이외에도 필터(@Filter), 인터셉터, 컨트롤러 어드바이스(@ControllerAdvice) 등 외부 요청과 응답에 대한 전반적인 영역을 이야기합니다.

 

* Service Layer

  * @Service에 사용되는 서비스 영역입니다.

  * 일반적으로 Controller와 Dao의 중간 영역에서 사용됩니다.

  * @Transactional이 사용되어야 하는 영역이기도 합니다.

 

* Repository Layer

  * Database와 같이 데이터 저장소에 접근하는 영역입니다.

  * 기존에 개발하셨던 분들이라면 Dao(Data Access Object) 영역으로 이해하시면 쉬울것입니다.

 

* Dtos

  * Dto(Data Transfer Object)는 계층간 데이터를 교환하기 위한 객체를 이야기하며 Dtos는 이들의 영역을 얘기합니다.

  * 예를 들어 뷰 템플릿 엔진에서 사용될 객체나 Repository Layer에서 결과로 넘겨준 객체 등이 이들을 이야기합니다.

 

* Domain Model

  * 도메인이라 불리는 개발 대상을 모든 사람이 동일한 관점에서 이해할 수 있고 공유할 수 있도록 단순화시킨 것을 도      메인 모델이라고 합니다.

 

  * 이를테면 택시 앱이라고 하면 배차, 탑승, 요금 등이 모두 도메인이 될 수 있습니다.

  * @Entity를 사용해보신 분들은 @Entity가 사용된 영역 역시 도메인 모델이라고 이해 해주시면 됩니다.

  * 다만, 무조건 데이터베이스의 테이블과 관계가 있어야만 하는 것은 아닙니다.

  * VO처럼 값 객체들도 이 영역에 해당하기 떄문입니다.

 

 

 

'스프링' 카테고리의 다른 글

@Entity  (0) 2022.02.01
spring boot 에서 google login을 사용해보았다.  (0) 2021.12.18
스프링 서버 단에서 데이터 처리하는 방식  (0) 2021.11.27
Auditing @CreatedDate @LastModifiedDate  (0) 2021.11.27
h2 console  (0) 2021.11.27

 

url이 달라서 발생한 오류였다.

오늘은 이것이 코딩테스트에서 미로 탈출 문제를 풀어보았다.

# This is a sample Python script.

# Press Shift+F10 to execute it or replace it with your code.
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.

from collections import deque

# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    # N, M을 공백으로 구분하여 입력받기
    n, m = map(int, input().split())
    # 2차원 리스트의 맵 정보 입력받기
    graph = []
    for i in range(n):
        graph.append(list(map(int ,input())))

    # 이동할 네 방향 정의(상, 하, 좌, 우)
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]

    # BFS 소스코드 구현
    def bfs(x, y):
        # 큐(Queue) 구현을 위해 deque 라이브러리 사용
        queue = deque()
        queue.append((x,y))
        # 큐가 빌 때까지 반복
        while queue:
            x, y = queue.popleft()
            # 현재 위치에서 네 방향으로의 위치 확인
            for i in range(4):
                nx = x + dx[i]
                ny = y + dy[i]
                # 미로 찾기 공간을 벗어난 경우 무시
                if nx < 0 or ny < 0 or nx >= n or ny >= m:
                    continue
                # 벽인 경우 무시
                if graph[nx][ny] == 0:
                    continue
                # 해당 노드를 처음 방문하는 경우에만 최단 거리 기록
                if graph[nx][ny] == 1:
                    graph[nx][ny] = graph[x][y] + 1
                    queue.append((nx,ny))
            # 가장 오른쪽 아래까지의 최단 거리 반환
        return graph[n - 1][m - 1]
        # BFS를 수행한 결과 출력
    print(bfs(0, 0))

해당 문제를 풀다가 pycharm을 깔고 실행해보기위해서 깔고 reboot를 실행했는데 이전에

pythontutor에서 풀던 문제를 날려버리는 바람에 나의 답안은 버리게 되었다. 하지만 해당 방식은 dfs 방식이였기 때문에 위 방식이 답안이기 때문에 올바른 방식이다. 위 방식으로 한번 풀어보니 놀랍도록 멋진 코드인거 같다. 

n, m = map(int, input().split())

ice =   [[0]*m for _ in range(n)]
visit = [[0]*m for _ in range(n)]
result = 0


def dfs(x, y):
    dirs = [(-1,0), (0, -1), (1, 0), (0, 1)]
    
    visit[y][x] = 1
    
    for dir in dirs:
        xd = x + dir[0]
        yd = y + dir[1]
        if xd>=0 and xd<m and yd >=0 and yd <n:
            if visit[yd][xd] == 0 and ice[yd][xd] == 0:
                dfs(xd, yd)

for i in range(n):
    str1 = input()
    for j in range(len(str1)):
        ice[i][j] = int(str1[j])

for i in range(n):
    for j in range(m):
        if ice[i][j] == 0 and visit[i][j] == 0:
            result += 1
            dfs(j, i)
            
print(result)

'Today I Learned' 카테고리의 다른 글

KendoGrid empty  (0) 2021.12.15
kendogrid batch  (0) 2021.12.14
kendogrid-isNew()  (0) 2021.12.09
이것이 코딩테스트이다 - 게임 개발  (0) 2021.12.08
깃 크라켓 사용해보기  (0) 2021.12.05

오늘은 테이블에 행을 추가 하는 것이 아니라면 아이디를 수정하지 못하게 막는 기능을 찾아봤습니다. 

일반적으로 특정 속성을 편집하지 못하게 막는 것은 간단하게 할 수 있지만 특정 상태에서는 가능하게 특정 상태에서는 불가능하게 하는 것은 조금 복잡한 문제였습니다. 인터넷을 잘 찾아보니 isNew()라는 함수가 눈에 띄었습니다. isNew는 테이블의 행의 상태가 create인지 edit인지 구별할 수 있는 기능을 제공합니다. 따라서 해당 함수를 사용해서 평소에는 ID 값을 편집하지 못하게 막고 행을 추가할 때만 아이디 값을 수정할 수 있게끔 했습니다.

 

isNew를 사용한 코드

edit function (e) { 
            console.log(EDIT, e.model, e.model.isNew(), e.model.id, e.model._defaultId);
            if (!e.model.isNew()) {
                if (e.container.find("input").attr("name") == "GROUPID") {
                    this.closeCell();
                }
          
        }

 

'Today I Learned' 카테고리의 다른 글

kendogrid batch  (0) 2021.12.14
음료수 얼려먹기 나의 답안  (0) 2021.12.09
이것이 코딩테스트이다 - 게임 개발  (0) 2021.12.08
깃 크라켓 사용해보기  (0) 2021.12.05
TIL JUNIT, MOCKITO  (0) 2021.12.01

https://stackoverflow.com/questions/63521181/java-file-outside-of-source-root-intellij

 

Java file outside of source root intelliJ

I have cloned a spring boot project from GitLab having multiple branches in IntelliJ. I checkout to the branch in which I want to work. But I am getting "Java file outside of source root"...

stackoverflow.com

해당 오류는 file > project structure > modules에서 파일 경로를 java 파일로 resources를 덮어쓰면 해결된다.

오늘아래와 같은 방식으로 문제를 해결하였다. 하나의 테스트케이스만으로 검증하여서 진짜 맞는 코드인지 분간하기가 어렵다. 

내가 푼 풀이

n, m = map(int, input().split())
x, y, dir = map(int, input().split())

visited = [[0]*m for _ in range(n)]
field1 = [[0]*m for _ in range(n)]
dirs = [(0, -1), (1, 0), (0, 1), (-1, 0)]
result = 1
visited[y][x] = 1

for i in range(n):
    list1 = list(map(int, input().split()))
    for j in range(len(list1)):
        if list1[j] == 1:
            field1[i][j] = 1
            
def dfs(x, y, d,time):
    global result
    d -= 1
    if d <0:
        d = 3
        
    xd = x + dirs[d][0]
    yd = y + dirs[d][1]
    
    if xd>=0 and xd <m and yd>=0 and yd<n:
        if visited[yd][xd] != 1 and field1[yd][xd] !=1:
            result +=1
            visited[yd][xd] = 1
            time = 0
            dfs(xd, yd, d, time)
        else : 
            if time >= 4:
                return
            else:
                dfs(x, y,d, time +1)        
    else:
        
        if time >= 4:
            return
        else:
            dfs(x, y,d, time +1)   
            
dfs(x, y, dir, 0)

정답

n , m = map(int, input().split())

d = [[0] * m for _ in range(n)]
x, y, direction = map(int, input().split())
d[x][y] = 1

array = []
for i in range(n):
    array.append(list(map(int, input().split())))
    
dx = [-1, 0, 1, 0]
dy = [0, 1, 0 ,-1]

def turn_left():
    global direction
    direction -= 1
    if direction == -1:
        direction = 3
        
count = 1
turn_time = 0
while True:
    turn_left()
    nx = x + dx[direction]
    ny = y + dy[direction]
    if d[nx][ny] == 0 and array[nx][ny] == 0:
        d[nx][ny] = 1
        x = nx
        y = ny
        count += 1
        turn_time = 0
        continue 
    else:
        turn_time += 1
    if turn_time == 4:
        nx = x - dx[direction]
        ny = y - dy[direction]
        if array[nx][ny] == 0:
            x = nx
            y = ny
        else:
            break
        turn_time = 0
print(count)

'Today I Learned' 카테고리의 다른 글

kendogrid batch  (0) 2021.12.14
음료수 얼려먹기 나의 답안  (0) 2021.12.09
kendogrid-isNew()  (0) 2021.12.09
깃 크라켓 사용해보기  (0) 2021.12.05
TIL JUNIT, MOCKITO  (0) 2021.12.01

+ Recent posts