반복문은 코드들이 반복적으로 실행되도록 할 때 사용되며, 반복문의 종류로는 for문, while문, do-while문이 있다.
for문은 반복횟수를 알고 있을 때 주로 사용하고, while문은 조건에 따라 반복할 때 주로 사용한다.
for (반복자 선언 및 초기화; 조건식; 증감식) {
실행될 코드
}
조건식을 충족하는 동안 초기화식부터 시작해서 증감식의 규칙을 따라서 실행한다.
for (배열에서 꺼낸 항목을 저장할 변수 : 사용할 배열) {
실행 될 코드
}
배열에서 가져올 값이 있는지 확인 하고 만약 가져올 다음 항목이 없다면 자동적으로 종료
while문은 조건식이 true일 경우에 계속해서 반복
for문과 while문은 초기화, 증감식의 위치만 다를 뿐 상호 대체가 가능
(초기화);
while(조건식) {
실행될 코드; //조건식이 참인 동안 실행
증감식;
}
조건식에는 boolean 변수나 true / false 값을 산출하는 어떠한 연산식이든 넣을 수 있다. (but true를 입력하면 무한루프)
무한루프 케이스에서 while문 내부에 if문, 혹은 break를 넣어 탈출 지점을 만들 수 있다.
do {
(1)실행문 //처음 한 번은 무조건 실행
} while((2)조건식);{
실행될 코드;
}
for문, while문, do-while문, switch문을 실행 중지할 때 사용
break문은 대개 if문과 같이 사용
반복문이 중첩되어 있을 경우 break문은 가장 가까운 반복문만 종료
(바깥쪽 반복문에는 영향을 끼치지 않는다.)
for문, while문, do-while문에서만 사용
continue문이 실행되면 조건식으로 이동하여 작동
수를 입력받아 홀수인지 여부를 리턴하라.
나의풀이
public class Solution {
public boolean isOdd(int num) {
int i = 0;
boolean sum =true;
if(num<0) {
num = -num;
}
while(i <= num) {
sum = !sum;
i++;
}
return sum;
}
}
ans
public class Solution {
public boolean isOdd(int num) {
if(num < 0) {
num = -num;
}
while(num > 0) {
if(num == 1) {
//1에 도달한 경우 홀수이므로 true를 반환합니다.
return true;
}
num = num - 2;
}
//반복문을 모두 순회할때까지 true를 반환하지 않는 경우 (num == 0일 경우) 짝수이므로 false를 반환
return false;
}
}
9번
두 개의 수를 입력받아 두 수를 포함해 두 수 사이의 수 중 2의 배수의 개수를 리턴하라.
나의풀이
public class Solution {
public int makeMultiplesOfDigit2(int num1, int num2) {
int result = 0;
int a1 = Math.max(num1,num2);
int a2 = Math.min(num1,num2);
for (int i=a2; i <= a1; i++){
if(i%2 ==0){
result++;
}
}
if(a1==0 || a2==0){
result = result -1;
}
return result;
}
}
ans
public class Solution {
public int makeMultiplesOfDigit2(int num1, int num2) {
int count = 0;
int start = num1;
int end = num2;
if (num1 > num2) {
start = num2;
end = num1;
}
if (start == 0) {
start = 1;
}
for (int i = start; i <= end; i++) {
if (i % 2 == 0) {
count += 1;
}
}
return count;
}
}
12번
숫자 문자열을 입력받아 문자열을 구성하는 각 숫자 중 가장 큰 수를 나타내는 숫자를 리턴하라.
str.split
사용은 금지나의풀이
public class Solution {
public int getMaxNumberFromString(String str) {
int a = str.length();
int result = 0;
for (int i=0; i<a; i++){
if(result < (str.charAt(i)-'0')){
result = str.charAt(i)-'0';
}
}
return result;
}
}
str.charAt(i)
은 문자(char)형으로 값이 나오기 때문에 int형(위 풀이에서는 result)과 연산하기 위해서는 0
을 빼주고 계산하자.
ans
public class Solution {
public int getMaxNumberFromString(String str) {
int maxNum = 0;
int length = str.length();
for (int i = 0; i < length; i++) {
char character = str.charAt(i);
int num = Character.getNumericValue(character);
if (num > maxNum) {
maxNum = num;
}
}
return maxNum;
}
}
13번
문자열과 두 개의 문자(from, to)를 입력받아, 문자열에 등장하는 특정 문자(from)가 다른 문자(to)로 바뀐 문자열을 리턴하라.
나의 풀이
public class Solution {
public String replaceAll(String str, char from, char to) {
int a = str.length();
StringBuffer str1 = new StringBuffer(str);
for (int i=0; i<a; i++){
if(from == str.charAt(i)){
str1 = str1.deleteCharAt(i);
str1 = str1.insert(i,to);
}
}
String str2 = str1.toString();
return str2;
}
}
StringBuffer를 이용해 주어진 문자열 str으 특정 인덱스를 바꾸는 방식으로 풀었는데 답지는 새로운 문자열을 만들어 나가는 방식으로 풀었다.
ans
public class Solution {
public String replaceAll(String str, char from, char to) {
String result = "";
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == from) {
result = result + to;
} else {
result = result + str.charAt(i);
}
}
return result;
}
}
14
문자열을 입력받아 각 문자(letter) 뒤에 해당 문자의 인덱스가 추가된 문자열을 리턴하라.
나의 풀이
public class Solution {
public String characterAndNumber(String word) {
int a = word.length();
StringBuffer word1 = new StringBuffer(word);
for (int i=0; i<a; i++){
word1 = word1.insert(i*2+1,i); // i*2+1번 인덱스에 i를 추가
}
String str2 = word1.toString();
return str2;
}
}
13번과 마찬가지로 StringBuffer를 이용해 특정 인덱스에 값을 추가하는 방식으로 했다.
insert()
를 사용해 특정 인덱스에 특정값을 추가하면 추가한 위치에 있던 값이 자동으로 +1 인덱스 위치로 밀려나는 것을 확인할 수 있었다.
ex) "wish" 문자열에 insert(1,5)
해주면 "w5ish"가 된다.
ans
public class Solution {
public String characterAndNumber(String word) {
String result = "";
for (int i = 0; i < word.length(); i++) {
result = result + word.charAt(i) + i;
}
return result;
}
}
18번 (오답!!)
2 이상의 자연수를 입력받아 2부터 해당 수까지의 소수(prime number)들을 리턴하라.
public class Solution {
public String listPrimes(int num) {
String result = "2";
for(int i=3; i<=num; i+=2) {
boolean a = true;
for(int j=3; j<i; j+=2){
if(i%j==0) {
a = false;
break;
}
}
if(a==true) {
result = result+ "-" + i;
}
}
return result;
}
}
처음으로 못풀고 포기한 문제...
boolean타입을 이용할 생각을 못하고 이중포문 안에서 result = result+ "-" + i;
를 넣어려고 계속 시도하다 if문이 너무 많아지고 얽혀서 손으로 다 써보고 수정하고 하다가.. 시간이 너무 많이 지나 결국 답지를 봐버렸다.
19
문자열을 입력받아 해당 문자열에 등장하는 각 문자(letter)를 가지고 만들 수 있는 길이 2의 문자열들을 리턴하라.
나의 풀이
public class Solution {
public String makePermutations(String str) {
String result="" ;
for (int i=0; i<str.length(); i++) {
for (int j=0; j<(str.length()); j++) {
if(i==0&&j==0){ // 콤마로 return값을 시작하면 안되니 추가한거
result= str.substring(0,1) +str.substring(0,1);
}else{
result= result+ "," + str.substring(i,i+1) +str.substring(j,j+1);
}
}
}
return result;
}
}
콤마,
를 붙이는 위치를 나는 대입값 앞으로 지정했는데
풀이는 대입값 뒤로 지정해서 다른 형태가 되었다.
ans
public class Solution {
public String makePermutations(String str) {
String result = "";
if(str.isEmpty()) {
return "";
}
for (int left = 0; left < str.length(); left++) {
for (int right = 0; right < str.length(); right++) {
result = result + str.charAt(left) + str.charAt(right) + ",";
}
}
return result.substring(0, result.length() -1);
}
}
20번
문자열을 입력받아 해당 문자열에 중복된 문자(letter)가 존재하는지 여부를 리턴하라.
이 상태에서 한참 고민했다.
String 타입을 비교할 때는 equals 쓰자..
이상하게 for문 안에서 선언한 result는 for문 밖에서 사용할 수 없었다.
그래서 a를 추가했다.
나의 풀이
public class Solution {
public boolean hasRepeatedCharacter(String str) {
boolean result=false;
for (int i=0; i<str.length(); i++) {
for (int j=0; j<(str.length()); j++) {
if((str.substring(i,i+1)).equals(str.substring(j,j+1)) && i!=j){
result = true;
break;
}
}
if(result==true) {
break;
}
}
return result;
}
}
ans
public class Solution {
public boolean hasRepeatedCharacter(String str) {
for (int i = 0; i < str.length() - 1; i++) {
for (int j = i + 1; j < str.length(); j++) {
if (str.charAt(i) == str.charAt(j)) {
return true;
}
}
}
return false;
}
}
return
은 break
를 포함한다.
str.substring(i,i+1)).equals(str.substring(j,j+1)
문자열str의 i번째 인덱스와 j번째 인덱스가 같은지 비교
str.length()
문자열 길이
str.insert(i,j)
, StringBuffer
StringBuffer형 i번 인덱스에 j추가 (문자,문자열도 가능)
str1.deleteCharAt(i)
,StringBuffer
StringBuffer형 i번 인덱스 삭제
String str2 = str1.toString();
StringBuffer형 str1을 String형으로 변경 (StringBuffer형은 String형과 다른 취급을 받는 듯 하다. )
str.charAt(i)
str의 i번 인덱스값을 문자(char)로 출력
Math.max(num1,num2)
더 큰 값 찾기
Math.min(num1,num2)
더 작은 값 찾기
str.substring()
문자열 특정부분 잘라내기