반응형

 

 

오늘의 목표

프로그래머스 문제 3문제 정도 풀어보기!

 

프로그래머스 - 완주하지 못한 선수 문제풀이 를 풀어보았다.

 

 

set이라는 자료형을 사용하면 차집합을 낼 수 있기 때문에

결과 = list(set(input1) - set(input2))

* 형태로 풀어주려고 했다가 동명이인일 경우 set에서 하나만 남기고 제거해버리기 때문에

동명이인인 경우를 다시 생각해주었다.

 

다 풀고 나서 알게된 사실은

위의 *동명이인의 경우에는 Counter 자료형을 통해 풀어줄 수 있다고 한다.(Set 대신 Counter 사용)

 

def solution(participant, completion):
    
    # 미완주자가 동명이인이 아닐 경우, 차집합으로 생각하기
    complement = list(set(participant) - set(completion))
    
    if len(complement) != 0:
        return complement[0]
    
    # 동명이인일 경우, 정렬하여 다른 시점에서 반환해주기(미완주자 1명이므로)
    participant = sorted(participant)
    completion = sorted(completion)
    
    for i in range(len(participant)):
        if participant[i] != completion[i]:
            return participant[i]
    
    answer = ''
    return answer

 

나와 같은 방법으로 푸는 사람들도 많이 있었고,

Counter와, zip 이라는 클래스, 명령어를 사용해서 푸는 사람들도 있었다.(하단의 링크 참조)

 

https://programmers.co.kr/learn/courses/30/lessons/42576/solution_groups?language=python3

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

P.S 혹시 코딩테스트 준비가 어려우신 분들은 저의 알고리즘 강의를 참고해주시기 바랍니다!!ㅎㅎ

 

https://www.youtube.com/channel/UCYYao-BSPaetw7N2GFFJ-Yw?view_as=subscriber

 

Henry Joo

 

www.youtube.com

 

반응형
반응형

안녕하세요

제가 최근에 티스토리 블로그를 꾸미는 중이여서

다양한 디자인을 시도해보았는데요

 

특별히 

 

아래 블로그를 너무 깔끔하다고 생각해서

벤치마킹해서 따라해보다가

https://life-with-coding.tistory.com/

나다움

life-with-coding.tistory.com

 

메뉴 대신에 > 카테고리를 사용하신 것 같아서

그 방법을 고민해보았고, 방법을 설명드리도록 하겠습니다.

 

 

1) 메뉴 창이 아닌 카테고리 창 띄우기!

 

1-1. 티스토리 변경화면에서 꾸미기 > 스킨 편집으로 들어갑니다.

 

 

 

 

1-2. HTML 편집 버튼을 클릭합니다.

 

 

 

 

1-3. html을 수정해준다. 

 

Ctrl + F 키를 눌러서 "gnb" 라는 키워드를 검색합니다.

 

그리고 다음과 같이 blog_menu 라고 되어있는 부분을 category_list로 고쳐줍니다.

 

 

 

변경 전

 

 

 

변경 후

 

 

* 대신 티스토리 관리 화면에서 자신만의 카테고리를 만들어주어야 합니다.

 

 

 

 

 

 

2) 분류 전체보기 삭제해준다.(CSS 화면으로 넘어간다.)

 

 

 

 

 

2-1. 동일하게 Ctrl + F 키를 눌러서 "gnb"를 찾아준다.

 

2-2. gnb에 대한 내용이 끝나는 부분에 아래 코드를 붙여준다.

#gnb > ul.tt_category > li a.link_tit{display:none;}

 

그러면 분류 전체보기가 사라진다.

 

 

아래와 같이 어느정도 완성이 된다.

 

 

 

 

이렇게 특정 티스토리를 보면서 벤치마킹해나가다보면

어느정도 예쁜 블로그를 만들어낼 수 있을 것이다.

 

 

출처: 해당 사이트를 참고하여 따라해보았습니다.

https://life-with-coding.tistory.com/

나다움

life-with-coding.tistory.com

 

 

 

반응형
반응형

워크플로우는 아래와 같다.

 

1. 일단 web-mvc 의존성이 있어야 함

 

2. WebController.java 만든다. => 기본적인 RequestMapping 잘 되는지 / 찍어봄

package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class WebController {
	@RequestMapping("/")
	@ResponseBody
	public String home() {
		return "helloHome";
	}
}

 

3. application.properties에 뷰에 관련된 설정을 추가하자.

spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp

 

4. build.gradle 파일에 jsp관련된 패키지를 추가한다. (빨간부분 추가)

compile('org.apache.tomcat.embed:tomcat-embed-jasper')
compile('javax.servlet:jstl:1.2')

 

5. WebController.java에 결과페이지를 jsp페이지로 호출하는 맵핑 method를 생성하자

package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class WebController {
	@RequestMapping("/")
	@ResponseBody
	public String home() {
		return "helloHome";
	}
    
    
	
    /* 여기~~~~~~~ */
	@RequestMapping("/jsp")
	public String jspPage(Model model) {
		model.addAttribute("name", "hello springBoot1234");
		return "hello";
	}
    /* ~~~~~~~~~~ */
    
    
    
}

 

6. 마지막으로 main 폴더 및에 /webapp/WEB-INF/jsp 폴더를 만들고 hello.jsp 파일을 생성한 후 아래와 같이 작성한다. 

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

${name }

</body>

</html>

 

7. 다시 스프링부트를 구동시키고 잘 나오는지 확인한다. 

 

## 만약 안된다면,

2가지로 나뉠 수 있는데

 

1. 위의 3번 과정을 추가하고, gradle refresh를 해주지 않으면 적용이 안된 상태일 거다.

 

2. thymeleaf랑 같이 쓰면 경로를 못찾는 문제가 발생한다.

아래 spring.thymeleaf.enabled=false로 적용 해제시켜주면 잘 될 것이다.(안되면 gradle refresh 문제)

 

 

참고: https://cpdev.tistory.com/23 [하루하나]

반응형

'IT' 카테고리의 다른 글

알고리즘 정리 - "완전탐색"  (0) 2020.08.27
티스토리 스킨 꾸미기  (0) 2020.08.21
spring boot 웹사이트 to cloud(ubuntu)  (0) 2020.07.14
flask kill 하는 방법  (0) 2020.05.14
python - flask 웹 서버 구축하기  (0) 2020.05.05
반응형

전체적인 플로우

 

가장 기본코드

 

 

1. 내 로컬 pc에서 spring boot 프로젝트를 만든다(배포 도구는 gradle 3.x 버전 사용)

 

2. git server 에 private으로 저장소에 올린다.

 

3. ncloud에서 인스턴스 하나 내려받는다.(인바운드 규칙 포트 열어줌)

 

4. ssh 접속 도구를 사용하여 인스턴스에 접속한다.

 

5. git 저장소에 있는거 clone

$ git clone {복사한 URL}

 

6. 사용할 패키지 다운로드

$ sudo apt-get update
$ sudo apt-get install mysql-server
$ sudo apt-get install openjdk-8-jdk

 

7. gragle을 사용하여 빌드한다

$ sudo chmod 777 ./gradlew
$ sudo ./gradlew build

(빌드가 되고 나면 root/{프로젝트}/build/libs 안에 .jar파일이 생기게 된다. 위의 경로로 아래의 명령어를 통해서 실행시킬 수 있다.)

 

8. 서버용으로 사용하려면 nohup 명령어를 통해 세션을 유지해줄 수 있다.

$ nohup java -jar ${해당 .jar파일} &

## nohup 종료방법 ##
1. “ps -ef | grep 쉘스크립트파일명” 명령으로 데몬형식으로 실행
2. "kill -9 PID번호“ 명령으로 해당 프로세스 종료

 

 

반응형

'IT' 카테고리의 다른 글

티스토리 스킨 꾸미기  (0) 2020.08.21
spring boot 에서 jsp 화면 띄우기  (2) 2020.07.14
flask kill 하는 방법  (0) 2020.05.14
python - flask 웹 서버 구축하기  (0) 2020.05.05
Jython 사용방법  (0) 2020.05.05
반응형

 

맨 아래 코드에 정답 나와있습니다.

 

 

==============아래 코드들은 성공하기까지의 과정 =============

처음 봤을때, 문제가 이해가 잘 안되는 것이 가장 큰 문제!

 

그래도 해석해서 처음 푼 풀이방법

정확도: 40%ㅜㅜ

 

# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")

def solution(A):
    # write your code in Python 3.6
    
    #print(A)
    
    if len(A) <= 2:
        return 0
    
    pre_peak_idx = 0
    current_peak_num = 0
    result_peak_num = 0
    peak_idx_arr = []
    
    for i in range(1,len(A)-1):
        #print(peak_idx_arr)
        # 만약 피크라면
        if A[i-1] < A[i] and A[i+1] < A[i]:
            # 최초 피크라면
            if current_peak_num == 0:
                current_peak_num += 1
                peak_idx_arr.append(i)
            # 피크가 2개 이상이라면
            else:
                # 조건에 부합하는지
                peak_idx_arr.append(i)
                for j in range(len(peak_idx_arr)-1,0,-1):
                    if abs(peak_idx_arr[j]-peak_idx_arr[j-1]) < (current_peak_num+1):
                        del peak_idx_arr[j-1]
                        break
                        
                if len(peak_idx_arr) == current_peak_num:
                    continue
                else:
                    current_peak_num += 1
                    
            
    #print(peak_idx_arr)
    
    
    return len(peak_idx_arr)
                    
            
            
    pass

 

다시 풀어봐야겠다..!! 화이팅!

 

 

다시 풀어보았다

 

정확도: 66% (peak의 개수가 많아지는 상태에서는 다수의 Timeout 에러 발생)

 

- 코드 -

# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")

def solution(A):
    # write your code in Python 3.6
    
    if len(A) < 2:
        return 0
    
    peak_arr = []
    
    for i in range(1,len(A)-1):
        # 피크라면
        if A[i-1] < A[i] and A[i+1] < A[i]:
            peak_arr.append(i)
            
    #print(peak_arr)
    
    length_peak_arr = len(peak_arr)
    
    if len(peak_arr) == 0:
        return 0
    
    for j in range(len(peak_arr),0,-1):
        current_index = 0
        num_of_peak = 1
        
        for i in range(1,len(peak_arr)):
            if abs(peak_arr[i] - peak_arr[current_index]) < j:
                continue
            else:
                num_of_peak += 1
                current_index = i
            
            if num_of_peak == j:
                return j
            
            
    return num_of_peak
    
    
    pass

 

 

이중 for문은 역시 안좋다

 

대충 감을 잡은 거 같다.

다시 풀어봐야겠다!!

 

 

 

임시 저장 코드

 

# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")

def solution(A):
    # write your code in Python 3.6
    
    if len(A) < 2:
        return 0
    
    num_peaks = 0
    peak_arr = []
    
    for i in range(1, len(A)-1):
        # 피크인 경우
        if A[i-1] < A[i] and A[i+1] < A[i]:
            peak_arr.append(i)
    
    print(peak_arr)
    
    if len(peak_arr) == 0:
        return 0
    
    if len(peak_arr) == 1:
        return 1
    
    peak_cnt_ = 1
    peak_num_ = 1
    
    for j in range(len(peak_arr),1,-1):
        
        for i in range(len(peak_arr)):
            
            if peak_arr[i] >= peak_j*j:
                peak_num_ += 1
                peak_cnt_ += 1
            
            if peak_arr[i] >= peak_arr[0]+j*peak_cnt_:
                peak_num_ += 1
                peak_cnt_ += 1
            if peak_num_ == j:
                return peak_num_
           
    
    pass

 

 

7월6일 재도전

 

# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")

def solution(A):
    # write your code in Python 3.6
    
    if len(A) <= 2:
        return 0
    
    peaks = []
    
    for i in range(1,len(A)-1):
        if A[i-1] < A[i] and A[i+1] < A[i]:
            peaks.append(i+1)
            
    if len(peaks) == 1:
        return 1
        
    if len(peaks) == 0:
        return 0
    

    num = len(peaks)
    
    try:
        for i in range(1,num):
            j = 1
            if len(peaks) < i+1:
                break
            while j < i+1:
                if peaks[j] >= peaks[j-1]+(i+1):
                    j += 1
                else:
                    del peaks[j]
    except:
        return len(peaks)
        
    return len(peaks)
            
            
    
            
            
            
            
            


 

 

====================================================================================

 

잠깐 코딩을 쉬었다가 다시 시작한다.

8.12일

 

 

 

66%의 코드(다수의 Time error 발생)

 

# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")

def solution(A):
    # write your code in Python 3.6
    
    peak_arr = []
    
    for i in range(1,len(A)-1):
        if A[i] > A[i-1] and A[i] > A[i+1]:
            peak_arr.append(i)
            
    print(peak_arr)
    
    result_peak_num = 0
    
    if len(peak_arr) == 1:
        return 1
    else:
        start_peak_num = 1
        while start_peak_num < len(peak_arr):
            # 몇개의 봉우리를 찾아야하는지
            start_peak_num += 1
            # 기본 1로 시작함(이미 하나 찾은거로 가정)
            current_peak_num = 1
            s = peak_arr[0]
            # 1개 찾고, 2개 찾고 ..
            for i in range(1,len(peak_arr)):
                e = peak_arr[i]
                
                if abs(e-s) >= start_peak_num:
                    # 여기가 다시 시작이 된다
                    s = e
                    current_peak_num += 1
                    
                    if current_peak_num == start_peak_num:
                        result_peak_num = max(result_peak_num,start_peak_num)
            
    #print(result_peak_num)
    
    return result_peak_num
    
    pass

 

==============아래는 성공한 코드 =============

 

8월 21일 코드

 

드디어 풀었다!!

 

물론 구글링을 조금 하긴 했지만, 

어느정도 혼자 힘으로 풀 수 있었다.

# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")

def solution(A):
    # write your code in Python 3.6
    
    # peak가 있는 인덱스만 모아놓은 리스트 초기화
    peak_arr_list = []
            
    
    # peak가 있는 인덱스만 모아놓은 리스트 값 채워넣기
    for i in range(1,len(A)-1):
        if A[i] > A[i-1] and A[i] > A[i+1]:
            peak_arr_list.append(i)
    
    # 만약 peak가 0개라면 return 0
    if len(peak_arr_list) == 0:
        return 0
    
	# 만약 peak가 1개라면 return 1
    if len(peak_arr_list) == 1:
        return 1       
        
    # peak_arr_list 출력 테스트
    #print(peak_arr_list)
    
    # peak_arr 라는 리스트 초기화
    peak_arr = [0]*len(A)
    peak_arr[0] = -1
    peak_arr[-1] = -1
    peak_idx = -1
    
    # peak_arr 값 채워넣기
    for i in range(len(A)-2,0,-1):
        if A[i] > A[i-1] and A[i] > A[i+1]:
            peak_idx = i
            
        peak_arr[i] = peak_idx
    
	# peak_arr 출력 테스트
    #print(peak_arr)
    
    max_num_flag = -1
    
    # 1에서 len(A)까지 반복 -> 최대 peak 개수는 len(A)가 될 수 있음
    for i in range(1,len(peak_arr_list)+1):
    
    	# index는 매 loop마다 1값으로 초기화
        index = 1
        
        # num_flag는 매 loop마다 peak 조건을 만족하면 +1씩 해줌
        num_flag = 0
        
        # num_flag가 loop보다 작으면 반복 -> 같아지면 해당 num_flag는 가능한 개수이다.
        while num_flag < i:
            try:
                if peak_arr[index] != -1:
                    num_flag += 1
                    index = peak_arr[index] + i
                else:
                    return max_num_flag
            except:
                return max_num_flag
        
        # 만약 이전 loop의 peak 개수보다 크면 max_num_flag 초기화
        max_num_flag = max(num_flag,max_num_flag)
                
    # for 끝나면 가장 최대 peak 개수를 의미하는 max_num_flag 반환
    return max_num_flag
                
    pass

 

 

해당 내용을 풀이해주는 영상을 만들었습니다.

 

어려우신 분들은 보시면 도움이 될 것 같습니다!!(하단 링크 참조)

 

https://www.youtube.com/watch?v=8DvYb9lVcRM&feature=youtu.be

 

 

반응형
반응형

다시 취업 준비를 하면서 오랜만에 Codility 문제를 풀어봤다

 

그 동안 대림산업, 한국음악저작권협회, 딥엑스 등 다양한 곳에 면접을 보았고,

 

코로나 때문인지 국민은행, 마이다스아이티 등 다양한 곳에서 AI 면접을 보았다.

 

생각보다 취업이 잘 되지 않아서 조금 복잡한 마음이 있다.

 

그렇지만 성실하게 공부하고,

 

이렇게 취업 준비할 수 있는 것 만으로도 감사하면서 보낸다면,

 

결국 언젠가 나에게 가장 좋을 길이 찾아올 것을 믿는다.

 

 

최근에는 취업을 위해서 준비중인게 있다면,

 

오픽

정보처리기사 실기(필기는 합격><)

이다.

 

이 외에도 개인 프로젝트를 하곤 했었는데, 바빠져서 우선순위에서 밀리게 되었다.

 

이런 상황을 너무 자책하거나 힘들어하지 말고,

오히려 성실함과 인내를 배우는 감사의 시간으로 보내야겠다.

 

 

"감사로 받으면 버릴 것이 없다" 아멘~

반응형
반응형

나의 코드

시간 복잡도: O(sqrt(N)) or O(N)

# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")

def solution(N):
    # write your code in Python 3.6
    
    if N == 1:
        return 1
    
    cnt = 0
    
    for i in range(int(N/2)):
        # 약수이면
        i = i+1
        if N/i%1 == 0:
            if N//i < i:
                break
            if N//i == i:
                cnt += 1
            else:
                cnt += 2
                
    return cnt        
    pass
    

 

누군가의 코드

시간복잡도: O(sqrt(N))

# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")

def solution(N):
    # write your code in Python 3.6
    
    number_iter = 1
    factor_cnt = 0
    
    while number_iter*number_iter < N:
        # 약수이면
        if N/number_iter%1 == 0:
            factor_cnt += 2
            
        number_iter += 1
        
    if number_iter*number_iter == N:
        factor_cnt += 1
        
    return factor_cnt
    pass

 

 

약수의 경우 이렇게 풀면 꼭 O(N)의 성능이 나지 않고,

조금 더 빠른 추출이 가능하다. 참고!

반응형
반응형

 

 

알고리즘 문제인지 알았지만

SQL 문제였다.

 

하지만 SQL 로직에도 알고리즘이 필요하기 때문에 풀어보았다.

 

다른 일정이 있어서 다 풀진 못했지만 푼 부분까지 정답을 정리해보았다.

 

1번 문제

-- 코드를 입력하세요
SELECT MAX(DATETIME)
FROM ANIMAL_INS
-- ORDER BY DATETIME

 

2번 문제

-- 코드를 입력하세요
SELECT MIN(DATETIME)
FROM ANIMAL_INS

 

3번 문제

-- 코드를 입력하세요
SELECT count(*)
FROM ANIMAL_INS

 

4번 문제

-- 코드를 입력하세요
SELECT COUNT(DISTINCT(NAME))
FROM ANIMAL_INS

 

5번 문제

-- 코드를 입력하세요
SELECT ANIMAL_TYPE, count(*)
FROM ANIMAL_INS
WHERE ANIMAL_TYPE IN ('Cat','Dog')
GROUP BY ANIMAL_TYPE

 

6번 문제

-- 코드를 입력하세요
SELECT *
FROM (
SELECT NAME, COUNT(*) AS COUNT
FROM ANIMAL_INS
GROUP BY NAME) A
WHERE A.COUNT >= 2 AND A.NAME IS NOT NULL
ORDER BY A.NAME

 

7번 문제

-- 코드를 입력하세요
SELECT hour(DATETIME) HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY hour(DATETIME)
HAVING HOUR >= 9 AND HOUR <= 19
ORDER BY hour(DATETIME)

 

8번 문제

-- 코드를 입력하세요
set @a := -1;
SELECT HOUR, IFNULL(COUNT,0)
FROM(SELECT HOUR(DATETIME) AS HOUR1, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)) real_table RIGHT JOIN (SELECT *
FROM (SELECT @a:=@a+1 as HOUR FROM ANIMAL_OUTS) A
WHERE A.HOUR >= 0 AND A.HOUR < 24) total_table ON real_table.HOUR1 = total_table.HOUR
반응형

+ Recent posts