Red Glitter Pointer

 

 

1972번: 놀라운 문자열

대문자 알파벳으로만 이루어져 있는 문자열이 있다. 이 문자열에 대해서 ‘D-쌍’이라는 것을 정의할 수 있는데, 이 문자열에 포함되어 있는, 거리가 D인 두 문자를 순서대로 나열한 것을 이 문

www.acmicpc.net

 

 

 

👇 내가 작성한 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str;

        while(!(str = br.readLine()).equals("*")) {
            int result = 0;
            int num = 0;
            for(int i = 1; i < str.length(); i++) { // 놀라운 문자열일 경우 D-쌍의 개수
                num += i;
            }

            Set<String> set = new HashSet<>(); // 중복 제거를 위한 Set 선언

            if(str.length() <= 2) { // 1, 2글자일 경우 무조건 놀라운 문자열임
                System.out.println(str + " is surprising.");
            } else {
                for(int i = 1; i <= str.length() - 1; i++) {
                    for(int j = 0; j < str.length() - i; j++) {
                        String first = String.valueOf(str.charAt(j));
                        String second = String.valueOf(str.charAt(i + j));
                        set.add(first + second); // 조합한 두 문자를 set에 추가
                    }
                    result += set.size(); // set길이를 result 변수에 누적합
                    set.clear(); // set 초기화
                }
                if(result == num) System.out.println(str + " is surprising.");
                else System.out.println(str + " is NOT surprising.");
            }
        }
    }
}

 

 

느낀 점 및 정리 ✍️

1. set을 이용하여 중복 제거를 하였고, D-쌍마다 set의 크기를 result 변수에 더해주고 set을 초기화 시켜 놀라운 문자열일 경우의 문자열 개수와 일치하는지 판별해주었다. 

 

 

 

 

프로그래머스

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

programmers.co.kr

 

 

 

👇 내가 작성한 코드

import java.util.*;

class Solution {
    int[][] key = {
            {3, 1}, // 0
            {0, 0}, // 1
            {0, 1}, // 2
            {0, 2}, // 3
            {1, 0}, // 4
            {1, 1}, // 5
            {1, 2}, // 6
            {2, 0}, // 7
            {2, 1}, // 8
            {2, 2}, // 9
        };
        
    int[] leftLo = {3, 0}; // 현재 왼쪽 손가락의 위치
    int[] rightLo = {3, 2}; // 현재 오른쪽 손가락의 위치
    
    public String solution(int[] numbers, String hand) {
        StringBuilder answer = new StringBuilder();
        
        for(int n : numbers) {
            switch(n) {
                case 1: case 4: case 7:
                    answer.append("L"); // 왼손으로 누르기
                    leftLo = key[n]; // 왼쪽 손가락 위치 초기화
                    break;
                    
                case 3: case 6: case 9:
                    answer.append("R"); // 오른손으로 누르기
                    rightLo = key[n]; // 오른 손가락 위치 초기화
                    break;
                    
                default:
                    int leftDist = getDist(leftLo, key[n]); // 현재 왼손과 누를 숫자의 거리 구하기
                    int rightDist = getDist(rightLo, key[n]); // 상동
                    
                    if(leftDist < rightDist || (leftDist == rightDist && hand.equals("left"))) {
                        answer.append("L");
                        leftLo = key[n];
                    } else {
                        answer.append("R");
                        rightLo = key[n];
                    }
                    break;
            }
        }
        return answer.toString();
    }
    
    // 현재 위치와 누를 숫자의 거리 구하는 메소드
    public int getDist(int[] key1, int[] key2) {
        return Math.abs(key1[0] - key2[0]) + Math.abs(key1[1] - key2[1]);
    }
}

 

 

느낀 점 및 정리 ✍️

1. 재밌게 풀었따 

 

 

 

 

 

프로그래머스

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

programmers.co.kr

 

 

 

👇 내가 작성한 코드

import java.util.*;

class Solution {
    public String solution(String new_id) {
        String answer = new_id.toLowerCase();
        
        answer = answer.replaceAll("[^-_.a-z0-9]", ""); // 2단계
        answer = answer.replaceAll("[.]{2,}", "."); // 3단계
        answer = answer.replaceAll("^[.]|[.]$", ""); // 4단계
        
        // 5단계
        if(answer.equals("")) answer += "a";
        
        // 6단계
        if(answer.length() >= 16) {
            answer = answer.substring(0, 15);
            answer = answer.replaceAll("[.]$", "");
        }
        
        // 7단계
        if(answer.length() <= 2) {
            while(answer.length() < 3) answer += answer.charAt(answer.length() - 1);
        }
        
        return answer;
    }
}

 

 

느낀 점 및 정리 ✍️

1. 단계 별로 진행하였고, replaceAll과 정규표현식을 사용하였다.

2. [^-_.a-z0-9] ^ 다음에 오는 정규표현식이 아닌 문자들을 공백으로 바꿔주었다. 

3. {} 는 문자가 나오는 횟수. {2,} 은 적어도 2번 나온다는 것을 의미한다

4. ^[.]|[.]$ 는 .으로 시작 or 끝나는 것을 의미함

5. 조금만 안해도 까먹는 정규표현식 ㅠ 달달 외워야겠다.... 너무 편하다 !

 

 

 

 

2210번: 숫자판 점프

111111, 111112, 111121, 111211, 111212, 112111, 112121, 121111, 121112, 121211, 121212, 211111, 211121, 212111, 212121 이 가능한 경우들이다.

www.acmicpc.net

 

 

 

👇 내가 작성한 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;

public class Main {
    static Set<String> set;
    static int[] dr = {1, 0, -1, 0};
    static int[] dc = {0, 1, 0, -1};
    static int[][] map;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        map = new int[5][5];

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

        set = new HashSet<>();
        for(int i = 0; i < 5; i++) {
            for(int j = 0; j < 5; j++) {
                DFS(i, j, "", 0);
            }
        }
        System.out.println(set.size());
    }

    public static void DFS(int x, int y, String result, int count) {
        if(count == 6) {
            set.add(result);
            return;
        }

        for(int d = 0; d < 4; d++) {
            int nr = dr[d] + x;
            int nc = dc[d] + y;

            if(nr >= 0 && nc >= 0 && nr < 5 && nc < 5) {
                DFS(nr, nc, result + map[nr][nc], count + 1);
            }
        }
    }
}

 

 

 

느낀 점 및 정리 ✍️

1. Set을 이용하여 중복 제거

2. 동일한 곳을 재방문할 수 있기 때문에 visited 방문 배열을 별도로 사용하지 않았다.

3. 5글자가 만들어지면 return 되게끔 String과 count를 파라미터로 넘겨주었다.

 

 

 

 

16173번: 점프왕 쩰리 (Small)

쩰리는 맨 왼쪽 위의 칸에서 출발해 (행, 열)로 나타낸 좌표계로,  (1, 1) -> (2, 1) -> (3, 1) -> (3, 3)으로 이동해 게임에서 승리할 수 있다.

www.acmicpc.net

 

 

 

👇 내가 작성한 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    static int N;
    static int[] dr = {1, 0};
    static int[] dc = {0, 1};
    static int[][] game;
    static boolean[][] visited;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        StringTokenizer st;

        game = new int[N][N];
        visited = new boolean[N][N];

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

        BFS(0, 0);

        System.out.println(visited[N - 1][N - 1] == true ? "HaruHaru" : "Hing");
    }

    public static void BFS(int x, int y) {
        Queue<int[]> q = new LinkedList<>();
        visited[x][y] = true;
        q.offer(new int[]{x, y});

        if(x == N - 1 && y == N - 1) {
            visited[N - 1][N - 1] = true;
            return;
        }

        while(!q.isEmpty()) {
            int[] cur = q.poll();
            int curX = cur[0];
            int curY = cur[1];
            int jump = game[curX][curY];

            for(int d = 0; d < 2; d++) {
                int nx = curX + dr[d] * jump;
                int ny = curY + dc[d] * jump;

                if(nx >= 0 && ny >= 0 && nx < N && ny < N && !visited[nx][ny]) {
                    visited[nx][ny] = true;
                    q.offer(new int[]{nx, ny});
                }
            }
        }
    }
}

 

 

느낀 점 및 정리 ✍️

1. BFS를 이용하여 풀었다

 

 

 

 

프로그래머스

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

programmers.co.kr

 

 

 

👇 내가 풀이한 코드

import java.util.*;
import java.io.*;

class Solution {
    static int n, m;
    static int[] dr = {-1, 0, 1, 0};
    static int[] dc = {0, 1, 0, -1};
    
    public int solution(int[][] maps) {
        n = maps.length;
        m = maps[0].length;
        boolean[][] visited = new boolean[n][m];
        Queue<int[]> q = new LinkedList<>();
        
        visited[0][0] = true;
        q.offer(new int[] {0, 0});
        
        while(!q.isEmpty()) {
            int[] cur = q.poll();
            int x = cur[0];
            int y = cur[1];
            
            for(int d = 0; d < 4; d++) {
                int nx = dr[d] + x;
                int ny = dc[d] + y;
                
                if(nx >= 0 && nx < n && ny >= 0 && ny < m && !visited[nx][ny] && maps[nx][ny] == 1) {
                    visited[nx][ny] = true;
                    maps[nx][ny] = maps[x][y] + 1;
                    q.offer(new int[] {nx, ny});
                }
            }
        }
        return maps[n - 1][m - 1] == 1 ? -1 : maps[n - 1][m - 1];
    }
}

 

느낀 점 및 정리 ✍️

1. 최단 거리 구하기 문제라서 BFS 이용하여 풀었다.

2. 이동할 예정인 maps의 위치가 1이라면, 현재 위치해있는 maps 자리의 숫자에서 1을 더해주어 거리를 구해준다.

3. 삼항연산자를 이용하여 정답 return 

 

 

 

 

프로그래머스

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

programmers.co.kr

 

 

 

 

👇 내가 풀이한 코드

import java.util.*;
import java.io.*;

class Solution {
    public int solution(String t, String p) {
        int answer = 0;
        long num = Long.parseLong(p);
        
        for(int i = 0; i < t.length() - p.length() + 1; i++) {
            if(t.charAt(i) <= p.charAt(0)) {
                String temp = t.substring(i, i + p.length());
                if(num >= Long.parseLong(temp)) answer++;
            }
        }
        return answer;
    }
}

 

 

느낀 점 및 정리 ✍️

1. 숫자 길이의 조건을 확인하지 않아서 처음에는 int로 진행했었다가 런타임 에러가 발생했다. 조건 재확인 후 Long으로 바꿈.. ㅎㅋ

2. p와 t의 첫번째 숫자를 비교하여 숫자가 같거나 작을 경우에만 substring을 진행하도록 하였다. (조금이나마 시간복잡도를 줄이기 위한 노력..)

 

 

 

 

 

프로그래머스

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

programmers.co.kr

 

 

 

👇 내가 작성한 코드

SELECT f.id AS ID
        , n.fish_name AS FISH_NAME
        , f.length AS LENGTH
FROM fish_info AS f
JOIN fish_name_info AS n
ON f.fish_type = n.fish_type
WHERE (f.fish_type, f.length) IN (
    SELECT fish_type, MAX(length)
    FROM fish_info
    GROUP BY fish_type
)
ORDER BY ID

 

 

느낀 점 및 정리 ✍️

1. JOIN과 SubQuery를 사용하여 풀었다.

2. fish_type 별로 최대 길이를 찾고, 이 최대 길이를 가진 데이터와 테이블을 조인하여 해당 물고기의 정보를 가져온다.

 

 

+ Recent posts

loading