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

https://programmers.co.kr/learn/courses/30/lessons/12969

 

코딩테스트 연습 - 직사각형 별찍기

이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다. 별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요. 제한 조건 n과 m은 각각 1000 이하인 자연수

programmers.co.kr


Think🤔

직사각형 별찍기 문제이다.

스캐너로 a에 5를 받고 b에 3을 받으면

5행 3열이 찍힌다.

 

2중 반복문을 이용하면 쉽게 풀릴 것 같다.

바깥의 for문에서 b만큼 돌면 안에서 a만큼의 (*)이 찍히고 줄바꿈을 해주면 된다.


Solution✍
import java.util.Scanner;

class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        
        for(int i=0; i<b; i++){
            for(int j=0; j<a; j++){
                System.out.print("*");   
            }
            System.out.println();
        }
    }
}
import java.util.Scanner;

class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        
        StringBuilder sb = new StringBuilder();
        
        for(int i=0; i<a; i++){
            sb.append("*");
        }
        
        for(int i=0; i<b; i++){
            System.out.println(sb.toString());
        }
    }
}

Review🤩

쉬운 문제였지만 생각보다 성능은 좋지 않은 것 같다.


 

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

https://programmers.co.kr/learn/courses/30/lessons/12944

 

코딩테스트 연습 - 평균 구하기

정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요. 제한사항 arr은 길이 1 이상, 100 이하인 배열입니다. arr의 원소는 -10,000 이상 10,000 이하인 정수입니다. 입출력 예 arr

programmers.co.kr


Think🤔

간단해 보이는 문제

배열의 값을 다 더해서 배열의 수만큼 나눠주면 될 것 같다?


Solution✍
class Solution {
    public double solution(int[] arr) {
        double answer = 0;
        
        for(int i=0; i<arr.length; i++){
            answer += arr[i];    
        }
        return answer/arr.length;
    }
}

 

Review🤩

쉬운 문제였지만

arr.length(); 는 String에서 쓰는 것을 잠시 헷갈렸다.

 

length

- length는 배열의 길이

length()

- length()는 문자열의 길이

size()

- size()는 컬렉션프레임워크 타입의 길이를 알고자 할때 사용됨. 


 

1 5 8 11 13 16 이 나열되어 있을때 

13을 찾을때는 쉽다. 바로 찾을 수 있기 때문

 

1.001 1.005 ....... 17.001 까지의 숫자가 있을때 13을 찾으려면??

 

20개의 수만 확인하면 된다!


이분 탐색

N개의 수가 크기 순서대로 배열되어 있을 때,

특정한 수 K가 몇 번째 위치에 있는지 빠르게 찾는 방법

 

일단 0~100번째까지 중에서 25를 찾으려면 가운데인 50번째를 찾는다.

 

그러면 50번째의 뒤쪽에서는 답이 있을수가 없다.

 

이렇게 해서 UP AND DOWN 게임 처럼 가운데 수를 보고 앞에 있으면, 앞쪽을 보고 아니면 뒤쪽을 보는 것.

 

한번에 배열이 절반씩 줄어들기 때문에 시간 복잡도는 O(log₂ N)이다.

 

N이 100만일 때, log₂ N은 약 20이므로 20개 정도를 보면 찾을 수 있다.

 

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

https://www.acmicpc.net/problem/2512

 

2512번: 예산

첫째 줄에는 지방의 수를 의미하는 정수 N이 주어진다. N은 3 이상 10,000 이하이다. 다음 줄에는 각 지방의 예산요청을 표현하는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 값들은 모두 1 이상

www.acmicpc.net


Think🤔

첫 번째 생각

Input/Ouput 입출력을 어떻게 해야될까?

Scanner를 사용하면 Buffereader를 사용할 때 보다 속도가 낮다고 한다.

why?

속도가 낮은 이유는 Scanner는 한 글자를 입력할때마다 전송되는데 Buffereader는 글자가 다 입력이 되면 그제서야 전송시켜주기 때문에 빠르다

But!

버퍼리더를 이용하면 String밖에 읽지 못해서 pareseInt 라던지 형 변환을 시켜줘야 한다.

 

일단 버퍼리더가 성능이 더 좋으므로 채택하기로 한다.

 

그리고 StringTockenizer를 이용한다.

두 번째 생각

StringTockenizer란.?

우리가 지정한 구분자로 문장려을 나눠주는 클래스임 만약에 전화번호 010-1234-5678 이런식으로 들어가게 되면

구분자를 이용해서 "-"를 구분자로 사용해 010,1234,5678을 토큰으로 이용할 수 있다.

 

StringTockenizer st = new StringTockenizer(br.readLine(),"-");

이렇게 작성하면 전화번호를 띄고 생성할 수 있다.

그리고 코드를 작성하면서 한 가지 또 알게 된 것이 있는데

nextTocken()메서드로 토큰 하나 꺼내오면 StringTokenizer 객체에는 해당 토큰이 없어진다.

고로 이제 더 이상 가져올 토큰이 없으면 nextToken java.util.NouSuchElementException 예외를 발생시킨다!

 

그래서 메서드를 호출하기 전에 토큰을 먼저 검사해주는

hasMoreToceken() 메서드로 먼저 토큰을 검사하고 꺼내오는 방법이 좋은 방법일 것 같다.

 

package back21y11;

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

public class budget {
	// 클래스 변수
	static int N; // 지방의 수
	static int[] arr; // 각 지방 예산
	static int M; // 총 예산
	
	public static void main(String[] args) throws IOException { // 입출력 예외
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine().trim());

		N = Integer.parseInt(st.nextToken());
		arr = new int[N];
		int sum = 0;
		int max = 0;
		
		st = new StringTokenizer(br.readLine().trim());
		for(int i=0; i<arr.length; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
			sum += arr[i];
			if(arr[i] > max) {
				max = arr[i];
			}
		}
		
		st = new StringTokenizer(br.readLine().trim());
		M = Integer.parseInt(st.nextToken());
		
		// 예산이 더 크면
		if(M >= sum) {
			System.out.println(max);
		}else {
			Arrays.sort(arr);
		}
		
	}
}

일단 현재까지 작성된 코드는 이렇다.

근데 상한액을 구하는 방법을 잘 모르겠다.

일단 110 120 140 150을 나열한다.

127을 구하는 방법... 어떻게 127을 구할까?

 

이제 이분 탐색으로 정답이 중간값으로 해서 계속해서 while문으로 반복하는 반복문을 짜야된다..


Solution✍

 

Review🤩

 

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

https://leetcode.com/problems/combine-two-tables/

 

Combine Two Tables - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com


Think🤔

Database문제는 처음이다.

처음에 테이블도 만들고 쿼리도 만드는 문제인 줄 알았다.

하지만, 테이블은 파라미터처럼 주어주는 값이였고, 쿼리를 작성하면 되는 문제였다.

Person테이블에 있는 프라이머리키는 Address테이블에 id도 같이 있다.

처음에는 Select문을 이용해서 join을 하지 않고, 같은 id값이 있는 테이블만 보여주게 작성했다.

근데 이렇게 하면 지역이 없는 테이블은 null로도 나오지 않고 그냥 조회가 불가능하게 된다.

그러므로, LEFT JOIN을 이용해서 Address를 Person에 LEFT JOIN 시켜서 Person에 있는 값을 다 나오게 해야 된다.

LEFT JOIN 왼쪽이 Person 오른쪽이 Address

*JOIN사용 방법은

  - JOIN(조인)이란?   

    1. 데이터베이스를 연결하여 데이터를 검색하는 방법

    2. PK 혹은 FK로 두 테이블을 연결

    3. 적어도 하나의 칼럼은 서로 공유되고 있어야 함

 

SELECT *

FROM 첫 번째 테이블 이름 JOIN 두 번째 테이블 이름

ON 조건

이렇게 된다.

 


Solution✍
# Write your MySQL query statement below

SELECT Person.FirstName, Person.LastName, Address.City, Address.State
FROM Person 
    LEFT JOIN Address
    on Person.PersonId = Address.PersonId

 

Review🤩

DB 문제도 풀면 도움이 많이 될 것 같다.

JOIN의 종류와 왜 쓰는지? 쿼리에 대한 문법도 까먹었는데 찾아보면서 해보니 다시 기억이 나는 것 같다.


 

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

https://programmers.co.kr/learn/courses/30/lessons/83201

 

코딩테스트 연습 - 2주차_상호평가

[[100,90,98,88,65],[50,45,99,85,77],[47,88,95,80,67],[61,57,100,80,65],[24,90,94,75,65]] "FBABD" [[70,49,90],[68,50,38],[73,31,100]] "CFD"

programmers.co.kr


Think🤔

scores[i][i]는 각각 자기 자신평가한 점수이다.

이 점수가 각각 자기를 평가한 점수 중에 제일 크거나 , 제일 작으면 그 수를 제외하고 평균을 구한다.

또, 제일 크거나 제일 작은 수는 유니크해야 된다.

자기 자신의 점수 중에서도 제일 큰 값이거나, 제일 작은 값인 것을 둘 다 만족시켜야 한다.

일단 제일 작은 값하고 제일 큰 값은 small과 big으로 두고 Math.min, Math.max를 이용해서 둘의 큰 값과 작은 값을 구한다.

 

근데 만약 같은 값이 다른 j값에 있으면? 그 값은 유니크하지 못하므로 유니크 체크를 false로 바꾼다.

 

만약 유니크하고 자기 자신을 평가한 값 중에 제일 크거나, 제일 작은 값이면

자기 성적에서 빼고, count를 줄여줘서 나눠준다.

 

처음에는 반복문을 3개 만들어서 하려고 했었다.

O(3n)도 O(n)에 하고 시간 복잡도를 통해서 보면 별 상관없으므로 그렇게 짜도 될 것 같다.


Solution✍
import java.util.*;

class Solution {
    public String solution(int[][] scores) {
        String answer = "";
        
        for(int i=0; i<scores.length; i++){
            int grade = 0;
            int big = -1;
            int small = 101;
            int count = 0;
            boolean unique = true;
            for(int j=0; j<scores[i].length; j++){
                
                small = Math.min(scores[j][i], small);
                big = Math.max(scores[j][i], big);
                
                if(i != j && scores[i][i] == scores[j][i]){
                    unique = false;
                }
                
                grade += scores[j][i];
                count++;
            }
            
            if(unique && (big == scores[i][i] || small == scores[i][i])){
                grade -= scores[i][i];
                count--;
            }
            
            grade = grade / count;
            
            if (grade >= 90.0f){answer += "A";}
            else if (grade >= 80.0f){answer += "B";}
            else if (grade >= 70.0f){answer += "C";}
            else if (grade >= 50.0f){answer += "D";}
            else answer += "F";
        }
        
        return answer;
    }
}

Review🤩

풀고 나서보니 쉬운 문제였지만, 풀 때는 어질어질했다...🤣


 

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

https://programmers.co.kr/learn/courses/30/lessons/82612

 

코딩테스트 연습 - 1주차_부족한 금액 계산하기

새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이

programmers.co.kr


Think🤔

가지고 있는 금액 money

price 이용금액 3

count 놀이기구 몇번 타는지


Solution✍
class Solution {
    public long solution(int price, int money, int count) {
        long answer = -1;
        for(int i=1; i<=count; i++){
            answer += price * i;
        }
        return answer - money > 0 ? answer - money + 1 : 0;
    }
}

 

Review🤩

쉬운 문제였습니다.


 

+ Recent posts