public class year_2016 {
public static void main(String[] args) {
int a = 0;
int b = 0;
String answer = "";
String[] day = {"FRI","SAT","SUN","MON","TUE","WED","THU"};
int[] date = {31,29,31,30,31,30,31,31,30,31,30,31};
int select = 0;
for(int i = 0; i < a-1; i++){
select += date[i];
}
select += b - 1;
answer = day[select % 7];
System.out.println(answer);
}
}
위에는 클래스를 따로 Import 하지 않고 풀었을 때의 풀이입니다.
2016년 개별 월의 마지막 날짜를 구해서 해당 날짜만큼을 8일
import java.time.LocalDate;
import java.util.Scanner;
public class year_2016 {
public static void main(String[] args) {
int a = 0;
int b = 0;
Scanner scanner = new Scanner(System.in);
a = scanner.nextInt();
b = scanner.nextInt();
String answer = "";
LocalDate date = LocalDate.of(2016, a,b);
System.out.println(date); // 2016-5-24
answer = date.getDayOfWeek().toString(); //요일은 String 타입으로 변환해야한다.
System.out.println(answer); // TUESDAY
System.out.println(answer.substring(0,3)); //.substring 메서드 사용해서 앞 3글자만 출력
}
}
LocalDate.of() 메서드를 사용하면 쉽게 날짜를 구할 수 있습니다.
사용하기 위해서
import java.time.LocalDate;
LocalDate.of(year, month, day)
.getDayOfWeek() 메서드를 사용하면 요일을 구할 수 있습니다.
단, String 타입으로 변환을 해줘야 합니다.
.toString() 을 사용하거나
String.valueOf() 를 사용해서 타입 변환을 해줍니다.
14. 나중에 떨어지는 숫자 배열
1. 배열의 길이를 구해서 조건값 찾기
2. 각 인덱스를 divisor 나눈 나머지 값 구하기 %divisor
3. 한번 길이를 정한 배열은 변경할 수 없기 때문에... 나머지가 0인 index의 수를 세기 count++
4. count 길이만큼의 배열 만들기 answer []
5. 나머지가 0이면 해당 Index값을 반환한 값을 answer [] 에 넣기
6. if else %divisor !=0 인 경우 count []에 -1 을 담기
7. 오름차순으로 배열하기 Arrays.sort 사용하기
import java.util.Arrays;
public class numberArray {
class Solution {
public int[] solution(int[] arr, int divisor) {
int count =0;
for(int i =0; i<arr.length; i++){
if(arr[i]%divisor==0){
count++;
}
}
int[] answer = new int[count];
count=0; //count 값 초기화 (변수명 바꿔도 상관x)
for (int i=0; i<arr.length; i++){
if(arr[i]%divisor==0){
answer[count] = arr[i]; //answer index [0]번째부터 값 넣어주기
count++;
}
}
if(answer.length==0){
answer = new int[1];
answer[0] =-1;
}
Arrays.sort(answer);
return answer;
}
}
}
15. 내적
1. for 문 이용해서 풀면 간단하다.
public class naejuk {
public static void main(String[] args) {
int answer = 0;
int[] a ={1,2,3,4};
int[] b ={-3,-1,0,2};
for(int i=0; i<a.length; i++){
answer +=(a[i]*b[i]); //()괄호를 해줘야 answer에 곱한 값이 들어간다.
}
System.out.println(answer);
}
}
public class Ex5_1_tmp {
public static void main(String[] args) {
// int[] score; 1. 배열 score를 선언(참조변수)
// score = new int[5]; 2. 배열의 생성(int저장공간 x 5)
int [] score = new int[5]; // 배열의 선언과 생성을 동시에
score[3] =100;
}
배열의 길이
"배열은 한번 생성하면 그 길이를 바꿀 수 없다."
배열의 초기화
배열의 각 요소에 처음으로 값을 저장하는 것
int[] score = { 1, 2, 3,4,5};
배열의 출력
char[] ChArr
캐릭터 배여일 때만 출력 가능
// 배열의 요소를 순서대로 하나씩 출력
for( int i=0; i<Arr.length; i++){
System.out.println(Arr[i]);}
//배열의 모든 요소를 출력
System.out.println(Arrays.toString(Arr));
배열의 활용
총점과 평균 구하기
public class Ex5_2 {
public static void main(String[] args) {
int sum=0;
float average =-0f;
int[] score = {100,88,100,100,90};
for (int i=0; i <score.length; i++){
sum += score[i];
}
average = sum /score.length; //계산결과를 Float으로 얻기
System.out.println("총점 : " + sum);
System.out.println("평균 : " + average);
}
}
최대값과 최소값
public class Ex5_3 {
public static void main(String[] args) {
int[] score = {79, 88, 91, 33, 100, 55,95};
int max = score[0];
int min = score[0];
for(int i=1; i <score.length; i++) {
if(score[i]> max){
max = score[i];
} else if(score[i]<min){
min = score[i];
}
}
System.out.println("최대값 :"+max);
System.out.println("최소값 :"+min);
}
}
섞기(Shuffle)
import java.util.Arrays;
public class Ex5_4 {
public static void main(String[] args) {
int[] numArr = {0,1,2,3,4,5,6,7,8,9};
System.out.println(Arrays.toString(numArr));
for (int i =0; i<100; i++){
int n = (int)(Math.random()*10);
int tmp = numArr[0];
numArr[0] = numArr[n];
numArr[n] =tmp;
}
System.out.println(Arrays.toString(numArr));
}
}
로또 번호
import java.util.Arrays;
public class Ex5_5 {
public static void main(String[] args) {
int[] ball = new int[45]; //45개 정수값을 저장하기
//배열의 각 요소에 1~45값을 저장
for(int i=0; i<ball.length; i++){
ball[i]=i+1; // ball[0]에 1이 저장된다.인덱스는 0부터 시작하니까
}
System.out.println(Arrays.toString(ball));
int tmp =0; // 두 값을 바꾸는데 사용할 임시변수
int j =0; // 임의의 값을 얻어서 저장할 변수
// 배열의 i번째 요소와 임의의 요소에 저장된 값을 서로 바꿔서 값을 저장
// 0번째부터 5번째 요소까지 모두 6개만 바꾼다.
for (int i=0; i<6; i++){
j=(int)(Math.random()*45); //0~44범위 임의의 수
tmp =ball[i];
ball[i] = ball[j];
ball[j] = tmp;
System.out.println(Arrays.toString(ball));
}
//배열 ball의 앞에서부터 6개의 요소를 출력한다.
for(int i=0; i<6; i++){
System.out.printf("ball[%d]=%d%n", i, ball[i]);
}
}
}
이번주 월요일에 정식으로 부트캠프를 시작했고 벌써 첫번째 주의 마지막날이 되었습니다. 월요일에는 아무것도 모르는 백지상태에 가까웠다면, 이제는 JWT를 이용해서 회원가입, 로그인, 로그아웃을 구현할줄 알게 되었고, Github을 이용해서 팀 프로젝트를 완성했습니다. Rest API 형식을 따라서 API 설계도 해보고 MongoDB를 이용해서 DB 설계도 경험했습니다. flask의 Blueprint를 사용해서 효율적으로 분업을 했고 후에 merge할 때 충돌이 한번도 발생하지 않았습니다.
뛰어난 조원분들과 함께해서 제가 기여한 부분이 메인은 아니지만 나름 맡은 역할을 다 했습니다.
제가 기획한 프로젝트가 채택되어서 기획쪽도 재미가 있다고 생각했습니다.
늘 저는 아이디어는 많습니다.
첫 코드리뷰를 진행하다
오늘은 함께 첫 프로젝트를 진행한 조원들과 함께 코드리뷰를 진행했습니다.
- 백에서 할수 있는 것은 최대한 백에서 처리하기
- API 설계를 아는 것이 중요하다
- 이번 프로젝트에는 Rest API 를 사용했음
- DB 설계에 맞춰 API 설계하기
저는 이번주에 시작한 완전 초짜지만 먼저 시작한 선배님들의 조언과 여러 피드백을 들으면서 월요일보다 성장한 것 같습니다. 함께한 조원분들이 성격도 좋고 개발도 잘해서 다행이었던 프로젝트였습니다.
다음 주에는...
이제는 자바스크립트를 뒤로 하고 자바에 집중하는 한주가 될 예정입니다. 오늘은 남궁성 자바의 정석 ch 5까지 들었습니다. 프로그래머스 알고리즘 문제를 지난 이틀간 풀었는데 아무래도 자바 기초가 부족하다 보니 간단한 문제도 방법을 몰라서 푸는 경우가 많았습니다. 문제 푸는 로직은 어느정도 이해는 갑니다. 더 많은 메소드를 알게 되면 알고리즘 문제 풀이가 좀 더 수월할 것 같습니다.
시그마로 푸는 문제가 하나 있었는데 언제 이걸 봤었지 했는데 고등학생인가 대학생때 통계학에서 배운 기억이 났습니다. 알고리즘 주차에 걷기반을 선택해서 28 문제를 푸는 것이 학습 목표인데 좀더 욕심을 내서 달리기 반의 문제 10개까지 추가를 해서 풀어보도록 하겠습니다.
2. case문의 값은 정수, 상수(문자포함), 문자열만 가능하며, 중복되지 않아야 한다.
임의의 정수 만들기
Math.random() - 0.0과 1.0사이의 임의의 double값을 반환
0.0 <= Math.random() < 1.0
1과 3사이의 정수 구하기
1. 각 변에 3을 곱한다.
2. 각 변을 Int형으로 변환한다.
3. 각 변에 1을 더한다.
System.out.println((int)(Math.random()*11)-5);//-5와 5의 사이
for문
조건을 만족하는 동안 블럭{}을 반복 - 반복 횟수를 알 때 적합
변수의 범위(scope)는 좁을수록 좋다; 선언위치부터 선언된 블럭의 끝까지
//조건식을 생력하면, true로 간주되엇 무한반복문이 된다.
for(;;){
System.out.println("i="+1);
}
중첩 for 문
직사각형 별찍기
public class Ex4_15 {
public static void main(String[] args) {
for(int i=1; i<=5; i++) {
for (int j = 1; j <= 10; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
별 늘리기
public class Ex4_15 {
public static void main(String[] args) {
for(int i=1; i<=5; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
while문
조건을 만족시키는 동안 블럭{}을 반복 - 반복 횟수 모를 때
while 조건식 {
//조건식의 연산결과가 참(true)인 동안, 반복될 문장들을 적는다.
}
for문과 100% 상호 대체 가능
for 문
public class Ex4_14 {
public static void main(String[] args) {
int num =12345, sum =0;
//10으로 나머지 연산을 하면 마지막 자리를 얻는다.
// System.out.println(12345%10);
//num = 12345, 1234, 123,12, 1
for(num=12345; num>0; num=num/10){
System.out.println(num);
}
System.out.println("각 자리수의 합:" +sum);
}
}
while문으로 바꾸기
public class Ex4_14 {
public static void main(String[] args) {
int num =12345, sum =0;
//10으로 나머지 연산을 하면 마지막 자리를 얻는다.
// System.out.println(12345%10);
//num = 12345, 1234, 123,12, 1
while(num>0){
sum += num%10;
System.out.println("sum"+sum+",num%10="+num%10);
num =num/10;
}
System.out.println("각 자리수의 합:" +sum);
}
}
do-while문
블럭{}을 최소한 한 번 이상 반복 - 사용자 입력받을 때 유용
break문
자신이 포함된 하나의 반복문을 벗어난다.
while문
public class Ex_16 {
public static void main(String[] args) {
int sum =0;
int i =0;
while(true){//무한 반복문 for(;true;) {}
if(sum>100)
break; //자신이 속한 하나의 반복문을 벗어난다.
++i;
sum += i;
} // end of while
System.out.println("i=" +i);
System.out.println("sum=" + sum);
}
}
for문
public class Ex_16 {
public static void main(String[] args) {
int sum =0;
int i =0;
for(;;){//무한 반복문 for(;true;) {}
if(sum>100)
break; //자신이 속한 하나의 반복문을 벗어난다.
++i;
sum += i;
} // end of while
System.out.println("i=" +i);
System.out.println("sum=" + sum);
}
}
continue문
자신이 포함된 반복문의 끝으로 이동 - 다음 반복으로 넘아감
전체 반복 중에서 특정 조건시 반복을 건너뛸 때 유용
break문과 달리 반복문을 벗어나지 않는다.
public class Ex4_17 {
public static void main(String[] args) {
for(int i=0; i<= 10; i++){
if(i%2==0)
continue;
System.out.println(i);
}
}
}
예시
import java.util.Scanner;
public class Ex4_18 {
public static void main(String[] args) {
int menu =0;
int num =0;
Scanner scanner = new Scanner(System.in);
while (true){ // 무한 반복문
System.out.println("(1) square");
System.out.println("(2) square root");
System.out.println("(3) log");
System.out.println("원하는 메뉴(1~3)을 선택하세요. (종료:0>");
String tmp = scanner.nextLine(); //화면에서 입력받은 내용을 tmp에 저장
menu = Integer.parseInt(tmp); //입력받은 문자열(tmp)을 숫자로 변환
if(menu==0) {
System.out.println("프로그램을 종료합니다");
break;
} else if (!(1<=menu && menu<=3)) {
System.out.println("메뉴를 잘못 선택하셨습니다. (종료는 0)");
continue;
}
System.out.println("선택하신 메뉴는" + menu + "번입니다.");
} //main의 끝
}
}
public class Ex2_1 {
public static void main(String[] args) {
int x=4, y=2;
int tmp;
tmp =x;
x=y;
y=tmp;
System.out.println(x);
System.out.println(y);
}
}
4. 뒤의 숫자는 .substring() 메소드를 이용해서 .substring(length-4)로 마지막 네자리 숫자를 찍어준다.
public class Ex2_1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String phone_number = scanner.nextLine();
int length = phone_number.length();
String answer = "";
for(int star =0; star<length-4; star++){
answer += "*";
}
answer += phone_number.substring(length-4);
System.out.println(answer);
}
}
.substring이란 걸 어제푼 문제에서 배워서 대입을 해봤습니다.
그랬더니...
.toCharArray() 메소드란것이 있습니다.
String.valueOf()
10. 행렬의 덧셈
어제부터 약간 뇌가 멍해서
11. x만큼 간격이 있는 n개의 숫자
x부터 시작해서 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴하라
1. x, x(n), x(n^2), ... , x(n^n-1) 을 리스트로 만들어야 한다.
2. for 문을 사용해서 정의하면 되려나
class Solution {
public long[] solution(int x, int n) {
long[] answer = new long[n];
for(int i=0; i<answer.length; i++){
answer[i] = (long)x * (i+1);
}
return answer;
}
}
위는 프로그래머스에 제출한 코드이고 인텔리제이로는 아래처럼 작성했습니다.
public class xnincrease {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int x = scanner.nextInt();
int n = scanner.nextInt();
long[] answer = new long[n];
for(int i=0; i<answer.length; i++){
answer[i] = x * (i+1);
}
System.out.println(answer);
}
}
그랬던이 결과값이 이상하게 나오길래 array 전체 배열의 값을 출력하는 방법을 알아보았습니다.
import java.util.Arrays; //import하기
import java.util.Scanner;
public class xnincrease {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int x = scanner.nextInt();
int n = scanner.nextInt();
long[] answer = new long[n];
for(int i=0; i<answer.length; i++){
answer[i] = x * (i+1);
}
System.out.println(Arrays.toString(answer)); //Arrays.toString() 메소드 사용
}
}
Arrays.toString() 메소드를 사용하면 배열의 값을 출력해줍니다.
아래처럼 이쁘게 출력이 되었습니다.
12. 부족한 금액 계산하기
돈이 얼마나 부족한지 계산하고 부족하지 않다면 0을 return 한다.
1. 다시 탈때 마다 요금이 n배 만큼 올라감
2. n번 탈때 필요한 돈의 금액 lack = (Price*1+ Price*2+ ... + Price*n) -> for 문 사용
3. 부족한 돈의 금액 lack - money
4. 안부족하면 return 0;
import java.util.Scanner;
public class lackamout {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int price = scanner.nextInt();
int money = scanner.nextInt();
int count = scanner.nextInt();
long answer;
int lack = 0;
for(int i=0; i<=count; i++){
lack += price*i;
}
if (money>lack){
answer=0;
} else{
answer = lack-money;
}
System.out.println(answer);
}
}
짝수인 경우, 중간 문자 2개가 answer가 된다. int 이기 때문에 자동으로 소수점 이하 값은 없애버림
예시. String s = cute; int length =4; 4%2 ==0; 짝수
.charAt() 메소드를 이용해서 x 번째 문자의 값을 구한다
짝수인 경우 가운데 두글자
홀수인 경우 가운데 한글자
public class Ex2_1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
String answer = "";
int length = s.length();
if(length%2==0){
answer+= s.charAt(length/2-1);
answer+= s.charAt(length/2);
}else{
answer+= s.charAt(length/2);
}
System.out.println(answer);
}
}
제출하고 통과는 했으나....
한줄 짜리 코드로도 가능했던 것이었던 것이었습니다.
.substring 메소드를 이용하는 방법
.substring(start letter, end letter)
시작하는 글자, 끝나는 글자 순번을 넣어주면 됩니다.
.substring(start letter)
시작하는 글자 부터 끝까지 출력합니다.
4. 정수의 합 구하기
a와 b 사이의 숫자를 모두 더한 값을 구하는 문제입니다.
a와 b 중 큰 값을 long max, 작은 값을 long min 으로 정의한다.
for문의 초기값을 min, 최대값을 max, 증가연산자 일 때 합을 구한다
public class Ex2_1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
long answer =0;
long min = Math.min(a,b);
long max = Math.max(a,b);
for (long x=min; x<=max;x++){
answer += x;
}
System.out.print(answer);
}
}
이렇게 열심히 했는데....
sumAtoB라는 함수가 있었습니다..
sumAtoB() 는 A와 B 사이의 값을 구합니다.
5. 문자열을 정수로 전환하기
public class Ex2_1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int answer = 0;
String s = scanner.nextLine();
answer = Integer.parseInt(s);
System.out.println(answer);
}
}
되게 간단하다고 생각을 했었습니다만....
6. 없는 숫자 더하기
말그대로 없는 숫자를 더해야 합니다.
function solution(numbers) {
let answer = 0;
for(let i = 0; i <= 9; i++) {
if(!numbers.includes(i)) answer += i;
}
return answer;
}
1. 다음 코드를 실행하면 출력 결과로 5를 기대했는데 4가 출력되었습니다. 어디에서 잘못 작성된 것일까요?
int var1=5;
int var2=2;
double var3=var1/var2;
int var4=(int)(var3*var2);
System.out.println(var4);
-> var 3 출력 값은 int type 변수이기 때문에 5/2 = 2.5 가 아니고 소수점이 사라져서 2가 된다. var3를 double type 으로 설정했기 때문에 2.0이 나온다.
2.5 값이 출력 되기를 원했다면 앞에 (double) 을 적어준다.
double var3 = (double) var1/var2
line 4는 2*2 이기 때문에 마지막 int var4의 출력 값은 4가 된다.
2. 다음 코드를 실행했을 때 출력 결과는 무엇입니까? (증감연산자에 대해 알아보세요!)
int x=10;
int y=20;
int z = (++x) + (y--);
System.out.println(z);
-> 증감연산자(++,--0)가 값의 앞에 오면 증감연산자를 실행하고 나서 연산이 실행이 되고 뒤에 오면 연산을 실행한 후 다음식에서 증감연산자가 실행이 된다.
따라서, line3의 ++x == 11, y-- ==20 이기 때문에 int z == 31 이다.
3. while문과 Math.random() 메소드를 이용해서 2개의 주사위를 던졌을 때 나오는 눈을 (눈1, 눈2) 형태로 출력하고, 눈의 합이 5가 아니면 계속 주사위를 던지고, 눈의 합이 5이면 실행을 멈추는 코드를 작성해보세요. 눈의 합이 5가 되는 조합은 (1,4), (4,1), (2,3), (3,2)입니다.
-> 주사위 하나의 랜덤 값을 구하기 위한 수식은 아래와 같다.
int num = (int) (Math.random()*6)+1;
public class Ex2_1 {
public static void main(String[] args) {
System.out.println("시작!");
while (true) {
int num1 = (int) (Math.random() * 6) + 1;
int num2 = (int) (Math.random() * 6) + 1;
System.out.println("("+ num1 +","+ num2+")");
if ((num1 + num2) == 5) {
break;
}
}
System.out.println("끝");
}
}
while문을 사용해서 조건문을 사용하였다.
주사위 두개의 합 (num1 +num2)이 5가 되면 while 문이 실행을 멈추고 조건문을 블락을 벗어난다.