알고리즘 공부 #3

hyeon·2022년 1월 7일
0

알고리즘 시작

목록 보기
1/18

codeup 기초 100제 문제를 java로 풀고 기록했습니다!
1078 1079 1080 1081 1082 1085 1090 1093 1095 1096 1098 1099번 문제가 수록되어있습니다😃

1. 1078

짝수만의 합 구하기

import java.util.*;

public class Main {

	public static final Scanner scanner= new Scanner(System.in);
	public static int CalSum(int data) {
		int sum=0;
		for(int i=2;i<=data;i+=2) {
			sum+=i;
		}
		return sum;
		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
			int num=scanner.nextInt();
			int answer=CalSum(num);
			System.out.print(answer);
	}

}

2. 1079

문자열 출력

import java.util.*;


public class Main {

	public static Scanner scanner= new Scanner(System.in);
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	while(true) {
		String data="";
		data=scanner.next();
		
		if(data.equals("q")) {
			System.out.print("q");
			break;
		}
		else {
			System.out.println(data);
			}
		}
	}

}

nextLine()과 next()

netInt만 써서 다른건 몰랐는데 nextlong double 등등이 있고 문자열을 받을때는 next()나 nextLine()을 쓴다. next는 scanner가 공백을 기준으로하듯이 공백을 기준으로 nextLine은 한라인을 모두 입력받는다(띄어쓰기 있어도)

3. 1080

import java.util.*;

public class Main {

	public static Scanner scanner=new Scanner(System.in);
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int data = scanner.nextInt();
		int sum=0;
		for(int i=1;i<=data;i++) {
			sum+=i;
			if(sum>=data) {
				System.out.print(i);
				break;
			}

		}
	}

}

4. 1081

import java.util.*;

public class Main {

	public static Scanner scanner=new Scanner(System.in);
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int data = scanner.nextInt();
		int data2=scanner.nextInt();
		for (int i=1;i<=data;i++) {
			for(int j=1;j<=data2;j++) {
				System.out.println(i+" "+j);
			}
		}
		
	}

}

5. 1082

진수의 표현법

16진수는 0xa 0xb 이런식으로 표현
8진수는 앞에 0붙여서 017이런식으로 표현
2진수는 0b

8진수 16진수 입력받기

scanner.nextInt(n)

출력 서식

%d : 정수
%o : 8진수
%x or %X :16진수

2진수 16진수 8진수 10진수로 변환하기

Integer.toBinaryString(a)
Integer.toHexString(a)
Integer.toOctalString(a)
Integer.parseInt(a,n진법)

import java.util.*;

public class Main {

	public static Scanner scanner=new Scanner(System.in);
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int data = scanner.nextInt(16);
		for(int i=1;i<16;i++) {
			System.out.printf("%X*%X=%X\n",data,i,data*i);
		}
		
	}

}

6. 1085 (다시풀기)

원하는 자리 수에서 반올림하기

round 함수는 double을 넣었을때 가장가까운 long값, float을 넣었을때 가장 가까운 int 값을 리턴 한다. 그리고 첫째자리에서 반올림 하기때문에 정수값이 나온다. 그래서 원하는 자리에서 반올림을 해주기 위해서는 구하려는 값에 반올림을 원하는 자리 만큼 곱하기를 해주고 나온 결과가 정수 타입으로 리턴 되기 때문에 소수점인 실수로 반환해주기 위해서 10.0 이런식으로 실수를 명시적으로 표시해준다.

Math.round(num*10)/10.0 

int 형 곱셈 결과 (틀린이유)

hbcs를 곱한 결과가 int 형 범위를 초과하는 테스트 케이스를 만나게 되었다.
나는 double type인 pcm이라는 변수에 값을 넣었기 때문에 상관없다고 생각했지만
**c=a
b일때 a*b의 값은 a와 b의 형에 결정되지 c의 타입에 영향을 받지 않는다고 한다!! **
(알고리즘 온라인&오프라인 스터디 오픈카톡방의 류호석(rhs0266)님께 도움을 받았습니다!)

그럼 다른 타입으로 연산을 했을 때는 어떻게 되는지 궁금해서 찾아보니~
자바에서 다른 타입끼리의 연산은 우선 피연산자들을 모두 같은 타입으로 만든후에 수행된다고 한다. (작은타입->큰타입으로 묵시적 타입변화(implicit conversion))
출처 :http://www.tcpschool.com/java/java_datatype_typeConversion

import java.util.*;

public class Main {

	public static Scanner scanner=new Scanner(System.in);
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		long h =scanner.nextInt();
		long b= scanner.nextInt();
		long c =scanner.nextInt();
		long s =scanner.nextInt();
		
		double pcm=h*b*c*s;

		pcm=pcm/8/1024/1024;
		
		double answer=Math.round(pcm*10)/10.0;
		System.out.print(answer+" MB");
	}

}

// 강약 h
// 체크 b
//트랙개수 c
// 녹음 시간 s

7. 1090

import java.util.*;

public class Main {

	public static Scanner scanner=new Scanner(System.in);
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		long a=scanner.nextLong();
		long r=scanner.nextLong();
		long n=scanner.nextLong();
		
		for(int i=0;i<n-1;i++) {
			a=a*r;
		}
		System.out.print(a);
	
	}

}

8. 1093

배열을 모두 0으로 초기화하는 방법

숫자형 배열은 처음만들면 다 0으로 초기화 되어있다고한다.

이미 채워진 배열을 0으로 초기화 하는 방법:

Arrays.fill(배열이름,0);

import java.util.*;

public class Main {

	public static Scanner scanner=new Scanner(System.in);
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int n=scanner.nextInt();
		int[] data=new int[n];
		for(int i=0;i<n;i++) {
			data[i]=scanner.nextInt();
		}
		int[] count=new int[23];
		Arrays.fill(count,0);
		for(int j=0;j<n;j++) {
			count[data[j]-1]+=1;
		}
		for(int k=0;k<23;k++) {
			System.out.print(count[k]+" ");
		}
	
		
	}

}

9. 1095

import java.util.*;

public class Main {

	public static Scanner scanner=new Scanner(System.in);
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int n=scanner.nextInt();
		int[] data=new int[n];
		int min=Integer.MAX_VALUE;
		
		for(int i=0;i<n;i++) {
			data[i]=scanner.nextInt();
		}

		for(int j=0;j<n;j++) {
			if(data[j]<min) {
				min=data[j];
			}
		}
		System.out.print(min);
	}
}

10. 1096


import java.util.*;

public class Main {

	public static Scanner scanner=new Scanner(System.in);
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int n=scanner.nextInt();		//데이터개수
		int[][] data=new int[n][2];		//흰바둑 좌표 
		for(int i=0;i<n;i++) {
			for(int j=0;j<2;j++) {
				data[i][j]=scanner.nextInt();
			}
		}
		int[][] go=new int[19][19];
		
		for(int k=0;k<19;k++) {
			for(int m=0;m<19;m++) {
				for(int a=0;a<n;a++) {
					if (data[a][0]==k+1&&data[a][1]==m+1) {
						go[k][m]=1;
//						System.out.println(k+" "+m+"값");
					}
				}//data 배열에 i와 j 값이 지금 go의 [k][m]값과 같으면 go[k][m]의 값을 1로 바꾼다.
				System.out.print(go[k][m]+" ");
			}
			System.out.print("\n");
		}
	}
}

뭔가 괜히 어렵게 생각한것같다.ㅠㅠㅠ
위코드에서 n을 입력받고/ data라는 2차원배열에 흰바둑돌좌표를 입력받고/ go라는 바둑판을 출력할 배열을 만들고 /go의 x좌표인 k for문안에 y좌표인 m 안에 data를 전순회 하기위한 a for돌려서 data의 xy좌표와 지금 돌리고 있는 km이 같을 경우 1로 설정하는 코드

아래코드는 입력받을 때 입력한 좌표의 go 배열을 1로 설정하고 그냥 출력!

다른 분들이 쓴 답 보고 다시 짠코드

import java.util.*;

public class Main {

	public static Scanner scanner=new Scanner(System.in);
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int n=scanner.nextInt();
		int[][] go=new int[19][19];
		for(int i=0;i<n;i++) {
			int x=scanner.nextInt();
			int y=scanner.nextInt();
			go[x-1][y-1]=1;
		}
		
		for(int j=0;j<19;j++) {
			for(int k=0;k<19;k++) {
				System.out.print(go[j][k]+" ");
			}
			System.out.print("\n");
		}
		
	
	}
}

11. 1098

import java.util.*;

public class Main {

	public static Scanner scanner=new Scanner(System.in);
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int x=scanner.nextInt();
		int y=scanner.nextInt();
		
		int[][] pan=new int[x][y];		//판
		int n=scanner.nextInt();		//막대의 개수
		
		for(int i=0;i<n;i++) 	//막대 개수만큼 반복
		{
			int height =scanner.nextInt();
			int direction=scanner.nextInt();
			int x1=scanner.nextInt();
			int y1=scanner.nextInt();
			
			if(direction ==1) {		//세로 막대
				for(int j=0;j<height;j++) {
					pan[x1-1][y1-1]=1;
					x1++;
					
				}
			}
			else if (direction ==0) {		//가로막대
				for(int j=0;j<height;j++) {
					pan[x1-1][y1-1]=1;
					y1++;

				}
				
			}
		}
		for(int k=0;k<x;k++) {
			for(int m=0;m<y;m++) {
				System.out.print(pan[k][m]+" ");

			}
			System.out.print("\n");
		}

	}
}

12. 1099

import java.util.*;

public class Main {

	public static Scanner scanner=new Scanner(System.in);
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[][]arr=new int[10][10];
		for(int i=0;i<10;i++) {
			for(int j=0;j<10;j++) {
				arr[i][j]=scanner.nextInt();
			}
		}
		
		//2를 만날때까지 오른쪽이 0이면 y++ 오른쪽이 1이면 x++
		int k = 1,m=1;
			while(true) {		
				if(arr[k][m]== 2) {
					arr[k][m]=9;
					break;
				}
				else if(arr[k][m+1]==1) {
					if(arr[k+1][m]==0||arr[k+1][m]==2) {
						arr[k][m]=9;
						k++;
					}
					//오른쪽도 아래도 막혀있을때
					else if(arr[k+1][m]==1) {
						arr[k][m]=9;

						break;
					}
					
				}
				else if(arr[k][m+1]==0||arr[k][m+1]==2){
					arr[k][m]=9;
					m++;
				}
			
			}
			
			for(int a=0;a<10;a++) {
				for(int b=0;b<10;b++) {
					System.out.print(arr[a][b]+" ");
				}
				System.out.print("\n");
			}
			
	}
}

생각 못했던 점 :

오른쪽이 1인경우와 0인경우 이외에 2를 만날 수 있기 때문에 or연산으로 2를 만날 경우를 설정해줘야하며 아래도 오른쪽도 막혔을때 (마지막)의 경우의 수를 생각해줘야합!

profile
남기고 싶은 개발자입니다 :>

0개의 댓글