728x90

3의 배수나 3이 들어간 수를 쓰지 않을 때 10진수를 표현한 수는? 

public int solution(int n) {

int answer = 1;

int count = 1;

do{

if((answer+"").contains("3")||answer%3==0){

answer= answer+ 1;//하고 나서도 다시 체크

count--;

}else{

if(count==n)break;

answer = answer+1;

}

 

count++;

}while(count<=n);

return answer;

}

answer를 증가시키는데 3이나 3의 배수인 수는 count를 감소시켜 한번더 체크하여 answer를 증가시키도록 

 

public int solution2(int n) {

int answer = 0;

for(int i=0; i<n; i++) {

answer++;

if((answer+"").contains("3")||answer%3==0)i--;

}

return answer;

}

for문으로 간단하게 만드는 방법도 있다..

'Java > Coding Test' 카테고리의 다른 글

치킨 쿠폰 문제풀이  (0) 2023.09.17
유한소수 판별하기 문제풀이  (0) 2023.09.17
문자열 밀기 문제풀이  (0) 2023.09.17
다항식 더하기 문제풀이  (0) 2023.09.17
OX 퀴즈 문제풀이  (0) 2023.09.17
728x90

주어진 첫번째 문자열을 오른쪽으로 밀었을때 주어진 두번째과 동일하게 된다면 밀었던 횟수를 반환 그렇지 않으면 -1을 반환 

public int solution(String A, String B) {

int answer = 0;

int len = A.length();

A=A+A;

for (int i = 0; i < len; i++) {

String t =A.substring(len-i,2*len-i);

if(t.equals(B))return i;

}

return -1;

}

A문자열을 두번 이어붙여 이어지는 문자열 중 B와 일치하는 문자열이 있는지 확인

 

다른 사람풀이를 보았는데

public int solution2(String A, String B) {

return (B+B).indexOf(A);

}

그냥 B를 붙여서 A를 찾는다... indexOf()는 어차피 실패하면 -1을 반환해준다.

'Java > Coding Test' 카테고리의 다른 글

유한소수 판별하기 문제풀이  (0) 2023.09.17
저주의 숫자 3 문제풀이  (0) 2023.09.17
다항식 더하기 문제풀이  (0) 2023.09.17
OX 퀴즈 문제풀이  (0) 2023.09.17
연속된 수의 합 문제풀이  (0) 2023.09.17
728x90

다항식이 문자열로 주어질 때 연산을 반환 

연산자는 '+'만 존재하고 1차항과 상수항만 주어진다.

 

public String solution(String polynomial) {

String answer = "";

String[] a = polynomial.split(" ");

int x = 0;

int y = 0;

for (int i = 0; i < a.length; i+=2) {

if(a[i].contains("x")) {

x+=Integer.parseInt((a[i].substring(0,a[i].length()-1).equals(""))?"1":a[i].substring(0,a[i].length()-1));

}

else y+=Integer.parseInt(a[i]);

}

return x == 0 ? y==0 ? "0" : y+"" : x==1 ? y==0 ? "x" : "x + "+y : y==0 ? x+"x" : x+"x + "+y;

}

1차항과 상수항을 따로 구하고 

0x 또는 1x, 0 등이 나오지 않게 걸러준다.

'Java > Coding Test' 카테고리의 다른 글

저주의 숫자 3 문제풀이  (0) 2023.09.17
문자열 밀기 문제풀이  (0) 2023.09.17
OX 퀴즈 문제풀이  (0) 2023.09.17
연속된 수의 합 문제풀이  (0) 2023.09.17
안전지대 문제풀이  (0) 2023.09.17
728x90

X [+/-] Y = Z

연산식이 문자열로 주어질때 연산값이 맞다면 O 틀리면 X 를 반환한 문자열 배열을 반환

 

public String[] solution(String[] quiz) {

String[] answer = new String[quiz.length];

for (int i = 0; i < quiz.length; i++) {

String[] a =quiz[i].split(" ");

if(a[1].equals("+")) {

if(Integer.parseInt(a[0])+Integer.parseInt(a[2])==Integer.parseInt(a[4])) {

answer[i]="O";

}else answer[i]="X";

}else {

if(Integer.parseInt(a[0])-Integer.parseInt(a[2])==Integer.parseInt(a[4])) {

answer[i]="O";

}else answer[i]="X";

}

}

return answer;

}

숫자와 연산자 사이는 공백으로 비워져 있으므로 공백으로 숫자와 연산자를 구분 

 

연산자는 +또는 -밖에 없으므로

a[0]+a[2]*a[1] = a[4]로 하고 

a[1]가 +이면 1로, -이면 -1로 바꾸어주면 좀더 간결한 식을 만들 수 있다.

 

public String[] solution2(String[] quiz) {

String[] answer = new String[quiz.length];

for (int i = 0; i < quiz.length; i++) {

String[] a = quiz[i].split(" ");

answer[i]=(Integer.parseInt(a[0]) + Integer.parseInt(a[2])*((a[1].equals("+"))?1:-1) == Integer.parseInt(a[4]))? "O":"X";

}

return answer;

}

'Java > Coding Test' 카테고리의 다른 글

문자열 밀기 문제풀이  (0) 2023.09.17
다항식 더하기 문제풀이  (0) 2023.09.17
연속된 수의 합 문제풀이  (0) 2023.09.17
안전지대 문제풀이  (0) 2023.09.17
겹치는 선분의 길이 문제풀이  (0) 2023.09.17
728x90

연속된 수의 개수와 합이 주어질 때 연속된 수의 배열을 반환 

public int[] solution(int num, int total) {

int[] answer = new int[num];

//(a+a+num-1)*num/2=total

//2*a+num-1= total*2/num

//2*a = total*2/num+1-num

int a = (total*2/num+1-num)/2;

for(int i=0; i<num; i++){

answer[i] = a++;

}

return answer;

}

a는 연속하는 수 중 시작하는 숫자 

 

'Java > Coding Test' 카테고리의 다른 글

다항식 더하기 문제풀이  (0) 2023.09.17
OX 퀴즈 문제풀이  (0) 2023.09.17
안전지대 문제풀이  (0) 2023.09.17
겹치는 선분의 길이 문제풀이  (0) 2023.09.17
이진수 더하기 문제풀이  (0) 2023.09.17
728x90

이차배열이 주어질 때 1을 갖는 인덱스의 대각선, 상하좌우는 모두 위험지역이다

안전지대의 개수를 반환 

 

public int solution(int[][] board) {

int answer = 0;

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

for (int j = 0; j < board[i].length; j++) {

if(board[i][j]==1) {

if(j>0)board[i][j-1]=danger(board[i][j-1]);

if(j!=board.length-1)board[i][j+1]=danger(board[i][j+1]);

if(i>0&&j>0)board[i-1][j-1]=danger(board[i-1][j-1]);

if(i>0&&j!=board.length-1)board[i-1][j+1]=danger(board[i-1][j+1]);

if(j>0&&i!=board.length-1)board[i+1][j-1]=danger(board[i+1][j-1]);

if(j!=board.length-1&&i!=board.length-1)board[i+1][j+1]=danger(board[i+1][j+1]);

if(i!=board.length-1)board[i+1][j]=danger(board[i+1][j]);

if(i>0)board[i-1][j]=danger(board[i-1][j]);

}

}

}

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

for (int j = 0; j < board[i].length; j++) {

if(board[i][j]==0)answer++;

}

}

return answer;

}

public int danger(int x) {

if(x==1) return 1;

else return 2;

}

 

위험지역을 모두 1로 설정하면 다음 연산시 1을 폭탄지역으로 보아 연쇄적으로 위험지역으로 카운트 

> 폭탄이 없는 폭탄 주변의 위험지역은 2로 변경 후 안전지대 계산시 0을 카운트

 

문제는 모서리 부근에 폭탄이 있으면 인덱스 범위를 벗어나기 때문에 

위험지역을 설정할 때 상하좌우, 대각선이 범위 내인지 체크하거나 

 

주어진 배열보다 양옆, 위아래로 2씩 큰 배열을 만들고 count 할때는 주어진 배열만큼만 count 한다. 

 

public int solution2(int[][] board) {

int answer = 0;

int[][] boardEx = new int[board.length+2][board.length+2];

for (int i = 1; i <= board.length; i++) {

for (int j = 1; j <= board.length; j++) {

boardEx[i][j] = board[i-1][j-1];

}

}

for (int i = 1; i < boardEx.length; i++) {

for (int j = 1; j < boardEx[i].length; j++) {

if(boardEx[i][j]==1) {

boardEx[i][j-1]=danger(boardEx[i][j-1]);

boardEx[i][j+1]=danger(boardEx[i][j+1]);

boardEx[i-1][j-1]=danger(boardEx[i-1][j-1]);

boardEx[i-1][j+1]=danger(boardEx[i-1][j+1]);

boardEx[i+1][j-1]=danger(boardEx[i+1][j-1]);

boardEx[i+1][j+1]=danger(boardEx[i+1][j+1]);

boardEx[i+1][j]=danger(boardEx[i+1][j]);

boardEx[i-1][j]=danger(boardEx[i-1][j]);

}

}

}

for (int i = 1; i < boardEx.length-1; i++) {

for (int j = 1; j <boardEx[i].length-1; j++) {

if(boardEx[i][j]==0)answer++;

}

}

return answer;

}

'Java > Coding Test' 카테고리의 다른 글

OX 퀴즈 문제풀이  (0) 2023.09.17
연속된 수의 합 문제풀이  (0) 2023.09.17
겹치는 선분의 길이 문제풀이  (0) 2023.09.17
이진수 더하기 문제풀이  (0) 2023.09.17
한번만 등장한 문자 문제풀이  (0) 2023.09.17
728x90

주어진 세 선분의 두 선분 이상 겹치는 부분의 길이를 반환 

세 선분이 모두 겹쳐도 겹치는 부분은 한번만 반영된다. 

 

1번선분-2번선분

2번선분-3번선분

1번선분-3번선분 

이 겹치는 부분을 구하여 각각 겹치는 부분의 길이를 더한 후 

세 선분이 모두 겹치는 부분의 길이를 빼준다... 

 

public int solution(int[][] lines) {

int answer = 0;

List<HashSet<Integer>>lineList = new ArrayList<HashSet<Integer>>();

List<HashSet<Integer>>tempLineList = new ArrayList<HashSet<Integer>>();

for (int i = 0; i < lines.length; i++) {

HashSet<Integer> line = new HashSet<Integer>();

HashSet<Integer> tempLine = new HashSet<Integer>();

for (int j = lines[i][0]; j < lines[i][1]+1; j++) {

line.add(j);

tempLine.add(j);

}

lineList.add(line);

tempLineList.add(tempLine);

}

tempLineList.get(0).retainAll(lineList.get(1));

answer=(tempLineList.get(0).size()<2)?answer:answer+tempLineList.get(0).size()-1;

tempLineList.get(1).retainAll(lineList.get(2));

answer=(tempLineList.get(1).size()<2)?answer:answer+tempLineList.get(1).size()-1;

tempLineList.get(2).retainAll(lineList.get(0));

answer=(tempLineList.get(2).size()<2)?answer:answer+tempLineList.get(2).size()-1;

tempLineList.get(0).retainAll(tempLineList.get(1));

tempLineList.get(1).retainAll(tempLineList.get(2));

answer=(tempLineList.get(0).size()<2)?answer:answer-tempLineList.get(0).size()+1;

answer=(tempLineList.get(1).size()<2)?answer:answer-tempLineList.get(1).size()+1;

return answer;

}

lineList에 한 선분이 지나는 점을 가진 Set을 추가하고 추가한대로 1번 선분, 2번 선분, 3번 선분으로 부르기로한다. 

ArrayList가 아닌 Set을 사용한 이유는 중복을 허용하지 않는 Set의 retainAll 함수를 사용해 차집합을 구하기 위해서이다.

 

++집합 메서드

addAll() : 인자로 받은 set과의 합집합으로 변경 후 성공시 true 반환

retainAll() : 인자로 받은 set과의 교집합으로 변경 후 성공시 true 반환

removeAll() : 인자로 받은 set과의 차집합으로 변경 후 성공시 true 반환

containsAll() : 인자로 받은 set을 부분집합으로 가진다면 true 반환 

 

집합 메서드는 기존 집합을 인자로 받은 집합과 비교해 처리하고 기존 집합을 변경해주고 논리값을 반환해준다.

 

tempLineList를 만든 이유는 라인끼리 겹치는 부분을 비교할때마다 LineList가 변경되기 때문에 다음 비교때 문제가 생기기 때문이다.

tempLineList.get(0)에는 0번과 1번 선분이 겹치는 부분을 집합으로 가지고 

tempLineList.get(1)에는 1번과 2번 선분이 겹치는 부분을 집합으로 가지고 

tempLineList.get(2)에는 2번과 0번 선분이 겹치는 부분을 집합으로 갖는다. 

 

만약 집합이 원소를 하나만 갖는다면 한 점만 겹치고(만나고)  겹치는 부분의 길이를 갖지 못하기 때문에 

정답 answer를 계산할때 추가하면 안된다. 

그래서 size가 2이상일때만 answer 연산을 한다. 

 

세 선분이 겹치는 부분들 중 다시 겹치는 부분을 구할 때는 2번만 연산하면 되기 때문에 

겹치는 부분을 계산할때 기준 집합이 변형되도 상관없다. 

0번과 1번 선분이 겹치는 부분의 집합과 1번과 2번 선분이 겹치는 부분의 집합의 교집합 ,

1번과 2번 선분이 겹치는 부분의 집합과 2번과 0번 선분이 겹치는 부분의 집합의 교집합을 

구해 answer에서 빼준다. 

 

다른 사람의 풀이 중 map을 이용

public int solution2(int[][] lines) {

Map<Integer, Integer> map = new HashMap<>();

 

for (int i = 0; i < lines.length; i++) {

for (int j = lines[i]]0]; j < lines[i][1]; j++) {

map.put(j, map.getOrDefault(j, 0) + 1);

}

}

 

int answer = 0;

 

for (Map.Entry<Integer, Integer> entry : map.entrySet()) {

if (entry.getValue() >= 2) {

answer++;

}

}

 

return answer;

}

 map에 각 선분의 시작점부터 끝점까지 지나가는 점을 key로 하여 중복되는 개수를 구한다. 

만약 2번이상 중복되면 answer를 증가시킨다. 

하나의 키값을 갖는 점이 3번 중복되더라도 answer는 한번만 증가하기 때문에 계산이 쉽다. 

 

'Java > Coding Test' 카테고리의 다른 글

연속된 수의 합 문제풀이  (0) 2023.09.17
안전지대 문제풀이  (0) 2023.09.17
이진수 더하기 문제풀이  (0) 2023.09.17
한번만 등장한 문자 문제풀이  (0) 2023.09.17
등수 매기기 문제풀이  (0) 2023.09.15
728x90

주어진 2진수 문자열 2개를 더한 값을 2진수로 반환 

 

1. 2진수를 10진수로 변환하여 더한 후 2진수로 변환하여 반환

public String solution(String bin1, String bin2) {

String answer = "";

int sum=Integer.parseInt(bin1,2)+Integer.parseInt(bin2,2);

answer=Integer.toBinaryString(sum);

return answer;

}

Integer 클래스에서 문자열을 정수로 바꾸어주는 parseInt를 활용

parseInt("숫자문자열",2); 

두번째 파라메터는 변환할 진수를 나타낸다. 2진수로 변환하기 위해 2 입력

 

 Integer 클래스에 toBinaryString() 메서드는 10진수를 2진수로 변환 

 

++

toOctalString() 은 8진수로 

toHexaString() 은 16진수로 변환한다. 

'Java > Coding Test' 카테고리의 다른 글

안전지대 문제풀이  (0) 2023.09.17
겹치는 선분의 길이 문제풀이  (0) 2023.09.17
한번만 등장한 문자 문제풀이  (0) 2023.09.17
등수 매기기 문제풀이  (0) 2023.09.15
삼각형의 완성조건(2) 문제풀이  (0) 2023.09.15

+ Recent posts