
SWEA에서 낸 코딩 문제에 대한 해답이 들어있습니다.
열람 시 주의해주세요.
주석을 보고 있는데 너무 끔찍하다고 적어뒀다. 그만큼 많이 헤맨 문제. 헤맨 과정도 같이 적어두기로 한다. 사실 이 날(3일차)에 한 수업이 제일 어려웠다고 회고한다. 제일 쉬웠던 건 5일째의 회문. 내 단점이 바로 범위 관련한 설정인데 여기서 제대로 맞은듯.
[SW Expert Academy] 11315. 오목판정
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
문제에 대한 과정
헤맨 과정에 대해서 정확히 적을 예정이다. 처음에는 막연히 contains로 했다가 대각선이라는 걸 깨닫고 2차원 배열로 설계를 했다. 그리고 이후는 Sum 문제와 비슷하게 접근했는데,
https://bbbbabbbababababa.tistory.com/97
[코딩 테스트 RUN] SWEA 수업 : 1219. Sum
⚠️ 주의!SWEA에서 낸 코딩 문제에 대한 해답이 들어있습니다.열람 시 주의해주세요. [SW Expert Academy 1209. Sum] SW Expert AcademySW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세
bbbbabbbababababa.tistory.com
틀렸다. 이유는 바로 오목은 대각선 끝에서 시작하지 않아도 o 다섯개가 나올 수 있다는 지점. 그래서 파기한 설계를 공개한다.
for (int i = 0; i < N; i++) {
int doll = 0;
for (int j = 0; j < N; j++) {
if(arr[i][j] == 'o') {
doll++;
} else {
doll = 0;
}
if(doll >= 5) {
isWin = true;
break;
}
}
}
for(int j = 0; j < N && !isWin; j++){
int doll = 0;
for(int i = 0; i < N; i++){
if(arr[i][j] == 'o') {
doll++;
} else {
doll = 0;
}
if(doll >= 5) {
isWin = true;
break;
}
}
}
for(int i = 0; i < N && !isWin; i++){
int doll = 0;
for (int j = i; j < N; j++) {
if(arr[j][j] == 'o'){
doll++;
} else {
doll = 0;
}
if(doll >= 5) {
isWin = true;
break;
}
}
}
for(int i = 0; i < N && !isWin; i++){
if(arr[N - 1 - i][i] == 'o'){
doll++;
} else {
doll = 0;
}
if(doll >= 5) {
isWin = true;
break;
}
}
이렇게 내면 테스트 케이스 몇 건이 틀려서 틀린 처리가 된다. 일부러 노린 듯하다(심지어 샘플 테스트케이스에서는 통과한다.)
일단 중요한 지점은 5개 이상이 되었느냐를 체크해야한다는 것. 돌의 개수를 하나하나 세어 그것이 5개 이상이 되어야 한다. 따라서 카운팅을 할 정수형 변수 하나, 5개 이상이 되었느냐를 확인할 논리형 변수 하나를 가지고 있어야 한다.
그리고 기존에는 0에서 시작했는데, 이번 문제에서는 기준점이 되어야 할 시작점을 세로이 설정을 해야한다. 그걸 기준으로 점점 늘어나게 되는 것. 예를 들어 가로를 보자.
if(arr[r][c] != 'o') continue;
int count = 1;
int sr = r;
int sc = c + 1;
while(sc < N && arr[sr][sc] == 'o'){
count++;
sc++;
}
if(count >= 5) { //5이상이 되면 break;
isWin = true;
break;
}
while을 사용했다.(for문을 사용하는건 여기서 권장하지 않는다, 이번에는 조건 우선적이기 때문이다. 이런 체크들은 while문을 사용해야할 일이 많아진다.)
보다시피 sc를 늘리면서 count를 늘린다. sc는 N을 넘으면 안되기 때문에, 이런 조건을 만든다. 당연히 [sr][src] == 'o'여야 한다.(참고로 arr는 toCharArray를 사용하여 배열화했다).
이런식으로 세로의 경우는 sr을 늘려간다.
여기서 count의 기준점은 자기자신(돌)로 인해 1에서 시작해야한다. 만약에 자신이 o가 아닌 경우는 아예 모든 for문 처리를 스킵시킨다. 대각선의 경우 ↘↙ 두 경우가 있는데 ↙의 경우 끝점에서 시작된다는 점에도 유의하자.
이러한 가로-세로는 sum과 비슷하게 밖에 r과 c의 for문이 들어있다. 2중 for문과 4개의 while문 처리를 해야한다. 여기서 5개가 되면 중단하는 쪽이 좋으므로(아니면 for문이 계속됨), 위에서 말한 논리형 변수를 조건으로 걸고, break를 시키기로 했다.
써놓고 보니 정말 별 거 아닌 듯한 해답인데 정작 머리 앓았다…
정답
package SWEA.오목판정;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Solution {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
for(int test_case = 1; test_case <= T; test_case++) {
// 각 테스트 케이스 시작
int N = Integer.parseInt(br.readLine());
// 정수 N 받음
// arr 이중배열이어야했음 대각선까지봐야함..
char[][] arr = new char[N][N];
for (int i = 0; i < N; i++) {
String str = br.readLine();
arr[i] = str.toCharArray();
}
boolean isWin = false;
// 시작점
for (int r = 0; r < N && !isWin; r++) {
for (int c = 0; c < N && !isWin; c++) {
if(arr[r][c] != 'o') continue;
// 가로
int count = 1;
//시작점 sr sc 만듬
// 가로로 늘어나므로 sc만 늘리면 된다.
int sr = r;
int sc = c + 1;
while(sc < N && arr[sr][sc] == 'o'){
count++;
sc++;
}
if(count >= 5) { //5이상이 되면 break;
isWin = true;
break;
}
// 세로
count = 1;
sr = r + 1;
sc = c;
while(sr < N && arr[sr][sc] == 'o'){
count++;
sr++;
}
if(count >= 5) { //5이상이 되면 break;
isWin = true;
break;
}
// 대각선 ↘
count = 1;
sr = r + 1;
sc = c + 1;
while (sr < N && sc < N && arr[sr][sc] == 'o'){
count++;
sr++;
sc++;
}
if(count >= 5) { //5이상이 되면 break;
isWin = true;
break;
}
// 대각선 ↙
// sc는 c - 1임을 잊지말것(끝점에서 시작)
count = 1;
sr = r + 1;
sc = c - 1;
while (sr < N && sc >= 0 && arr[sr][sc] == 'o'){
count++;
sr++;
sc--;
}
if(count >= 5) { //5이상이 되면 break;
isWin = true;
break;
}
}
}
String check = isWin ? "YES" : "NO";
System.out.printf("#%d %s%n", test_case, check);
}
}
}'코테런 > SWEA(알고리즘 수업)' 카테고리의 다른 글
| [코딩 테스트 RUN] SWEA 수업 : 2001. 파리퇴치 (0) | 2026.03.03 |
|---|---|
| [코딩 테스트 RUN] SWEA 수업 : 5356. 의석이의 세로로 말해요 (0) | 2026.03.03 |
| [코딩 테스트 RUN] SWEA 수업 : 1954. 달팽이숫자 (0) | 2026.03.03 |
| [코딩 테스트 RUN] SWEA 수업 : 1219. Sum (0) | 2026.03.03 |
| [코딩 테스트 RUN] SWEA 수업 : 1210. Ladder 1 (0) | 2026.03.03 |