인프런 김영한 spring 입문 강의를 보면서 정리한 내용 

자세한 내용은 강의자료를 참고하자 

 

스프링 프로젝트 생성

https://start.spring.io 에서 프로젝트 생성 

 

Spring Initialize에서 선택 사항 

프로젝트 - Gradle Project 

Language - Java

Spring Boot 버전

-snapshot : 만들고 있는 버전 

-m1 : 정식 release(X)

-정식 발매 버전 중 최신 버전 선택 권장

 

grop: 그룹 도메인명

artifact: 프로젝트명 

dependencies: 어떤 라이브러리를 선택할 것인가?

-spring web

-thymeleat(html을 만드는 템플릿 엔진 추후 여러가지 소개, 회사별로 다르다)

 

InteliJ에서 코드 살펴보기

gradle 폴더: gradle관련 폴더

src\main: java & resource

src\test: 테스트코드 관련  소스 (그만큼 테스트코드가 중요!!)

resourec: 실제 java파일 제외한 파일들

 

build.gradle

-repositories: mavenCentral에서 라이브러리를 다운받아라 

-dependencies: 템플릿 엔진 & spring web & junit

 

gitignore: git에 올라가면 안되는 파일들

 

라이브러리

라이브러리간의 의존관계에 따라 필요한 라이브러리를 가져온다. 

 

Build 

콘솔에서 다음의 명령어 실행 

./gradlew build

 

build/lib 폴더에 jar 파일 생성됨

java -jar 프로젝트이름.jar 로 실행가능 

'Spring > 스프링 입문' 카테고리의 다른 글

Section 2  (0) 2021.06.18

문제 설명

정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.


제한사항

  • n은 1 이상 1,000 이하입니다.

입출력 예

nresult

4 [1,2,9,3,10,8,4,5,6,7]
5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9]
6 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]

 

 

문제 풀이 

우선 5X5표에서 직각삼각형으로 수를 대입하는 것을 생각해보자 

1)번 표는 5X5 배열에 직삼각형 모양으로 순서대로 숫자를 채워넣은 것이고,

2)번 표는 5X5 배열에 삼각 달팽이 모양으로 숫자를 채워넣은 것이다. 

 

이 두 표를 비교해보면 삼각 달팽이의 규칙성을 찾을 수 있다. 

우선 삼각 달팽이는 아래로, 오른쪽으로, 대각선방향의 3가지 패턴순 이동하면서 숫자를 채워넣는다. 

따라서 우리는 각 패턴이 1번 배열에서 어디에 위치하는지, 어떤 연관성이 있는지 살펴볼 것이다. 

 

우선 아래방향으로 이동하는 경우이다. 

이는 원래 배열에서 0행, 3행에 위치해있다. 

즉 이를 확장하면, 3으로 나눈 나머지가 0인 행에 위치해있는 것이다. 

 

다음은 오른쪽으로 이동하는 경우이다. 

이는 원래 배열에서 1행, 4행에 위치해있다. 

즉 이를 확장하면 3으로 나눈 나머지가 1인 행에 위치해있는 것이다. 

 

 

마지막으로 대각선으로 이동하는 경우이다. 

이는 원래 배열에서 2행에 위치해있다. 

즉 3으로 나눈 나머지가 2인 경우이다. 

 

3가지 패턴을 분석한 결과를 정리해보면 

1번 배열에서 3으로 나눈 나머지가 0인 행은 삼각 달팽이 배열에서 아래 방향으로 숫자를 채워넣는 것과 동일하다. 

1번 배열에서 3으로 나눈 나머지가 1인 행은 삼각 달팽이 배열에서 오른쪽 방향으로 숫자를 채워넣는 것과 동일하다. 

1번 배열에서 3으로 나눈 나머지가 2인 행은 삼각 달팽이 배열에서 대각선 방향으로 숫자를 채워넣는 것과 동일하다. 

 

이를 코드로 나타내면 다음과 같다. 

 

Solution.java 

class Solution {
    public int[] solution(int n) {
        int[][] arr =new  int[n][n];
        int[] answer = new int[n*(n+1)/2];
        int y=-1, x=0;
        int num=1;
        for(int i=0 ;i<arr.length; i++){
            for(int j=i;j<n;j++){
                //아래로 움직이는 경우 
                if(i%3==0)
                    y++;
                
                //오른쪽으로 움직이는 경우 
                else if(i%3==1)
                    x++;
                
                //대각선으로 움직이느 경우
                else{
                    x--; y--;
                }                
                arr[y][x]=num++;
            }
        }
        
        for(int i =0, cnt=0; i<arr.length;i++){
            for(int j=0;j<arr.length;j++){
                if(arr[i][j]!=0){
                    answer[cnt]=arr[i][j];
                    cnt++;
                }
            }
        }
        
        return answer;
    }
}

'프로그래머스 > LEVEL2' 카테고리의 다른 글

스킬트리  (0) 2021.01.31
124 나라의 숫자  (0) 2021.01.31
프린터  (0) 2021.01.31
기능개발  (0) 2021.01.31
다리를 지나는 트럭  (0) 2021.01.31

문제 설명

선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.

예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.

위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.

선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.

 

제한 조건

  • 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.
  • 스킬 순서와 스킬트리는 문자열로 표기합니다.
    • 예를 들어, C → B → D 라면 CBD로 표기합니다
  • 선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.
  • skill_trees는 길이 1 이상 20 이하인 배열입니다.
  • skill_trees의 원소는 스킬을 나타내는 문자열입니다.
    • skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.

입출력 예

skillskill_treesreturn

"CBD" ["BACDE", "CBADF", "AECB", "BDA"] 2

입출력 예 설명

  • BACDE: B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트립니다.
  • CBADF: 가능한 스킬트리입니다.
  • AECB: 가능한 스킬트리입니다.
  • BDA: B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트리입니다.

 

Solution.java 

import java.util.*;

class Solution {
    public int solution(String skill, String[] skill_trees) {
        int answer = 0;
        ArrayList<Integer> check = new ArrayList<>();
        int index=0;
        for(int i=0;i<skill_trees.length;i++){
            for(int j=0; j<skill_trees[i].length();j++){
                if(skill.indexOf(skill_trees[i].charAt(j))>=0){
                    check.add(skill.indexOf(skill_trees[i].charAt(j)));
                }
            }
            for(Integer a : check){
                if (a==index)
                    index++;
            }
            if(index==check.size())
                answer++;
            check.clear();
            index=0;
        }
        
        return answer;
    }
}

우선 skill_trees의 각 문자열에 skill의 문자가 몇 번째 인덱스에 있는지 확인하여 check ArrayList에 추가했다.
그리고 check 리스트가 0,1,2순으로 증가하는지 확인한다. 
0,1,2,순으로 증가했다면 answer의 수를 증가시키고 check리스트와 index를 초기화한다. 

그러나 이 문제는 정규식을 이용하면 더욱 간단하게 해결할 수 있다. 

 

import java.util.*;

class Solution {
    public int solution(String skill, String[] skill_trees) {
        int answer = 0;

        for(String st : skill_trees){
            String check=st.replaceAll("[^"+skill+"]","");
            if (skill.indexOf(check)==0)
                answer++;
        }
        return answer;
    }

이 풀이에서는 skill_trees의 각 문자열에서 skill의 문자를 제외하고 모두 삭제한다. 
이 문자열이 skill 문자열에서 몇 번째 인덱스에 위치하는 지 검색한다. 
0번째 인덱스에 있다면 스킬순서로 스킬트리를 작성한 것이므로 answer의 값을 증가한다. 

'프로그래머스 > LEVEL2' 카테고리의 다른 글

삼각 달팽이  (0) 2021.01.31
124 나라의 숫자  (0) 2021.01.31
프린터  (0) 2021.01.31
기능개발  (0) 2021.01.31
다리를 지나는 트럭  (0) 2021.01.31

문제 설명

124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.

  1. 124 나라에는 자연수만 존재합니다.
  2. 124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.

예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.

10진법124 나라10진법124 나라

1 1 6 14
2 2 7 21
3 4 8 22
4 11 9 24
5 12 10 41

자연수 n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾼 값을 return 하도록 solution 함수를 완성해 주세요.

 

제한사항

  • n은 500,000,000이하의 자연수 입니다.

입출력 예

nresult

1 1
2 2
3 4
4 11

 

Solution.java

 

class Solution {
    public String solution(int n) {
        long result=0;
        while(n!=0){
            if(n%3!=0){
            result = (long)(result*10) + n%3;
            n/=3;
            }
            else {
                result=(long)(result*10) + 4;
                n=n/3-1;
            }
        }
        StringBuilder answer = new StringBuilder(Long.toString(result));
        return answer.reverse().toString();
    }
}

 

코드 설명 

이 문제는 규칙성을 파악하는 것이 핵심이다. 

우선 3의 배수를 제외한 숫자는 3진법으로 나타낸다. 

3의 배수인 경우에는 몫에 1을 빼고, 나머지를 4를 더한다.
만약 몫에 1을 뺀 값이 3의 배수가 아니라면 다시 3진법으로 나타내고, 몫이 3의 매수인 경우에는 이 과정을 반복한다.

단 이떄 result값은 3진법을 뒤집은 값이 대입되므로, reverse메소드를 통해 뒤집어야한다. 

'프로그래머스 > LEVEL2' 카테고리의 다른 글

삼각 달팽이  (0) 2021.01.31
스킬트리  (0) 2021.01.31
프린터  (0) 2021.01.31
기능개발  (0) 2021.01.31
다리를 지나는 트럭  (0) 2021.01.31

+ Recent posts