코테/프로그래머스(Programmers)

    [프로그래머스,Level 1] 키패드 누르기(JAVA 구현)

    - 첫 풀이 처음에는 이 문제에서 가운데 번호를 누르기 위해서 왼쪽, 오른쪽 손의 거리 차이에 따라 누루는 손이 결정된다는 것을 보고 bfs를 이용해 풀어보려고 했지만, 잘 해결되지 않아 검색을 통해 다른 분들의 풀이를 참고하였다. - 정답풀이 다른 분들의 주된 풀이로는 '맨해튼 거리 측정법'이었다. 관련 내용에 대해 간단히 찾아본 결과 맨해튼 거리 측정법은 유클리드 거리 측정법과는 다르게 점 A와 점 B의 사이에 장애물이 존재해 정해진 경로로만 이동이 가능하다는 차이점이 존재한다. 예를들어 왼손이 1번에 위치한 상태에서 5번을 누르기 위해서는 1-> 2-> 5 또는 1-> 4-> 5와 같이 대각선으로의 직접적인 이동이 불가능한 경우를 말한다. 맨해튼 거리 측정법의 공식은 |각 점의 X좌표 차이| + |..

    [프로그래머스,Level 1] 내적(JAVA 구현)

    - 첫 풀이 및 정답풀이 아주 간단한 문제. class Solution { public int solution(int[] a, int[] b) { int answer = 0; // 1. 내적 공식에 맞게 연산처리. for(int i =0;i

    [프로그래머스,Level 1] 3진법 뒤집기(JAVA 구현)

    - 첫 풀이 및 정답풀이 이 문제의 핵심은 10진법에서 n진법으로의 변환 방법을 알고 있냐는 것 같다. 10진법에서 특정 진법으로의 변환은 해당 진법의 수로 나누어 몫이 0이 나올 때까지 나머지를 역으로 취해주는 것이다. 예를 들어 예제 1번의 경우 45를 3으로 계속해서 나누어 몫이 0이 될 때 나머지를 거꾸로 취하면, 1200이 나오게 된다. 풀이 과정에서 3진법을 앞뒤 반전하는 과정이 존재한다. 위에서 설명하였듯이 특정 진법으로의 변환은 나머지를 반대로 취하는 것이다. 다시 말해 3진법을 앞뒤 반전하는 것은 그저 정수 n을 3으로 나눈 나머지를 순서대로 취해주면 된다는 의미이며, 이를 10진법으로 변환하면 된다. class Solution { public int solution(int n) { //..

    [프로그래머스,Level 1] 크레인 인형뽑기 게임(JAVA 구현)

    - 첫 풀이 및 정답풀이 문제 내용이 좀 길긴 한데 천천히 읽어보면 별 문제 없다. 요점은 2차원 배열에는 1~100까지의 정수가 주어지는데, 이 정수는 서로 다른 인형들을 의미하는 것이며, 1차원 배열에는 2차원 배열의 몇 번째 열에서 인형을 뽑는지 주어진다. 여기서 뽑은 인형은 LIFO 구조의 바구니에 집어넣으며, 동일한 인형이 연속해서 집어넣어질 경우 두 개의 인형이 사라진다. 결국 사라진 인형의 개수를 반환하면 된다. 이 문제를 처음 풀 때는 인형을 담는 바구니를 ArrayList를 통해 인형을 모두 담아 연속하는 인형을 인덱스로 참조해 제거하는 방식을 사용하고자 했는데, 잘 생각해보니 인형이 1,2,2,1과 같은 순으로 들어갔다면 2번 인형들이 지워지고 그 자리에 1번이 내려와 또 다시 1번 인..

    [프로그래머스,Level 1] 두 개 뽑아서 더하기(JAVA 구현)

    - 첫 풀이 및 정답풀이 이 문제는 하나의 배열에 주어지는 데이터들 중 서로 다른 인덱스를 가지는 원소의 합을 오름차순으로 정렬하여 반환하면 되는 문제이다. 여기서 주의해야 할 점은 numbers[i] + numbers [j] == numbers [j] + numbers [i]라는 점과 중복은 허용하지 않는다는 것이다. import java.util.ArrayList; import java.util.Collections; class Solution { public ArrayList solution(int[] numbers) { // 1. 정답 ArrayList 객체 ArrayList answer = new ArrayList(); // 2. 더한 결과의 중복을 확인하기 위한 배열, 데이터 최댓값인 100이..

    [프로그래머스,Level 1] 완주하지 못한 선수(JAVA 구현)

    - 첫 풀이 및 정답풀이 이 문제의 경우 주어지는 두 가지 배열을 적절히 이용하면 풀 수 있다고 생각이 들었고, 문제에서 제시하는 자료구조인 해시를 이용해 풀어보고자 하였다. 해시를 많이 사용해보지 않아 공부하는 차원에서 처음부터 다른 분들의 풀이를 보고 풀어보았다. 이 문제의 핵심은 참여자 명단과 완주 명단이 주어지며, 두 명단 사이 크기 차이는 1이라는 점이다. 즉, 완주하지 못한 한 명을 찾아내는 것이 핵심이라 할 수 있다. import java.util.*; import java.util.Map.Entry; class Solution { public String solution(String[] participant, String[] completion) { String answer = ""; //..

    [프로그래머스,Level 1] 모의고사(JAVA 구현)

    - 첫 풀이 이 문제는 처음 풀 때 문제에 대한 이해가 부족했었다. 문제에서의 조건은 '1번부터 마지막 문제까지의 정답이 들은 배열 answers'이라 했지만, 필자는 수포자들이 찍은 문제의 수만큼 정답이 반복한다고 생각했다.(왜 그랬는지 모르겠다.) 예를 들어, 1번 수포자는 1,2,3,4,5,1,2,3,4,5 순으로 문제를 찍을 때, answers의 배열인 1,2,3,4,5가 1번 수포자가 찍은 문제를 반복해서 순회한다고 생각했다. - 정답 풀이 그러나 위와 반대로 주어지는 정답 배열에 규칙성있게 찍는 수포자들의 번호가 몇 개가 일치하는지를 알아내면 되는 것이었다. 즉, 문제의 수가 10개인 정답 배열이 주어진다면, 수포자들은 10번까지 규칙성 있게 문제를 찍는 것이다. import java.util..

    [프로그래머스,Level 1] K번째 수(JAVA 구현)

    -첫 풀이 및 정답풀이 이 문제 역시 체육복 문제와 비슷하게 그냥 문제에서 주어지는 조건만 잘 지켜준다면, 쉽게 풀 수 있는 문제였다. 그러나 필자의 풀이와 다르게 Arrays.copyOfRange() 메서드를 활용해 더욱 짧게 푼 사람들의 풀이 역시 존재하니까 많이 참고하는 게 좋을 것 같다. (다른 사람의 풀이이므로 블로그에 직접 게시하지 않으니 문제에서 제공되는 링크에서 확인 바란다.) import java.util.ArrayList; import java.util.Arrays; class Solution { public ArrayList solution(int[] array, int[][] commands) { // 1. 정답을 담아 반환할 ArrayList. ArrayList answer = n..

    [프로그래머스,Level 1] 체육복(JAVA 구현)

    - 첫 풀이 및 정답풀이 이 문제는 특별한 알고리즘보다는 그냥 있는 조건에 맞게 코딩하면 풀 수 있는 문제이다. 필자는 체육복 개수를 카운팅 하는 1차원 배열을 n+2 크기만큼 선언해 주었다. 그 이유는 기본적으로 체육복을 앞, 뒤 사람에게만 빌릴 수 있는데 이를 구현하는 과정에서 인덱스 범위 에러와 코드 자체가 복잡하다고 생각되어서 이다. 자세한 풀이는 코드를 통해 확인하자. import java.util.Arrays; class Solution { public int solution(int n, int[] lost, int[] reserve) { int answer = n; // 1. 체육복 개수 배열. int check[] = new int[n+2]; // 2. 체육복이 없는 학생 수. int te..

    [프로그래머스,Level 1] 시저 암호(JAVA 구현)

    - 첫 풀이 및 정답풀이 이 문제는 n의 값에 따라 문자열의 각 문자들이 변해야 하기 때문에 아스키코드가 중요하다는 것을 알 수 있다. 모든 아스키코드값을 알 수 없기 때문에 필요할 때마다 찾아보면 된다. A ~ Z의 아스키 코드는아스키코드는 65 ~ 90까지이고, a ~ z의 아스키코드는 97 ~ 122이다. 이를 이용해서 적절한 조건에 따라 처리해주면 된다. class Solution { public String solution(String s, int n) { String answer = ""; // 1. 문자열 탐색 for(int i = 0;i n만큼 밀린 문자가 Z인 90을 넘을 경우 -26을 통해 A부터 시작, 아니면 그냥 밀린 문자를 추가. if('A' n만큼 밀린 문자가 z인 122를 넘을..