알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://school.programmers.co.kr/learn/courses/30/lessons/12951#qna

 

프로그래머스

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

programmers.co.kr


Think🤔
class Solution {
    public String solution(String s) {
        s = s.toLowerCase();
        String[] splitS = s.split(" ");
        String answer = "";
        for(String str : splitS){
			answer += str.replace(str.charAt(0), str.toUpperCase().charAt(0));
			answer += " ";
		}
		
        return answer.trim();
    }
}

시간 느림 , 굳이 짜르고 붙여야 됨 , 안되는 경우도 있음..
class Solution {
    public String solution(String s) {
		s = s.toLowerCase();

        String answer = "";
        answer += String.valueOf(s.charAt(0)).toUpperCase();
        for(int i=1; i<s.length(); i++) {
        	if(s.charAt(i) == ' ' && i < s.length()) {
        		answer += " " + String.valueOf(s.charAt(i+1)).toUpperCase();
        		i++;
        	}else {
        		answer += s.charAt(i);
        	}
        }
        
        return answer;
    }
}

런타임 에러 및 실패

공백이 여러개인 경우 공백을 split로 짤라서 지워버렸기 때문에 이부분을 넣어줘야 함.
class Solution {
    public String solution(String s) {
		s = s.toLowerCase().trim(); // 처음에 공백 제거
		
		String answer = String.valueOf(s.charAt(0)).toUpperCase();
		
		for(int i=1; i<s.length(); i++) {
			if(s.charAt(i) == ' ' && s.charAt(i+1) == ' ') {
				answer += " ";
			}else if(s.charAt(i-1) == ' ' && s.charAt(i) != ' '){
				answer += String.valueOf(s.charAt(i)).toUpperCase();
			}else {
				answer += s.charAt(i);
			}
		}
        
        return answer;
    }
}

테스트 케이스 한개 실패, 살짝 어거지 느낌의 코딩 연속 공백을 방지 하긴 했는데 뭐에서 걸리지는 모르겠음.

Solution✍
class Solution {
    public String solution(String s) {
		s = s.toLowerCase(); // 처음에 공백 제거
		
		String answer = String.valueOf(s.charAt(0)).toUpperCase();
		
		for(int i=1; i<s.length(); i++) {
			if(s.charAt(i-1) == ' ' && s.charAt(i) != ' '){
				answer += String.valueOf(s.charAt(i)).toUpperCase();
			}else {
				answer += s.charAt(i);
			}
		}
        
        return answer;
    }
}

맨 처음에 trim()으로 짤라서 마지막에 공백이 두개 들어가는 경우를 계산하지 못헀음 ..

Review🤩

엄청 쉬울 것 같애서 얕봤다가 오래 걸림 ㅜ


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

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

 

프로그래머스

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

programmers.co.kr


Think🤔

쉬운 문제 math이용


Solution✍
class Solution {
    public String solution(String s) {
        
        String[] numS = s.split(" ");
        int tmp = Integer.parseInt(numS[0]);
        
        int maxS = Integer.parseInt(numS[0]);
        int minS = Integer.parseInt(numS[0]);
        for(String str : numS) {
        	maxS = Math.max(Integer.parseInt(str), maxS);
        	minS = Math.min(Integer.parseInt(str), minS);        	
        }
        
        return minS + " " + maxS;
    }
}

Review🤩

3항으로 풀어도 되고 , if문으로 해도 되고 split로 짜르기만 잘하면 됨


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

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

 

프로그래머스

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

programmers.co.kr


Think🤔
	public static void main(String[] args) {
		//String[] id_list, String[] report, int k
		String[] id_list = {"muzi", "frodo", "apeach", "neo"};
		String[] report = {"muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"};
		int k = 2;
		
		int[] report_list = new int[id_list.length];
		String[] report_back = new String[2]; // 신고받은 사람 
		
		for(int i=0; i<report.length; i++) {
			report_back = report[i].split(" ");
			for(int j=0; j<id_list.length; j++) {
				if(report_back[1].equals(id_list[j])) {
					report_list[j]++;
				}
			}
		}
		
		ArrayList arr = new ArrayList<>(); // 배열 크기가 얼마나 될지 모르므로 ArrayList 선언
		for(int i=0; i<report_list.length; i++) {
			if(report_list[i] >= k) {
				arr.add(id_list[i]);
			}
		}
		
		HashMap<String,Integer> map = new HashMap<>();
		for(int i=0; i<report.length; i++) {
			report_back = report[i].split(" ");
			for(int j=0; j<arr.size(); j++) {
				if(report_back[1].equals(arr.get(j))) {
					map.put(report_back[0], map.getOrDefault(report_back[0], 0)+1);
				}
			}
		}
		
		int[] ret = new int[id_list.length];
		for(int i=0; i<id_list.length; i++) {
			ret[i] = (map.get(id_list[i]) == null ? 0 :map.get(id_list[i]));
		}
		
		System.out.println(Arrays.toString(ret));
	}

신고가 k이상인 사람들을 찾아서 그 앞에 있는 ex) "무지 프로도" 이면 프로도가 신고 당했으니

무지의 위치를 찾아서 ++해주는 방법

두 번째 조건인 한 사람이 여러번 신고했을때를 걸러주지 못함..


Solution✍
package kcue.test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;

import org.aspectj.weaver.ast.Instanceof;

public class reportResult {

	public static void main(String[] args) {
		//String[] id_list, String[] report, int k
		String[] id_list = {"muzi", "frodo", "apeach", "neo"};
		String[] report = {"muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"};
		int k = 2;
		
		int[] retMail = new int[id_list.length]; // 받을 메일 횟수
		HashMap<String,Integer> reportMap = new HashMap<>();
		HashMap<String,HashSet<String>> reportMapNum = new HashMap<>();
		
		// 맵 세팅
		for(int i=0; i<id_list.length; i++) {
			reportMap.put(id_list[i], i);
			reportMapNum.put(id_list[i], new HashSet<String>());
		}
		
		// 보내는 사람 se 받는 사람 re
		for(int i=0; i<report.length; i++) {
			String[] split = report[i].split(" "); // 띄어쓰기로 구분
			String se = split[0];
			String re = split[1];
			reportMapNum.get(re).add(se);
		}
	
		for(int i=0; i<id_list.length; i++) {
			 HashSet<String> set = reportMapNum.get(id_list[i]);
			 if(set.size() >= k) {
				 for(String userid : set) {
					 retMail[reportMap.get(userid)]++;					 
				 }
			 }
		}
		
		System.out.println(Arrays.toString(retMail));
		
	}

}

HashSet을 이용해서 중복을 방지하고 , 

해쉬맵을 두개를 이용해서 

1. 이용자의 위치

2. 보내는 사람 , 받는 사람(중복 X)

 

를 이용해서 신고를 K이상 했을 경우 안에서 성공한 유저들에게 ++를 해준다,


Review🤩

내부에서 get.add 가능!


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

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

 

프로그래머스

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

programmers.co.kr


Think🤔

mbti 성격유형의 검사하는 문제

비동의를 누르면 앞에 있는 성격 유형에 + 점수

동의를 누르면 뒤에 있는 성격 유형에 + 점수

 

모르겠음의 점수는 4를 클릭했을 때이고, 이럴 경우 점수가 들어가지 않으므로 빠르게 끝냄

점수가 같을 경우 or 해당 유형의 질문이 없는 경우 A,B,C순 사전순으로 나열한다.

 

String으로 올릴경우 0~9까지 밖에 안되므로 pass

class Solution {
    public String solution(String[] survey, int[] choices) {
        String answer = "";
        String categoryList = "R0T0C0F0J0M0A0N0"; // 뒤에 점수
        int question = survey.length; // 질문지 갯수
        
        for(int i=0; i<question; i++){
            if(choices[i] == 4){
                continue;
            }else if(choices[i] < 4){
                survey[i].charAt(0);
            }
        }
        
        return answer;
    }
}
package kcue.test;

public class mbtiTeST {

	public static void main(String[] args) {

		String[] survey = { "AN", "CF", "MJ", "RT", "NA" };
//		String[] survey = { "TR", "RT", "TR" };
		
		int[] choices = { 5, 3, 2, 7, 5 };
//		int[] choices = { 7, 1, 3};

		String answer = "";
		String mbti = "RTCFJMAN";
		String mbtiCnt = "00000000";

		// 설문 조사 크기 만큼
		for (int i = 0; i < survey.length; i++) {
			int tmp = 0;
			int scoreCnt = 0;
			if (choices[i] == 4) {
				continue;
			} else if (choices[i] < 4) { // 비동의 앞에꺼 ++ 점수
				tmp = mbti.indexOf(survey[i].charAt(0)); // mbti에서 위치가 어디인지
				scoreCnt = mbtiCnt.charAt(tmp) + choices[i]; // 더 해진 값
			} else { // 동의 뒤에꺼 ++ 점수
				tmp = mbti.indexOf(survey[i].charAt(1));
				scoreCnt = mbtiCnt.charAt(tmp) + choices[i] - 4;
			}
			mbtiCnt = mbtiCnt.substring(0, tmp) + String.valueOf(scoreCnt) + mbtiCnt.substring(tmp + 1);
		}

		// 두개씩 비교
		for (int i = 0; i < 8; i += 2) {
			if (mbtiCnt.charAt(0) >= mbtiCnt.charAt(1)) {
				answer += mbti.charAt(i);
			} else {
				answer += mbti.charAt(i + 1);
			}
			System.out.println(answer + " : answer , " + i + " : i 값");
			// (mbtiCnt.charAt(0) >= mbtiCnt.charAt(1)) ? answer += mbti.charAt(i) : answer
			// += mbti.charAt(i+1);
		}
		System.out.println(answer);
	}

}

고민하다가 바꾼 방법들 .. String이 제일 편한 것 같다!

class Solution {
    public String solution(String[] survey, int[] choices) {
        String answer = "";
		String mbti = "RTCFJMAN";
		String mbtiCnt = "00000000";
		
		// 설문 조사 크기 만큼 
		for(int i=0; i<survey.length; i++){
			int tmp = 0;
			if(choices[i] == 4){
				continue;
			}else if(choices[i] < 4){
				//비동의
				tmp = mbti.indexOf(survey[0]);
				mbtiCnt.charAt(tmp) -= choices[i];
			}else{
				tmp = mbti.indexOf(survey[1]);
				mbtiCnt.charAt(tmp) += choices[i] - 4;
			}
		}
		
		// 두개씩 비교
		for(int i=0; i<8; i+=2){
			(mbtiCnt.charAt(0) >= mbtiCnt.charAt(1)) ? answer += mbti.charAt(i) : answer += mbti.charAt(i+1);  
		}
        
        return answer;
    }
}

class Solution {
    public String solution(String[] survey, int[] choices) {
        String answer = "";
        String categoryList = "R0T0C0F0J0M0A0N0"; // 뒤에 점수
        int question = survey.length; // 질문지 갯수
        
        for(int i=0; i<question; i++){
            if(choices[i] == 4){
                continue;
            }else if(choices[i] < 4){
				int tmp = categoryList.indexOf(survey[i].charAt(0));
				categoryList.charAt(tmp) -= choices[i];
            }else{
				int tmp = categoryList.indexOf(survey[i].charAt(0));
				categoryList.charAt(tmp) += choices[i] - 4; // 5,6,7 = 1,2,3 이기 때문
			}
        }
		
		// 점수가 큰 알파벳 부터
		// 배열을 두개를 하면 복잡하게 안해도 될 것 같은데 ..
		for()
        
        return answer;
    }
}







class Solution {
    public String solution(String[] survey, int[] choices) {
		HashMap<Character, Integer> hs = {{'R',0},{'T',0},{'C',0},{'F',0},{'J',0},{'M',0},{'A',0},{'N',0}};
		// Map.of('R',0); Java9 version 이상
		// Map.of를 사용하면 갯수 제한 있음
		hs.put('R',0);
		hs.put('T',0);
		hs.put('C',0);
		hs.put('F',0);
		hs.put('J',0);
		hs.put('M',0);
		hs.put('A',0);
		hs.put('N',0);
		
		for(Character i : choices){
			if(choices == 4){
				continue;
			}else if(choices < 4){
				hs.put(survey[0], hs.getOrDefault(survey[0],0) + choices);
			}else{
				hs.put(survey[1], hs.getOrDefault(survey[1],0) + choices);
			}
		}
		
		// 마지막에 어차피 꺼내서 다 비교해야함 ... 
		
        
        return answer;
    }
}

String으로 했을 경우 0~9까지 밖에 안돌아가므로 성격유형의 검사가 많은 경우 방법을 바꿔줘야 함..

R000T000 이런식으로 survey의 길이만큼 만들어줘야 함..! hashMap이 편할 것 같다


Solution✍
package kcue.test;

import java.util.HashMap;

public class mbtiHashMap {
	public static void main(String[] args) {
		String answer = "";
		
		String[] survey = { "AN", "CF", "MJ", "RT", "NA" };
//		String[] survey = { "TR", "RT", "TR" };
		
		int[] choices = { 5, 3, 2, 7, 5 };
//		int[] choices = { 7, 1, 3};
		
		HashMap<Character, Integer> hs = new HashMap<>();
		// Map.of('R',0); Java9 version 이상
		// Map.of를 사용하면 갯수 제한 있음
		hs.put('R',0);
		hs.put('T',0);
		hs.put('C',0);
		hs.put('F',0);
		hs.put('J',0);
		hs.put('M',0);
		hs.put('A',0);
		hs.put('N',0);
		
		for (int i = 0; i < survey.length; i++) {
			int cnt = 0;
			if (choices[i] == 4) {
				continue;
			} else if (choices[i] < 4) { 			  // 비동의 앞에꺼 ++ 점수
				cnt = hs.get(survey[i].charAt(0));
				hs.put(survey[i].charAt(0), cnt + 4 - choices[i]);
			} else { 								// 동의 뒤에꺼 ++ 점수
				cnt = hs.get(survey[i].charAt(1));
				hs.put(survey[i].charAt(1), cnt + choices[i] - 4);				
			}
		}
		
		answer += (hs.get('R') >= hs.get('T')) ? "R" : "T";
		answer += (hs.get('C') >= hs.get('F')) ? "C" : "F";
		answer += (hs.get('J') >= hs.get('M')) ? "J" : "M";
		answer += (hs.get('A') >= hs.get('N')) ? "A" : "N";
		
		System.out.println(answer);
	}
}

Review🤩

-


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

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

 

프로그래머스

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

programmers.co.kr


Think🤔
package kcue.test;

public class crane {

	public static void main(String[] args) {
		int[][] board = { { 0, 0, 0, 0, 0 }, { 0, 0, 1, 0, 3 }, { 0, 2, 5, 0, 1 }, { 4, 2, 4, 4, 2 },
				{ 3, 5, 1, 3, 1 } };
		int[] moves = { 1, 5, 3, 5, 1, 2, 1, 4 };
		int answer = 0;
		String bowl = "";

		for (int i = 0; i < moves.length; i++) {
			int point = moves[i] - 1; // 배열 4번까지이고 , moves에서 1을 선택하면 0의 배열을 고를 수 있도록 -1
			for (int j = 0; j < board[point].length; j++) {
				if (board[j][point] != 0) {
					bowl += String.valueOf(board[j][point]);
					board[j][point] = 0; // 뽑은거 0으로 바꿔줘야함
					break;
				}
			}
		}
		answer = pair(bowl);

		System.out.println(answer);
	}

	public static int pair(String cert) {
		StringBuilder tmp = new StringBuilder(cert);
		int cnt = 0; // 정답 갯수
		for (int i = 0; i < tmp.length(); i++) {
			if (tmp.length() - 1 > i) { // i가 2일떄 +1과 비교하기 떄문에 length가 3이면 0,1,2 이여서 3이 존재 X
				System.out.println("tmp.length() : " + tmp.length());
				System.out.println("i : " + i);
				if (tmp.charAt(i) == tmp.charAt(i + 1)) {
					tmp.deleteCharAt(i);
					tmp.deleteCharAt(i);
					i = i - 2; // i는 제거 됐으므로 다시
					cnt++;
				}
			}
		}
		return cnt * 2;
	}

}

Stack을 구현하지  않고 , for문을 -2 해줌으로써 , 다시 원래 자리에서 반복문을 돌게하는 방법

3개만 통과고 나머지 실패.. 뭐가 문제?

 

ArrayList로 바꾸니 통과 .. 문제점 정확히 모르겠음 .. Stack으로 구현!


Solution✍
import java.util.Stack;
class Solution {
    public int solution(int[][] board, int[] moves) {
		int answer = 0;
		Stack<Integer> stack = new Stack<>();

		for (int i = 0; i < moves.length; i++) {
			int point = moves[i] - 1;
			for (int j = 0; j < board[point].length; j++) {
				if (board[j][point] != 0) {
					stack.push(board[j][point]);
					board[j][point] = 0; // 뽑은거 0으로 바꿔줘야함
                    break; // 인형하나 뽑았으니깐 멈춰줘야 됨.
				}
			}
				
			if(stack.size() > 1){ // 뽑은 인형이 2개 이상일 시 페어가 돼서 없어진다
				int num1 = stack.pop();
				int num2 = stack.pop();
				if(num1 != num2){
					stack.push(num2);
					stack.push(num1);
					continue;
				}else{
					answer += 2;
				}
			}
		}

		return answer;
	}
  }

Review🤩

Stack 좋다


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

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

 

프로그래머스

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

programmers.co.kr


Think🤔

지문이 기므로 문제 파악을 정확히 해야된다!

package kcue.test;

public class pushKeypad {

	public static void main(String[] args) {
		int numbers[] = {1,3,4,5,8,2,1,4,5,9,5}; 	String hand = "right";	// result : "LRLLLRLLRRL"
		//int numbers[] = {7,0,8,2,8,3,1,5,7,6,2};	String hand = "left";	// result : "LRLLRRLLLRR"
		//int numbers[] = {1,2,3,4,5,6,7,8,9,0};	String hand = "right";	// result : "LLRLLRLLRL"
		
		String answer = "";
		int nowLeft  = 10; 
		int nowRight = 12; // 현재 위치
		
		for(int i=0; i<numbers.length; i++) {
			if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
				answer += "L";
				continue;
			}else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
				answer += "R";
				continue;
			}else {
				numbers[i] = (numbers[i] == 0 ) ? 11 : numbers[i];
				
				answer += calCulate(nowLeft,nowRight,numbers[i],hand);
			}
		}
		
		System.out.println(answer);
		
	}
	
	// 거리 계산
	public static String calCulate(int left , int right , int point , String hand) { // main에서 실행 하기 위해 static에 메소드 올려줌
		int leftD = 0,rightD = 0; // D : Distance(거리)
		if(point == left + 1 || point == left - 1) { // 좌우일 경우 거리 1
			leftD++;
		}else {
			leftD = (point / left) + ((point % left < 3) ? 1 : 0);
		}
		if(point == right + 1 || point == right - 1) {
			rightD++;
		}else {
			rightD = (point / right) + ((point % right < 3) ? 1 : 0);
		}
		
		
		if(leftD > rightD) {
			// nowLeft  = point;
			return "L";
		}else if(leftD < rightD) {
			// nowRight = point;
			return "R";
		}else
			// point 가 left면 nowLeft = point;
			// point 가 right면 nowRight = point;
		return String.valueOf(hand.charAt(0));
	}

}
package kcue.test;

public class pushKeypad2 {

	public static void main(String[] args) {
		int numbers[] = {1,3,4,5,8,2,1,4,5,9,5}; 	String hand = "right";	// result : "LRLLLRLLRRL"
		//int numbers[] = {7,0,8,2,8,3,1,5,7,6,2};	String hand = "left";	// result : "LRLLRRLLLRR"
		//int numbers[] = {1,2,3,4,5,6,7,8,9,0};	String hand = "right";	// result : "LLRLLRLLRL"
		
		String answer = "";
		int nowLeft  = 10; 
		int nowRight = 12; // 현재 위치
		// 4 5 8 
        for(int i=0; i<numbers.length; i++) {
        	System.out.println("numbers[i] : " + numbers[i]);
			if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
				answer += "L";
				nowLeft = numbers[i];
				continue;
			}else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
				answer += "R";
				nowRight = numbers[i];
				continue;
			}else {
				numbers[i] = (numbers[i] == 0 ) ? 11 : numbers[i];
				
				// 계산
                int leftD = 0,rightD = 0; // D : Distance(거리)
                if(numbers[i] == nowLeft + 1 || numbers[i] == nowLeft - 1) { // 좌우일 경우 거리 1
                    leftD++;
                }else if(numbers[i] == nowLeft + 3 || numbers[i] == nowLeft - 3) { // 위아래 경우 거리 1
                    leftD++;
                }else {
                    leftD = (numbers[i] / nowLeft) + ((numbers[i] % nowLeft < 3) ? 1 : 0);
                }
                
                if(numbers[i] == nowRight + 1 || numbers[i] == nowRight - 1) {
                    rightD++;
                }else if(numbers[i] == nowRight + 3 || numbers[i] == nowRight - 3) { // 위아래 경우 거리 1
                	rightD++;
                }else {
                    rightD = (numbers[i] / nowRight) + ((numbers[i] % nowRight < 3) ? 1 : 0);
                }
                
                if(leftD == 0) {
                	answer += "R";
                	continue;
                }else if(rightD == 0){
                	answer += "L";
                	continue;
                }else {
                	
                }

                if(leftD < rightD) {
                    nowLeft  = numbers[i];
                    answer += "L";
                }else if(leftD > rightD) {
                    nowRight = numbers[i];
                    answer += "R";
                }else{
                    if(hand.equals("left")){
                        nowLeft = numbers[i];
                    }else{
                        nowRight = numbers[i];
                    }
                    answer += String.valueOf(hand.charAt(0)).toUpperCase();
                }
			}
		}
		
		System.out.println(answer);
	}

}

규칙을 찾아서 일단 if else로 만들었으나... 잘못 푼 듯했는데!! 

다른 풀이 보니깐 정말 비슷한 코드가 있으므로 중간에 거리 계산해주는 부분을 리팩터링 할 필요가 있다!

 

거리 구하는 부분을 수정할 필요가 있음 

중복되는 코드가 있으므로 메서드를 생성


Solution✍

노트에 먼저 

1 2 3

4 5 6

7 8 9

* 0 #

을 노트에 그리고.. 문제에서 주어지는 배열은 다 숫자이기 때문에 키패드에서 문자를 누를 일이 없으므로 , 처음 값에 대입

숫자를 순서대로 대입하고 0이나오면 중간 값인 11로 변환시킨다!

package kcue.test;

public class pushKeypad2 {

	public static void main(String[] args) {
		int numbers[] = { 1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5 };
		String hand = "right"; // result : "LRLLLRLLRRL"
		// int numbers[] = {7,0,8,2,8,3,1,5,7,6,2}; String hand = "left"; // result : "LRLLRRLLLRR"
		// int numbers[] = {1,2,3,4,5,6,7,8,9,0};   String hand = "right";// result : "LLRLLRLLRL"

		String answer = "";
		int nowLeft = 10;
		int nowRight = 12; // 현재 위치
		int leftD = 0, rightD = 0;
		// 4 5 8
		for (int i = 0; i < numbers.length; i++) {
			System.out.println("numbers[i] : " + numbers[i]);
			if (numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
				answer += "L";
				nowLeft = numbers[i];
				continue;
			} else if (numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {
				answer += "R";
				nowRight = numbers[i];
				continue;
			} else {
				numbers[i] = (numbers[i] == 0) ? 11 : numbers[i]; // 0의 위치면 11
				leftD = calCulate(nowLeft, numbers[i]);
				rightD = calCulate(nowRight, numbers[i]);

				if (leftD < rightD) {
					nowLeft = numbers[i];
					answer += "L";
				} else if (leftD > rightD) {
					nowRight = numbers[i];
					answer += "R";
				} else {
					if (hand.equals("left")) {
						nowLeft = numbers[i];
					} else {
						nowRight = numbers[i];
					}
					answer += String.valueOf(hand.charAt(0)).toUpperCase();
				}
			}
		}

		System.out.println(answer);
	}

	// 거리계산
	public static int calCulate(int nowPoint, int num) {
		int distance = 0;

		distance = (Math.abs(num - nowPoint) / 3) + (Math.abs(num - nowPoint) % 3);

		return distance;
	}

}

Review🤩

거리 계산에 머리 써야 됨!


 

+ Recent posts