728x90

https://school.programmers.co.kr/learn/courses/30/lessons/151136

 

프로그래머스

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

programmers.co.kr

 

 

 

풀이)

-- 코드를 입력하세요
SELECT round(avg(daily_fee), 0) as average_fee from car_rental_company_car
where car_type="SUV";

 

round를 이용해서 소수점을 구할 수 있다는 사실!

round(값, 위치)여서 해당 위치까지 반올림을 한다!!

즉, round(x, 1)이면 소수 둘째자리에서 반올림을 하는 것이고, 소수 첫쩨자리까지 반올림 하는 것!!

 

728x90
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/164673

 

프로그래머스

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

programmers.co.kr

 

 

 

풀이)

-- 코드를 입력하세요
# SELECT b.TITLE, b.BOARD_ID, r.REPLY_ID, r.WRITER_ID, r.CONTENTS, date_format(r.created_date, "%Y-%m-%d") as CREATED_DATE
# from used_goods_board as b, used_goods_reply as r 
# where b.board_id = r.board_id and date_format(b.created_date, "%Y-%m")="2022-10" 
# order by r.created_date, b.title;

select b.title, b.board_id, r.reply_id, r.writer_id, r.contents, date_format(r.created_date, "%Y-%m-%d") as created_date
from used_goods_board as b inner join used_goods_reply as r on b.board_id = r.board_id
where date_format(b.created_date, "%Y-%m")="2022-10" 
order by r.created_date, b.title;

join을 사용해야 하는 문제였는데, 두 개의 코드 모두 정답이었다.

 

join을 거의 해본적이 없어서 읽어보면서 했는데, 어렵군.....

 

728x90
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/144853

 

프로그래머스

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

programmers.co.kr

 

 

풀이)

SELECT book_id, date_format(published_date, "%Y-%m-%d") from book where DATE_FORMAT(published_date, "%Y")="2021" and category="인문" order by published_date;

sql 공부하면서 처음 본 것이 많다. 공부 열심히 해봐야징

 

date_format을 이용해 날짜와 시간을 원하는 형식으로 출력할수도 있다는 것을 알았다.

또한,,,

 

"%Y-%M-%D"와 "%y-%m-%d"의 차이가 있더라고요...??

오늘 날짜인 2023-04-04를 예시로 든다면,,,

전자는 2023-April-4th, 후자는 23-04-04로 나온다.....

세상에.....

 

이제 알았으니까 잘해봐야징!

 

 

참고!!

https://lightblog.tistory.com/155

 

[MySQL] 날짜, 시간 표기 방식 지정하기 DATE_FORMAT()

다음과 같이 id 와 datetime 2열로 이루어진 간단한 테이블을 생성하고 임의로 날짜와 시간을 만들어 넣자. insert into sandbox2 (datetime) VALUES('2017-08-28 17:22:21'),('2017-02-15 10:22:24'),('2017-12-09 22:13:24'),('2017-0

lightblog.tistory.com

 

728x90
728x90

https://www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$  둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽

www.acmicpc.net

 

 

 

풀이)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main_BJ_14503_로봇청소기 {
    static int n, m, ans;
    static int[][] map;
    // 상하좌우
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        map = new int[n][m];

        st = new StringTokenizer(br.readLine());
        int r = Integer.parseInt(st.nextToken());
        int c = Integer.parseInt(st.nextToken());
        int d = Integer.parseInt(st.nextToken());

        for(int i=0; i<n; i++){
            st = new StringTokenizer(br.readLine());
            for(int j=0; j<m; j++){
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        simulation(r, c, d);
        System.out.println(ans);
    }//main
    private static void simulation(int r, int c, int d){
        int x = r;
        int y = c;
        int dir = d;

        while(true){
            boolean flag = false;
            if(map[x][y] == 0) {
                //현재 칸 청소
                map[x][y] = 2;
                ans++;
            }

            //주변 살펴보기
            for(int i=0; i<4; i++){
                int nx = x + dx[i];
                int ny = y + dy[i];

                // 청소되지 않은 칸이 있는 경우
                if(check(nx, ny) && map[nx][ny] == 0){
                    // 반시계 방향으로 회전
                    dir--;
                    if(dir < 0)
                        dir = 3;
                    flag = true;
                    break;
                }
            }//for

            //주변 청소되지 않은 칸이 있을 때
            if(flag){
                // 앞쪽 칸이 청소되지 않았을 때
                int[] next = front(x, y, dir);
                if(check(next[0], next[1]) && map[next[0]][next[1]] == 0) {
                    //전진
                    x = next[0];
                    y = next[1];
                }
            }

            // 주변 4칸 중 청소되지 않은 빈 칸이 없을 때
            else {
                int[] next = back(x, y, dir);
                //한 칸 후진할 수 있으면
                if(check(next[0], next[1])){
                    x = next[0];
                    y = next[1];
                }

                //없으면 탈출
                else
                    break;
            }
        }//while
    }//simulation
    private static boolean check(int x, int y){
        if(x<0 || y<0 || x>=n || y>=m || map[x][y] == 1)
            return false;
        return true;
    }//check

    private static int[] front(int x, int y, int dir){
        switch (dir) {
            case 0: {//북
                int nx = x - 1;
                return new int[]{nx, y, dir};
            }

            case 1: { //동
                int ny = y + 1;
                return new int[]{x, ny, dir};
            }

            case 2: {//남
                int nx = x + 1;
                return new int[]{nx, y, dir};
            }

            case 3: { //서
                int ny = y - 1;
                return new int[] {x, ny, dir};
            }
        }//switch
        //아무것도 아닐 때
        return new int[] {-1, -1, -1};
    }//front
    private static int[] back(int x, int y, int dir){
        switch (dir) {
            case 0: {//북
                int nx = x + 1;
                return new int[]{nx, y, dir};
            }

            case 1: { //동
                int ny = y - 1;
                return new int[]{x, ny, dir};
            }
            case 2: {//남
                int nx = x - 1;
                return new int[]{nx, y, dir};
            }

            case 3: { //서
                int ny = y + 1;
                return new int[] {x, ny, dir};
            }
        }//switch
        //아무것도 아닐 때
        return new int[] {-1, -1, -1};
    }//back
}

골드5 치고는 살짝 쉬운 편이라고 생각한다!

말 그대로 열심히 구현하면 되는 문제였다.

 

다만,,, 문제가 좀 읽기 힘드니 2번 밑에 1이 나올경우 2-1, 2-2..

이런 식으로 유동적으로 읽기를 바란다..

 

또한,,,, 조건을 잘 읽기!!! 1이 벽이라는 사실을 나는 왜 못본거지!!!!!

눈을 뜨자~~~~

 

그것만 뺀다면 순서대로 구현한다면 어렵지 않게 구현했을 문제였다!

728x90

'코테 > 백준' 카테고리의 다른 글

백준 10844 쉬운 계단 수(JAVA)  (0) 2023.04.06
백준 1946 신입 사원(JAVA)  (0) 2023.04.06
백준 1245 농장 관리(JAVA)  (0) 2023.04.04
백준 15903 카드 합체 놀이(JAVA)  (0) 2023.04.03
백준 2217 로프(JAVA)  (0) 2023.04.02
728x90

https://www.acmicpc.net/problem/1245

 

1245번: 농장 관리

첫째 줄에 정수 N(1 < N ≤ 100), M(1 < M ≤ 70)이 주어진다. 둘째 줄부터 N+1번째 줄까지 각 줄마다 격자의 높이를 의미하는 M개의 정수가 입력된다. 격자의 높이는 500보다 작거나 같은 음이 아닌 정수

www.acmicpc.net

 

 

 

풀이)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main_BJ_1245_농장관리 {
    static int n, m, ans;
    static int[][] map;
    static boolean[][] visited, topMap;
    // 상 하 좌 우 왼위 오위 왼아 오아
    static int[] dx = {-1, 1, 0, 0, -1, -1, 1, 1};
    static int[] dy = {0, 0, -1, 1, -1, 1, -1, 1};

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        map = new int[n][m];
        topMap = new boolean[n][m];
        visited = new boolean[n][m];

        for(int i=0; i<n; i++){
            st = new StringTokenizer(br.readLine());
            for(int j=0; j<m; j++){
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                if(map[i][j]!=0 && !topMap[i][j])
                    bfs(i, j);
            }
        }
        System.out.println(ans);

    }//main
    private static void bfs(int x, int y){
        Queue<int[]> q = new ArrayDeque<>();
        ArrayList<int []> top = new ArrayList<>();

        visited = new boolean[n][m];
        visited[x][y] = true;
        q.offer(new int[] {x, y});

        while(!q.isEmpty()){
            int[] cur = q.poll();

            for(int i=0; i<8; i++){
                int nx = cur[0] + dx[i];
                int ny = cur[1] + dy[i];
                if(check(nx, ny) && !visited[nx][ny]){
                    if(map[nx][ny] > map[cur[0]][cur[1]]) //현재보다 더 높은 지점 있으면 return
                        return;
                    else if(map[nx][ny] == map[cur[0]][cur[1]]){
                        q.offer(new int[] {nx, ny});
                        top.add(new int[] {nx, ny});
                    }
                    visited[nx][ny] = true;
                }//if
            }
        }//while
        for(int i=0; i<top.size(); i++){
            int[] cur = top.get(i);
            topMap[cur[0]][cur[1]] = true;
        }
        ans++;
    }//bfs

    private static boolean check(int x, int y){
        if(x<0 || y<0 || x>=n || y>=m)
            return false;
        return true;
    }
}

생각할 거리!!

 

1. 전체 맵을 탐색하면서 bfs를 돌린다.

   1-1. 이때, map이 0이 아니거나, 산봉우리라고 판단하지 않은 위치만 돌린다!

2. bfs에서 현재 기준을 잡고 있는 위치보다 인접한 곳에 높은 곳이 존재하는지 확인한다.

    2-1. 더 높은 곳이 있다면 바로 return하여 빠져나온다

    2-2. 현재 위치와 같은 곳이 있다면, 산봉우리 List(top)에 저장해두고, 큐에도 삽입한다.

    2-3. 방문 처리를 한다.

3. bfs가 끝난 후 산봉우리를 체크해준다.(이 상태까지 왔다면 bfs로 탐색한 위치가 산봉우리가 맞다는 의미와 같다)

4. 산봉우리 개수를 하나 올려준다.

 

 

쉬운듯 했지만,,, 잘 못풀었다...

다시 풀어보자!!

 

 

 

참고한 블로그

https://velog.io/@somyeong0623/%EB%B0%B1%EC%A4%80java-1245.-%EB%86%8D%EC%9E%A5-%EA%B4%80%EB%A6%AC

 

[백준/java] 1245. 농장 관리

문제 링크 - https://www.acmicpc.net/problem/12452달전에 풀었다고 나와있는 문제라서 금방 풀 줄 알았는데 매우 헤맸다. (심지어 전에 제출했던거 봐도 못알아먹음 ...)2중포문으로 2차원 배열을 전부 돌

velog.io

 

728x90

'코테 > 백준' 카테고리의 다른 글

백준 1946 신입 사원(JAVA)  (0) 2023.04.06
백준 14503 로봇 청소기(JAVA)  (0) 2023.04.04
백준 15903 카드 합체 놀이(JAVA)  (0) 2023.04.03
백준 2217 로프(JAVA)  (0) 2023.04.02
백준 1932 정수 삼각형(JAVA)  (0) 2023.03.30
728x90

https://www.acmicpc.net/problem/15903

 

15903번: 카드 합체 놀이

첫 번째 줄에 카드의 개수를 나타내는 수 n(2 ≤ n ≤ 1,000)과 카드 합체를 몇 번 하는지를 나타내는 수 m(0 ≤ m ≤ 15×n)이 주어진다. 두 번째 줄에 맨 처음 카드의 상태를 나타내는 n개의 자연수 a1,

www.acmicpc.net

 

 

풀이)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main_BJ_15903_카드합체놀이 {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        PriorityQueue<Long> pq = new PriorityQueue<>();
        st = new StringTokenizer(br.readLine());
        for(int i=0; i<n; i++)
            pq.offer(Long.parseLong(st.nextToken()));

        int cnt = 0;
        while(cnt < m){
            long a = pq.poll();
            long b = pq.poll();
            pq.offer(a+b);
            pq.offer(a+b);

            cnt++;
        }

        long sum = 0;
        int size = pq.size();
        for(int i=0; i<size; i++)
            sum += pq.poll();
        System.out.println(sum);

    }//main
}

해당 문제는 그리디로 푸는 문제로, priority queue를 사용하면 쉽게 풀 수 있다!

카드에서 작은 순서대로 정렬을 한 후, 앞에서 2개를 뽑아 더한 수를 다시 pq에 넣어두면, 다시 정렬이 된다.

이 과정을 m번 반복하면 끝!

728x90

'코테 > 백준' 카테고리의 다른 글

백준 14503 로봇 청소기(JAVA)  (0) 2023.04.04
백준 1245 농장 관리(JAVA)  (0) 2023.04.04
백준 2217 로프(JAVA)  (0) 2023.04.02
백준 1932 정수 삼각형(JAVA)  (0) 2023.03.30
백준 1966 프린터 큐(JAVA)  (0) 2023.03.28
728x90

https://www.acmicpc.net/problem/2217

 

2217번: 로프

N(1 ≤ N ≤ 100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다. 하

www.acmicpc.net

 

 

풀이)

import java.util.Arrays;
import java.util.Scanner;

public class Main_BJ_2217_로프 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        for(int i=0; i<n; i++){
            arr[i] = sc.nextInt();
        }
        Arrays.sort(arr);
        int max = 0;
        for(int i=0; i<n; i++){
            max = Math.max(max, (n-i)*arr[i]);
        }
        System.out.println(max);

    }//main
}

로프의 중량을 받아 정렬을 해준다.

그 후 택한 로프의 최대 중량을 병렬로 연결했을 때의 무게를 계산하면서 max 값을 구하면 된다.

 

그리디로 해결할 수 있는 간단한 문제!

728x90

'코테 > 백준' 카테고리의 다른 글

백준 1245 농장 관리(JAVA)  (0) 2023.04.04
백준 15903 카드 합체 놀이(JAVA)  (0) 2023.04.03
백준 1932 정수 삼각형(JAVA)  (0) 2023.03.30
백준 1966 프린터 큐(JAVA)  (0) 2023.03.28
백준 1152 단어의 개수(JAVA)  (0) 2023.03.23
728x90

https://www.acmicpc.net/problem/1932

 

1932번: 정수 삼각형

첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.

www.acmicpc.net

 

 

 

풀이)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main_BJ_1932_정수삼각형 {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int[][] tree = new int[n][n];
        int[][] dp = new int[n][n];
        for(int i=0; i<n; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            for(int j=0; j<=i; j++){
                tree[i][j] = Integer.parseInt(st.nextToken());
                if(i==n-1){
                   dp[i][j] = tree[i][j];
                }
            }
        }//for

        for(int i=n-2; i>=0; i--){
            for(int j=0; j<=i; j++){
                dp[i][j] = Math.max(dp[i+1][j] + tree[i][j], dp[i+1][j+1]+tree[i][j]);
            }
        }
        System.out.println(dp[0][0]);
    }//main
}

이차원 배열인 tree라는 배열과 dp 배열을 선언한다.

 

밑에서부터 최대값을 선택하여 더해서 올라가는 방식을 사용했다!

이때, 맨 마지막 줄은 tree와 같은 값을 넣어두고, 더하면서 올라가면 된다.

 

처음에는 이진 트리처럼 구해서 사용하려 했는데, 아니라는걸 깨닫고 바로 바꿨다..

이후 dp배열의 맨 꼭대기를 출력하면 끝!!

 

30

23 21

20 13 10

7 12 10 10

4 5 2 6 5

=> 이런 식으로 dp배열이 나오게 된다

728x90

'코테 > 백준' 카테고리의 다른 글

백준 15903 카드 합체 놀이(JAVA)  (0) 2023.04.03
백준 2217 로프(JAVA)  (0) 2023.04.02
백준 1966 프린터 큐(JAVA)  (0) 2023.03.28
백준 1152 단어의 개수(JAVA)  (0) 2023.03.23
백준 15663 N과 M(9) (JAVA)  (0) 2023.03.22
728x90

https://www.acmicpc.net/problem/1966

 

1966번: 프린터 큐

여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에

www.acmicpc.net

 

 

풀이)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main_BJ_1966_프린터큐 {
    static class node{
        int loc;
        int w;

        public node(int loc, int w){
            this.loc = loc;
            this.w = w;
        }
    }
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());
        for(int tc = 0; tc<t; tc++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            int n =  Integer.parseInt(st.nextToken());
            int m = Integer.parseInt(st.nextToken());
            LinkedList<node> q = new LinkedList<>();

            st = new StringTokenizer(br.readLine());
            for(int i=0; i<n; i++){
                q.offer(new node(i, Integer.parseInt(st.nextToken())));
            }

            int cnt = 0;
            while(!q.isEmpty()){
                node cur = q.poll();
                boolean isMax = true;

                for(int i=0; i<q.size(); i++){
                    if(cur.w < q.get(i).w){
                        q.offer(cur);
                        for(int j=0; j<i; j++)
                            q.offer(q.poll());

                        isMax = false;
                        break;
                    }
                }

                if(!isMax)
                    continue;

                cnt++;
                if(cur.loc == m)
                    break;
            }//while
            System.out.println(cnt);
        }//tc
    }//main
}

큐를 정말 queue로 사용하기보다 linkedlist를 이용해서 구현했다.

이 점을 이용하면 큐 안에 있는 중요도를 볼 수 있어서 편리하다.

현재 중요도보다 큰 애를 발견하면 그 애부터 중요도보다 큰 애 전까지를 큐에 삽입한다.

 

처음 나온 원소가 가장 큰 경우는 해당 원소의 첫 위치가 m과 같은지를 비교해야 한다.

만약 큐에서 나온 원소보다 중요도가 큰 원소가 있는 경우, 그 원소 앞에 있던 원소들을 뒤로 보내야 한다.

그리고 다시 첫 원소를 빼낸 후 큐에 다시 삽입된 원소보다 중요도가 큰 원소가 있는지 검사해야 한다.

따라서 플래그를 설정해 하는게 편하다!

 

쉬운 구현 문제인데 고민이 좀 많았다...

728x90

'코테 > 백준' 카테고리의 다른 글

백준 2217 로프(JAVA)  (0) 2023.04.02
백준 1932 정수 삼각형(JAVA)  (0) 2023.03.30
백준 1152 단어의 개수(JAVA)  (0) 2023.03.23
백준 15663 N과 M(9) (JAVA)  (0) 2023.03.22
백준 9251 LCS(JAVA)  (0) 2023.03.21
728x90

https://www.acmicpc.net/problem/1152

 

1152번: 단어의 개수

첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열

www.acmicpc.net

 

 

 

풀이)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        System.out.println(st.countTokens());
    }
}

StringTokenizer에서 토큰 수를 셀 수도 있었다.

잠깨우기 위한 간단한 브론즈 문제~

728x90

'코테 > 백준' 카테고리의 다른 글

백준 1932 정수 삼각형(JAVA)  (0) 2023.03.30
백준 1966 프린터 큐(JAVA)  (0) 2023.03.28
백준 15663 N과 M(9) (JAVA)  (0) 2023.03.22
백준 9251 LCS(JAVA)  (0) 2023.03.21
백준 1629 곱셈(JAVA)  (0) 2023.03.19

+ Recent posts