[프로그래머스,Level 1] 실패율(JAVA 구현)
·
CodingTest/프로그래머스(Programmers)
- 첫 풀이 및 정답풀이 문제의 지문이 길지만, 문제 자체는 상당히 간단하다. 사용자들이 위치한 스테이지 정보가 담긴 stages배열이 주어지며, 최대 스테이지 수로 N이 주어진다. 실패율 = 한 스테이지에 위치한 사용자 수 / 한 스테이지에 도달한 사용자 수라는 정의를 이용하게 된다. 필자는 이를 우선 1번 예제를 토대로 표를 그려보았으며, 아래가 그 표이다. 스테이지 막힌 사용자 해당 스테이지를 도달한 사용자 수 1 1 8 2 3 7 3 2 4 4 1 2 5 0 1 막힌 사용자 수는 stages 배열의 원소로 주어진 정수들을 카운팅 하면 구할 수 있고, 해당 스테이지를 도달한 사용자 수는 막힌 스테이지가 해당 스테이지보다 높다면 이미 도달한 것이기 때문에 그 수를 카운팅 하면 된다. 표를 보면 알 수..
[프로그래머스,Level 1] 비밀지도(JAVA 구현)
·
CodingTest/프로그래머스(Programmers)
- 첫 풀이 및 정답풀이 이 문제를 처음 풀 때 이진수를 변환하는 메서드의 존재에 대해서는 알고 있었지만, 찾아보지 않고 한 번 풀어본 뒤 관련 정보를 찾아 다시 풀어보고자 했다. 필자가 풀어본 방식은 지도의 한 줄에 해당하는 arr1,arr2의 정수를 추출해 직접 이진수로 변환해 풀어보고자 했다. class Solution { // 1. 이진수 변환 메소드 및 자리수 n에 맞게 0을 채우기. public static String cal(int n,int len){ String str=""; // 1-1. 이진수 변환. while(n != 0){ str = n%2 + str; n/=2; } // 1-2. n 자릿수 채우기. while(str.length() != len){ str = "0"+str; } ..
[프로그래머스,Level 1] 예산(JAVA 구현)
·
CodingTest/프로그래머스(Programmers)
- 첫 풀이 및 정답풀이 간단한 문제라고 생각된다. 최대한 많은 부서를 지원하기 위해서는 가장 적은 예산을 요청한 부서들부터 순차적으로 지원해주면 된다. import java.util.Arrays; class Solution { public int solution(int[] d, int budget) { int answer = 0; int sum = 0; // 1. 예산 요청 정렬. Arrays.sort(d); // 2. 요청한 예산
[프로그래머스,Level 1] 키패드 누르기(JAVA 구현)
·
CodingTest/프로그래머스(Programmers)
- 첫 풀이 처음에는 이 문제에서 가운데 번호를 누르기 위해서 왼쪽, 오른쪽 손의 거리 차이에 따라 누루는 손이 결정된다는 것을 보고 bfs를 이용해 풀어보려고 했지만, 잘 해결되지 않아 검색을 통해 다른 분들의 풀이를 참고하였다. - 정답풀이 다른 분들의 주된 풀이로는 '맨해튼 거리 측정법'이었다. 관련 내용에 대해 간단히 찾아본 결과 맨해튼 거리 측정법은 유클리드 거리 측정법과는 다르게 점 A와 점 B의 사이에 장애물이 존재해 정해진 경로로만 이동이 가능하다는 차이점이 존재한다. 예를들어 왼손이 1번에 위치한 상태에서 5번을 누르기 위해서는 1-> 2-> 5 또는 1-> 4-> 5와 같이 대각선으로의 직접적인 이동이 불가능한 경우를 말한다. 맨해튼 거리 측정법의 공식은 |각 점의 X좌표 차이| + |..
[프로그래머스,Level 1] 내적(JAVA 구현)
·
CodingTest/프로그래머스(Programmers)
- 첫 풀이 및 정답풀이 아주 간단한 문제. class Solution { public int solution(int[] a, int[] b) { int answer = 0; // 1. 내적 공식에 맞게 연산처리. for(int i =0;i
[프로그래머스,Level 1] 3진법 뒤집기(JAVA 구현)
·
CodingTest/프로그래머스(Programmers)
- 첫 풀이 및 정답풀이 이 문제의 핵심은 10진법에서 n진법으로의 변환 방법을 알고 있냐는 것 같다. 10진법에서 특정 진법으로의 변환은 해당 진법의 수로 나누어 몫이 0이 나올 때까지 나머지를 역으로 취해주는 것이다. 예를 들어 예제 1번의 경우 45를 3으로 계속해서 나누어 몫이 0이 될 때 나머지를 거꾸로 취하면, 1200이 나오게 된다. 풀이 과정에서 3진법을 앞뒤 반전하는 과정이 존재한다. 위에서 설명하였듯이 특정 진법으로의 변환은 나머지를 반대로 취하는 것이다. 다시 말해 3진법을 앞뒤 반전하는 것은 그저 정수 n을 3으로 나눈 나머지를 순서대로 취해주면 된다는 의미이며, 이를 10진법으로 변환하면 된다. class Solution { public int solution(int n) { //..
[프로그래머스,Level 1] 크레인 인형뽑기 게임(JAVA 구현)
·
CodingTest/프로그래머스(Programmers)
- 첫 풀이 및 정답풀이 문제 내용이 좀 길긴 한데 천천히 읽어보면 별 문제 없다. 요점은 2차원 배열에는 1~100까지의 정수가 주어지는데, 이 정수는 서로 다른 인형들을 의미하는 것이며, 1차원 배열에는 2차원 배열의 몇 번째 열에서 인형을 뽑는지 주어진다. 여기서 뽑은 인형은 LIFO 구조의 바구니에 집어넣으며, 동일한 인형이 연속해서 집어넣어질 경우 두 개의 인형이 사라진다. 결국 사라진 인형의 개수를 반환하면 된다. 이 문제를 처음 풀 때는 인형을 담는 바구니를 ArrayList를 통해 인형을 모두 담아 연속하는 인형을 인덱스로 참조해 제거하는 방식을 사용하고자 했는데, 잘 생각해보니 인형이 1,2,2,1과 같은 순으로 들어갔다면 2번 인형들이 지워지고 그 자리에 1번이 내려와 또 다시 1번 인..
[프로그래머스,Level 1] 두 개 뽑아서 더하기(JAVA 구현)
·
CodingTest/프로그래머스(Programmers)
- 첫 풀이 및 정답풀이 이 문제는 하나의 배열에 주어지는 데이터들 중 서로 다른 인덱스를 가지는 원소의 합을 오름차순으로 정렬하여 반환하면 되는 문제이다. 여기서 주의해야 할 점은 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 구현)
·
CodingTest/프로그래머스(Programmers)
- 첫 풀이 및 정답풀이 이 문제의 경우 주어지는 두 가지 배열을 적절히 이용하면 풀 수 있다고 생각이 들었고, 문제에서 제시하는 자료구조인 해시를 이용해 풀어보고자 하였다. 해시를 많이 사용해보지 않아 공부하는 차원에서 처음부터 다른 분들의 풀이를 보고 풀어보았다. 이 문제의 핵심은 참여자 명단과 완주 명단이 주어지며, 두 명단 사이 크기 차이는 1이라는 점이다. 즉, 완주하지 못한 한 명을 찾아내는 것이 핵심이라 할 수 있다. import java.util.*; import java.util.Map.Entry; class Solution { public String solution(String[] participant, String[] completion) { String answer = ""; //..
[프로그래머스,Level 1] 모의고사(JAVA 구현)
·
CodingTest/프로그래머스(Programmers)
- 첫 풀이 이 문제는 처음 풀 때 문제에 대한 이해가 부족했었다. 문제에서의 조건은 '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..