제한사항
입출력 예
dots | result |
---|---|
[[1, 1], [2, 1], [2, 2], [1, 2]] | 1 |
[[-1, -1], [1, 1], [1, -1], [-1, 1]] | 4 |
입출력 예 설명
나의 풀이
package 프로그래머스;
public class RectangleArea {
public static int solution(int[][] dots) {
int minX = dots[0][0];
int maxX = dots[0][0];
int minY = dots[0][1];
int maxY = dots[0][1];
for(int i = 1 ; i < dots.length; i++) {
if(dots[i][0] < minX) {
minX = dots[i][0];
}
if(dots[i][0] > maxX) {
maxX = dots[i][0];
}
if(dots[i][1] < minY) {
minY = dots[i][1];
}
if(dots[i][1] > maxY) {
maxY = dots[i][1];
}
}
return maxX-minX * maxY-minY;
}
public static void main(String[] args) {
int[][] dots = {{-1, -1}, {1, 1}, {1, -1}, {-1, 1}};
solution(dots);
}
}
나의 생각
알고리즘 문제를 풀다보면, 어... 이거 당연히 이거 아냐??? 이런 경우가 제법있다... 이번 문제 역시
가로
,세로
길이를 한 번에 알 수 있지만, 이를 어떻게 표현할까.. 나는 제일 먼저 노트를 펴고, 4분면을 그린 뒤 해당 점의 좌표를 찍었다. 점 네 개를 찍다보면 사각형이 그려지는데 만약, 네 개의 점을 무작위로 주어진다면 문제를 어떻게 풀 수 있을까??
내가 생각했던 방법은 x좌표의최대값
과최소값
의 차이가x성분의 길이
, y좌표의최대값
과최소값
의 차이가y성분의 길이
라고 생각하였다.
따라서, 사각형의 넓이 :(x최대값 - x최소값) * (y최대값 - y최소값)
으로 나타낼 수 있다.
{-1, -1}, {1, 1}, {1, -1}, {-1, 1}
네 개의 좌표에서 X점, Y점의 최소, 최대는 배열 첫번째 원소의 X, Y의 값을 기준으로 for문을 돌려 최소값보다 작으면 min값을 해당값으로 대체하고, 최대값보다 크면 max값을 해당값으로 대체하여 찾을 수 있다.
제한사항
입출력 예
keyinput | board | result |
---|---|---|
["left", "right", "up", "right", "right"] | [11, 11] | [2, 1] |
["down", "down", "down", "down", "down"] | [7, 9] | [0, -4] |
입출력 예 설명
나의 풀이
package 프로그래머스;
import java.util.Arrays;
public class Coordinate {
public static int[] solution(String[] keyinput, int[] board) {
int[] answer = new int[2];
int x = 0;
int y = 0;
for(int i = 0; i < keyinput.length; i++) {
if(keyinput[i].equals("up")) {
y++;
}else if(keyinput[i].equals("down")) {
y--;
}else if (keyinput[i].equals("left")) {
x--;
}else {
x++;
}
if(x < -(board[0]/2)){
x = -(board[0]/2);
}else if (x > board[0]/2) {
x = board[0]/2;
}
if(y < -(board[1]/2)) {
y = -(board[1]/2);
}else if (y > board[1]/2) {
y = board[1]/2;
}
}
answer[0] = x;
answer[1] = y;
return answer;
}
public static void main(String[] args) {
String[] keyinput = {"down", "down", "down", "down", "down"};
int[] board = {7,9};
solution(keyinput, board);
}
}
나의 생각
의식의 흐름에 따라 문제를 풀었는데, 생각보다 높은 점수를 받게돼서 놀랐다. 처음에는 left
, right
, up
, down
을 배열로 담을 생각이였는데, 배열의 좌표를 이용해서 더하는 방법보다 x축, y축 따로 더하는게 더 쉽게 풀 수 있을꺼 같았다. 매개변수 String[] keyinput
을 반복을 돌려 keyinput
배열에 들어 있는 인수를 up, dwon, left, right
와 비교하여 x,y
값을 증가 시키는 방법을 사용하였다. 그 외에는 board의 사이즈가 주어지는데, 이 범위를 벗어나게 되면, 범위를 벗어나기 전
의 값을 x, y
값에 넣었다.
if(x < -(board[0]/2)){
x = -(board[0]/2);
}else if (x > board[0]/2) {
x = board[0]/2;
}
if(y < -(board[1]/2)) {
y = -(board[1]/2);
}else if (y > board[1]/2) {
y = board[1]/2;
}
위의 코드를 통해, x
와 y
값을 board
의 크기를 기준으로 한 범위 내에서만 움직일 수 있도록 범위를 제한하였다.
좀 더 클린한 코드로 다듬기
변경 전 | 변경 후 |
---|---|
![]() | ![]() |
정수 M, N이 매개변수로 주어질 때, M x N 크기의 종이를 최소로 가위질 해야하는 횟수를 return 하도록 solution 함수를 완성해보세요.
입출력 예
M | N | result |
---|---|---|
2 | 2 | 3 |
2 | 5 | 9 |
1 | 1 | 0 |
입출력 예 설명
나의 풀이
package 프로그래머스;
public class PaperCut {
public static int solution(int M, int N) {
return M*N-1;
}
public static void main(String[] args) {
solution(2,5);
}
}
나의 생각
입출력 예를 보는데 보자마자 특정 규칙이 눈에 보였다... M * N - 1
,
2 * 2 - 1 = 3
2 * 5 - 1 = 9
1 * 1 - 1 = 0
혹시나 싶어 노트를 펴고 직접 그려보니, 공식이 성립함을 확인할 수 있었다.
이번문제는 쉬어가라는 의미의 문제인것으로 !
제한사항
입출력 예
id_pw | db | result |
---|---|---|
["meosseugi", "1234"] | [["rardss", "123"], ["yyoom", "1234"], ["meosseugi", "1234"]] | "login" |
["programmer01", "15789"] | [["programmer02", "111111"], ["programmer00", "134"], ["programmer01", "1145"]] | "wrong pw" |
["rabbit04", "98761"] | [["jaja11", "98761"], ["krong0313", "29440"], ["rabbit00", "111333"]] | "fail" |
입출력 예 설명
db
에 같은 정보의 계정이 있으므로 "login"을 return합니다.db
에 아이디는 같지만 패지스워드가 다른 계정이 있으므로 "wrong pw"를 return합니다.db
에 아이디가 맞는 계정이 없으므로 "fail"을 return합니다.나의 풀이
package 프로그래머스;
public class LoginSucceed {
public static String solution(String[] id_pw, String[][] db) {
for(int i = 0 ; i < db.length; i++) {
if(db[i][0].equals(id_pw[0])) {
if(db[i][1 ].equals(id_pw[1]) ) {
return "login";
}else {
return "wrong pw";
}
}
}
return "fail";
}
public static void main(String[] args) {
String[] id_pw = {"meosseugi", "0000"};
String[][] db = {{"rardss", "123"},{"yyoom", "1234"},{"meosseugi", "1234"}};
solution(id_pw,db);
}
}
나의 생각
내가 풀었던 방법을 로직으로 구성해본다면,
- 아이디가 일치하는가 ->
Yes
- 비밀번호가 일치하는 가 ->
Yes
- ->
NO
- ->
NO
먼저, 아이디 일치 여부를 판별 후, 비밀번호가 일치한다면 login
, 비밀번호가 일치하지 않으면 wrong pw
, 아이디와 비밀번호 모두 일치하지않으면 fail
이라는 로직을 구성하였다. id_pw
는 배열의 크기가 2로 고정돼 있기때문에 id_pw의 배열의 index값을 직접 지정
하여, db배열에 들어 있는 값과 같은지 아닌지를 판별했다.
입출력 예
chicken | result |
---|---|
100 | 11 |
1,081 | 120 |
입출력 예 설명
입출력 예 #1
입출력 예 #2
나의 풀이
package 프로그래머스;
public class ChickenCoupon {
public static int solution(int chicken) {
int answer = 0;
int coupon = chicken;
int serviceChicken = 0;
while(coupon >= 10 ) {
serviceChicken = coupon / 10;
coupon = serviceChicken + coupon % 10;
answer += serviceChicken;
}
return answer;
}
public static void main(String[] args) {
solution(1081);
}
}
나의 생각
내가 생각하는 이 문제의 핵심은 coupon
이다. 즉,coupon
이 몇 장 있는가에 따라서 서비스 치킨을 받을 수 있다는 의미이다. 그렇기때문에, while문의 조건 역시 coupon의 수가 되어야하고, coupon 10장 = chicken 1마리
이기때문에 coupon이 10보다 크거나 같을때까지 while문의 반복을 수행한다. coupon
의 초기값은 매개변수로 주어진chicken
의 수와 동일하다. 따라서, 다음과 같은 로직을 구성할 수 있다.
serviceChicken = coupon / 10
coupon = serviceChicken + coupon % 10
- chicken 이었던 serviceChicken 이었던 결국
coupon
이다
따라서, 최종적으로 서비스로 받은 치킨은 120마리
좀 더 클린하게 작성한 코드
public class ChickenCoupon {
public static int solution(int chicken) {
int coupon = chicken;
int serviceChicken = 0;
while(coupon >= 10 ) {
serviceChicken += coupon / 10;
coupon = coupon / 10 + coupon % 10;
}
return serviceChicken;
}
public static void main(String[] args) {
solution(1081);
}
}
기존의 코드에서는 answer
변수는 불필요하게 사용되어 지워지고, 문제에서 원하는 서비스로 받은 치킨의 총 수
인serviceChicken
변수가 return 값
으로 사용되도록 변경