프로그래머스 lv1 0703

HyeJi9908·2022년 7월 3일
0

[JAVA] 프로그래머스

목록 보기
3/11

🔎 개념

배열에서 특정 원소의 인덱스 찾기

String[] arr = {"a","b","c"};
System.out.println(Arrays.asList(arr).indexOf("b"));

숫자를 문자로 변환

int from_num = 100;
String to_st;
to_st = Integer.toString(from_num);

숫자문자열을 숫자로 변환

int n=0;
n= Integer.parseInt(String);

replace와 replaceAll의 차이 참고


replace는 문자열만 입력가능하고, 문자열만 반환가능함
replace는 정규식을 입력하여 문자열을 반환함

스택 사용법

큐 사용법

import java.util.LinkedList; //import
import java.util.Queue; //import

Queue<Integer> queue = new LinkedList<>(); //int형 queue 선언, linkedlist 이용

queue.add(2);     // queue에 값 2 추가
queue.offer(3);   // queue에 값 3 추가

queue.poll();       // queue에 첫번째 값을 반환하고 제거, 비어있다면 null 반환
queue.remove();     // queue에 첫번째 값 제거
queue.peek();       // queue의 첫번째 값 참조
queue.clear();      // queue 초기화

ArrayList

일반 배열은 크기가 고정되어있어 선언할 때 크기를 정하고 값을 미리 할당해야함

// 일반 배열 
String[] arr = new String[5];
arr[0] = "1";
arr[1] = "2";
arr[2] = "3";
arr[3] = "4";
arr[4] = "5";

ArrayList는 유동적임

        List<String> testList = new ArrayList<String>();
        testList.add("1");
        testList.add("2");
        testList.add("3");
        testList.add("4");
        testList.add("5");
        
        //Create an array
        String[] arr = new String[1];
        arr[0] = "1";
        //Convert to ArrayList
        List<String> testList = new ArrayList<>(Arrays.asList(arr));

Map에 배열 할당하기

Map에 배열을 넣기 위해서는 넣을 배열을 미리 생성해놓은 뒤, for문으로 할당하기

    	int arr[][] = {{3,1},{0,0},{0,1},{0,2},{1,0},{1,1},{1,2},{2,0},{2,1},{2,2}};
    	HashMap<Integer,int[]> keypad = new HashMap<>();
    	
    	for(int i=0;i<arr.length;i++) {
    		keypad.put(i,arr[i]);
    	}

배열과 리스트의 차이 참고

배열은 고정된 크기, 리스트는 유동적 크기
리스트는 ArrayList / LinkedList로 나뉨
리스트 원소 추가 add()/값 반환 get()

절댓값, 최댓값 구하기

int num=0;
num = Math.abs(num);
num = Math.max(3,6); // 2개씩만 비교 가능

다중 반복문에서 특정 반복문 탈출하기

Loop1 :
for(int i=0; i<3; i++){
   Loop2 :
   for(int j=0; j<3; j++){
      System.out.println("i="+i + " j="+j);
      if (j==1){
         break Loop1;     // end of Loop1(i)
         //break;         // end of Loop2(j)
         //break Loop2;   // end of Loop2(j)
      }
   }
}

주의! 문자열 일치 여부 판단

String.equals(String);

문자열과 숫자간 변환

// 숫자를 문자열로 변환
String num = Integer.toString(3);
String toString_numbers = Arrays.toString(numbers); 

// 문자열을 숫자로 
Integer.parseInt(num); 

📚 숫자 문자열과 영단어 - Hash

방법1) String[] 과 인덱스 활용

import java.util.Arrays;

class Solution {
    public int solution(String s) {
    	
        String[] arr= {"zero","one","two","three","four","five","six","seven","eight","nine"};
        
        for(String str : arr) {
        	int idx = Arrays.asList(arr).indexOf(str);
        	s=s.replaceAll(str, Integer.toString(idx));
        }
        
        int answer = Integer.parseInt(s);
        return answer;
    }
}

방법2) HashMap 활용

import java.util.HashMap;

 HashMap<String,Integer> map = new HashMap<>();
 String[] arr= {"zero","one","two","three","four","five","six","seven","eight","nine"};
 
 for(int i=0; i<arr.length();i++){
	 map.put(arr[i], i);
 }
 
 for (String key:map.keySet()) {
	 s = s.replaceAll(key,map.get(key));
 }

📚 키패드 누르기

- 수정 전

import java.util.*;

class Solution {
    public String solution(int[] numbers, String hand) {
    	
    	String answer = "";
    	Queue<Integer> queue = new LinkedList<>();
    	
    	// 스택에 데이터 추가
    	for(int i:numbers) {
    		queue.add(i); // 또는 offer()
    	}
    	
    	// 양 손의 위치
    	// 일반 배열은 크기가 고정되어있지만 ArrayList는 크키가 고정되어있지 않기에 값을 추가하기 쉽다.
    	List<Integer> l_hands = new ArrayList<Integer>();
    	List<Integer> r_hands = new ArrayList<Integer>();    	
    	
    	// 키패드에 따른 좌표
    	// Map에 배열을 넣기 위해서는 넣을 배열을 미리 생성해놔야 함
    	int arr[][] = {{3,1},{0,0},{0,1},{0,2},{1,0},{1,1},{1,2},{2,0},{2,1},{2,2}};
    	HashMap<Integer,int[]> keypad = new HashMap<>();
    	
    	for(int i=0;i<arr.length;i++) {
    		keypad.put(i,arr[i]);
    	}
    	
    	while(!queue.isEmpty()) {
    		int x= queue.poll();
    		if(x==1||x==4||x==7) {
    			l_hands.add(x);
    			answer+="L";
    		}
    		else if(x==3||x==6||x==9) {
    			r_hands.add(x);
    			answer+="R";
    		}
    		else { 							// 가운데 키패드 누르기, 더 가까운 손가락의 거리 구하기
    			int ky = keypad.get(x)[0];
    			int kx = keypad.get(x)[1];
    			
    			int ly=0; int lx =0;
    			if(!l_hands.isEmpty()) {
    				ly = keypad.get(l_hands.get(l_hands.size()-1))[0];
    				lx = keypad.get(l_hands.get(l_hands.size()-1))[1];
    			}  
    			else {
    				ly=3;
    				lx =0;
    			}
    			
    			int ry=0; int rx=0;
    			if(!r_hands.isEmpty()) {
    				ry = keypad.get(r_hands.get(r_hands.size()-1))[0];
    				rx = keypad.get(r_hands.get(r_hands.size()-1))[1];
    			}
    			else {
    				ry=3;
    				rx=2;
    			}
    			
    			if ( Math.abs(ly-ky)+Math.abs(lx-kx)>Math.abs(ry-ky)+Math.abs(rx-kx)) {
    				r_hands.add(x);
    				answer+="R";
    			}
    			else if ( Math.abs(ly-ky)+Math.abs(lx-kx)<Math.abs(ry-ky)+Math.abs(rx-kx)) {
    				l_hands.add(x);
    				answer+="L";
    			}
    			else {
    				if (hand.equals("left")) {
    					l_hands.add(x);
    					answer+="L";
    				}
    				else {
    					r_hands.add(x);
    					answer+="R";
    				}
    			}
    			
    			
    		}
    	}
    	
        
        return answer;
    }
}

- 수정 후

큐, ArrayList 제외
전역변수 left,right에 할당함으로써 List사용 안해도 됨!

import java.util.*;

class Solution{
	
	public String solution(int[] numbers, String hand) {

		String answer="";
		int left =10;
		int right = 12;
		
		for(int num:numbers) {
			if(num==1||num==4||num==7) {
				answer+="L";
				left = num;
			}
			else if(num==3||num==6||num==9) {
				answer+="R";
				right=num;
			}
			else {			               // 가운데 키패드 누르기, 더 가까운 손가락의 거리 구하기
				if(num==0) 
					num=11;
				
				int left_dist = Math.abs(num-left)/3 + Math.abs(num-left)%3; // 위아래 거리 + 좌우거리
				int right_dist = Math.abs(num-right)/3 + Math.abs(num-right)%3;
				
				if(left_dist<right_dist) {
					answer +="L";
					left = num;
				}else if ( left_dist>right_dist) {
					answer +="R";
					right = num;
				}else {
					if(hand.equals("left")) {
						answer+="L";
						left = num;
					}else {
						answer+="R";
						right = num;
					}
				}
			}
		}
		return answer;
	}
}

📚 없는 숫자 더하기

import java.util.Arrays;

class java0703_3 {
	String[] arr= {"0","1","2","3","4","5","6","7","8","9"}; // contain() 를 쓰기위해 각 원소가 String 이어야 함
	
	public int solution(int[] numbers) {
		int answer=0;
		String toString_numbers = Arrays.toString(numbers); // 숫자 배열을 문자열로 변환
		
		for( String num: arr) {
			if(toString_numbers.contains(num)) { // contain(String)
				continue;
			}else {
				answer+=Integer.parseInt(num); // 문자열을 숫자로 
			}
		}
		
		return answer;
	}
}

📚 음양 더하기

class Solution {
    public int solution(int[] absolutes, boolean[] signs) {
        int answer = 0;
        
        for(int i=0;i<absolutes.length;i++) {
        	if(signs[i]) {
        		answer+=absolutes[i];
        	}else {
        		answer-=absolutes[i];
        	}
        }
//        // Or 삼항연산자 이용
//        for (int i = 0; i < absolutes.length; i++) {
//            answer += (signs[i]) ? absolutes[i] : -absolutes[i];
//        }
        
        return answer;
    }
}

📚 크레인 인형뽑기 게임 - Stack

import java.util.*;

class java0703_5 {
	
	public int solution(int[][] board, int[] moves) {
		int answer = 0;

		Stack<Integer> stack = new Stack<>();

		for (int m : moves) {
			m -= 1;

			Loop1: 
			for (int i = 0; i < board.length; i++) {

				if (board[i][m] != 0) {

					if (!stack.isEmpty() && stack.peek()== board[i][m]) {
						answer += 2;
						stack.pop();

					} else {
						stack.add(board[i][m]);
					}
					board[i][m] = 0;
					break Loop1; 			// 특정 반복문 중지
				}
			}
		}

		return answer;
	}
}

0개의 댓글